Нейронная сеть для регрессии с одной зависимой и одной независимой переменной

Вопрос или проблема

Я пытаюсь создать простую нейронную сеть с одной зависимой и одной независимой переменной. Могли бы вы дать мне руководство или помочь с реализацией нейронной сети с одной зависимой и одной независимой переменной? Пока у меня есть следующий код, но мои предсказания не очень хорошие, хотя ошибка минимизирована. Стоит ли масштабировать 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).

.

Ответ или решение

Создание нейронной сети для регрессии с одной зависимой и одной независимой переменной – это задача, которая требует тщательного подхода и настройки параметров модели. Давайте разберем вашу реализацию и определим, какие шаги могут улучшить качество предсказаний.

Анализ проблемы

  1. Данные и их подготовка: Ваши данные содержат зависимую переменную y и независимую переменную x, где x рассчитывается по формуле (i*i) + 0.2. Оба набора данных преобразуются в формат, пригодный для обработки в нейронной сети.

  2. Модель нейронной сети: Ваша сеть имеет два скрытых слоя, по 20 нейронов каждый, и один выходной слой. Это архитектура, способная обрабатывать нелинейные зависимости, но иногда может быть велика для такой простой задачи.

  3. Процесс обучения: Вы используете 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()

Заключение

Тщательная предобработка данных и выбор подходящей архитектуры сети могут существенно улучшить точность модели. Также важно адаптироваться к современным инструментам и библиотекам, что облегчит процесс разработки и улучшит результаты. Надеюсь, эти рекомендации помогут вам добиться лучших предсказаний.

Оцените материал
Добавить комментарий

Капча загружается...