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

#python #tensorflow #non-linear-regression

Вопрос:

Я пытаюсь подогнать простую нейронную сеть под простую функцию с помощью потока тензоров, я знаю, что структура и параметры, которые я использую, работают так, как я достиг этого в MatLab, но мне нужно перенести это на другой язык (в настоящее время Python, но позже c ). Поэтому я пытаюсь найти хорошую библиотеку нейронных сетей, я думал, что это будет TensorFlow, но она оказалась очень привередливой. Вот важные части кода

 import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
import matplotlib.pyplot as plt

f1 = lambda x: ((x < .5) * np.power(x, 2)   (x > .5) * x) * 2 -1
x = np.linspace(-1, 1, 180).reshape(-1,1)
y = f1(x).reshape(-1, 1)
model = keras.models.Sequential()
model.add(layers.Dense(100, activation=tf.keras.activations.sigmoid, input_shape=(1,)))
model.add(layers.Dense(1, activation=tf.keras.activations.linear))
model.compile(loss=tf.keras.losses.mean_squared_error, optimizer=tf.keras.optimizers.SGD(0.001), metrics=[tf.keras.losses.mean_squared_error])
model.fit(x, y, batch_size=1, epochs=3)
xtest = np.linspace(-1, 1, 100).reshape(-1, 1)
ytest = model.predict(xtest)

plt.scatter(x, y)
plt.plot(xtest, ytest)
plt.show()
 

Это происходит при построении ожидаемого графика и прогнозов, в результате
чего получается этот график, где точки являются ожидаемой функцией, а сплошная линия-прогнозом
Я не уверен, что делаю что-то не так.

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

Комментарии:

1. Не могли бы вы показать свое рабочее решение Matlab для сравнения?

Ответ №1:

Вы можете попробовать изменить активацию и увеличить время обучения, я изменил оптимизатор на Adam , увеличил время обучения до 30 и получил этот результат.
изображение результата

Код :

 import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
import matplotlib.pyplot as plt

f1 = lambda x: ((x < .5) * np.power(x, 2)   (x > .5) * x) * 2 -1
x = np.linspace(-1, 1, 180).reshape(-1,1)
y = f1(x).reshape(-1, 1)
model = keras.models.Sequential()
model.add(layers.Dense(100, activation=tf.keras.activations.sigmoid, input_shape=(1,)))
model.add(layers.Dense(1, activation=tf.keras.activations.linear))
model.compile(loss=tf.keras.losses.mean_squared_error, 
              optimizer=tf.keras.optimizers.Adam(0.01), 
              metrics=[tf.keras.losses.mean_squared_error])
model.fit(x, y, batch_size=1, epochs=30)
xtest = np.linspace(-1, 1, 100).reshape(-1, 1)
ytest = model.predict(xtest)

plt.scatter(x, y)
plt.plot(xtest, ytest)
plt.show()
 

Комментарии:

1. Мне нужно использовать сигмоид, релу не будет работать для того, что мне нужно сделать с моделью после тренировки. Я знал, что использование сигмоиды и обучение с использованием 3 эпох (обратное распространение l-m) работает в matlab, я просто не понимаю, почему модель остается линейной.

2. Если я правильно понял, обратное распространение l-m обновляет веса по-разному по сравнению с обратным распространением в tensorflow, которое я нашел здесь . Я обнаружил, что использование адама с сигмоидом отлично работает. Я обновляю результаты в ответе.