Вопрос или проблема
Я пытаюсь создать простую нейронную сеть с одной зависимой и одной независимой переменной. Могли бы вы дать мне руководство или помочь с реализацией нейронной сети с одной зависимой и одной независимой переменной? Пока у меня есть следующий код, но мои предсказания не очень хорошие, хотя ошибка минимизирована. Стоит ли масштабировать X и Y, или у меня есть какая-то ошибка?
Заранее спасибо
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
x=[(i*i)+0.2 for i in range(1000)]
y=[i for i in range(1000)]
x_train=np.reshape(x,(-1,1))
y_train=np.reshape(y,(-1,1))
x_test=x_train[:,-10:]
y_test=y_train[:,-10:]
plt.scatter(x_train,y_train)
plt.show()
X=tf.placeholder(tf.float32,[None,1])
Y=tf.placeholder(tf.float32,[None,1])
n_inputs=1
n_hidden_1=20
n_hidden_2=20
n_outputs=1
weights={
"h1": tf.Variable(tf.random_normal([n_inputs,n_hidden_1])),
"h2": tf.Variable(tf.random_normal([n_hidden_1,n_hidden_2])),
"out": tf.Variable(tf.random_normal([n_hidden_2,n_outputs]))
}
biases={
"b1": tf.Variable(tf.random_normal([n_hidden_1])),
"b2": tf.Variable(tf.random_normal([n_hidden_2])),
"out": tf.Variable(tf.random_normal([n_outputs]))
}
def neural_net(x):
layer_1=tf.add(tf.matmul(x,weights["h1"]),biases["b1"])
layer_1=tf.nn.relu(layer_1)
layer_2=tf.add(tf.matmul(layer_1,weights["h2"]),biases["b2"])
layer_2=tf.nn.relu(layer_2)
layer_3=tf.matmul(layer_2,weights["out"])+biases["out"]
return layer_3
Y_pred=neural_net(X)
loss=tf.losses.mean_squared_error(X,Y_pred)
optimizer=tf.train.AdamOptimizer(learning_rate=0.01)
train_op=optimizer.minimize(loss)
epochs=1000
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(epochs):
sess.run(train_op,feed_dict={X:x_train,Y:y_train})
loss_op=sess.run(loss,feed_dict={X:x_train,Y:y_train})
if i%10==0:
print("Epoch "+str(i)+" loss "+str(loss_op))
pred=sess.run(Y_pred,feed_dict={X:x_test})
plt.plot(pred,color="red")
plt.plot(y_test,color="blue")
plt.show()
plt.scatter(pred,y_test)
plt.show()
for i in range(len(pred)):
print(str(pred[i])+" "+str(y_test[i]))
Ваши предсказания на самом деле не такие уж плохие. На самой последней строке вашего кода напечатайте ожидаемое значение тоже на каждой строке (то есть x_test[i] = y_test[i]^2+0.2).
.
Ответ или решение
Создание нейронной сети для регрессии с одной зависимой и одной независимой переменной – это задача, которая требует тщательного подхода и настройки параметров модели. Давайте разберем вашу реализацию и определим, какие шаги могут улучшить качество предсказаний.
Анализ проблемы
-
Данные и их подготовка: Ваши данные содержат зависимую переменную
y
и независимую переменнуюx
, гдеx
рассчитывается по формуле(i*i) + 0.2
. Оба набора данных преобразуются в формат, пригодный для обработки в нейронной сети. -
Модель нейронной сети: Ваша сеть имеет два скрытых слоя, по 20 нейронов каждый, и один выходной слой. Это архитектура, способная обрабатывать нелинейные зависимости, но иногда может быть велика для такой простой задачи.
-
Процесс обучения: Вы используете
AdamOptimizer
с функцией потерь средней квадратичной ошибки.
Рекомендации по улучшению
1. Масштабирование данных
Обучение нейронной сети на данных, которые не нормализованы или не стандартизированы, может привести к неэффективному обучению. Попробуйте масштабировать x
и y
:
from sklearn.preprocessing import MinMaxScaler
scaler_x = MinMaxScaler()
scaler_y = MinMaxScaler()
x_train = scaler_x.fit_transform(np.reshape(x, (-1, 1)))
y_train = scaler_y.fit_transform(np.reshape(y, (-1, 1)))
x_test = x_train[-10:]
y_test = y_train[-10:]
2. Корректировка модели
Иногда более простая архитектура может дать лучшие результаты. Попробуйте уменьшить количество нейронов или слоев:
n_hidden_1 = 10
n_hidden_2 = 8
3. Переход на TensorFlow 2.x
Ваш код использует TensorFlow 1.x, который устарел. Версия 2.x упрощает процесс создания нейронных сетей:
import tensorflow as tf
from tensorflow.keras import layers, models, optimizers
model = models.Sequential()
model.add(layers.Dense(10, activation='relu', input_shape=(1,)))
model.add(layers.Dense(8, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer=optimizers.Adam(learning_rate=0.01), loss='mean_squared_error')
model.fit(x_train, y_train, epochs=1000)
4. Визуализация результатов
Убедитесь, что вы сравниваете предсказания модели после обратного преобразования нормализации. Это можно сделать следующим образом:
pred = model.predict(x_test)
pred = scaler_y.inverse_transform(pred)
plt.plot(pred, color="red", label="Predicted")
plt.plot(scaler_y.inverse_transform(y_test), color="blue", label="Actual")
plt.legend()
plt.show()
Заключение
Тщательная предобработка данных и выбор подходящей архитектуры сети могут существенно улучшить точность модели. Также важно адаптироваться к современным инструментам и библиотекам, что облегчит процесс разработки и улучшит результаты. Надеюсь, эти рекомендации помогут вам добиться лучших предсказаний.