ИНС неправильно выстраивает синусоиду
Недавно начал изучать ИНС и решил сделать простую ИНС, которая умела бы предсказывать значение синуса при определённой радиане. Подготовил данные:
args_len = 200
input = np.random.uniform(0,2*np.pi, args_len).reshape(-1,1)
output = np.sin(input).reshape(-1,1)#np.random.uniform(-1,1,args_len).reshape(-1,1)
data = np.hstack((input, output) )
input_train_data, input_test_data, output_train_data, output_test_data = train_test_split(data[:,0], data[:,1], test_size=0.3)
input_train_data = input_train_data.reshape(-1,1)
input_test_data = input_test_data.reshape(-1,1)
output_test_data = output_test_data.reshape(-1,1)
output_train_data = output_train_data.reshape(-1,1)
fig = px.scatter(x=data[:,0], y=data[:,1], title="y=sin(rad)")
fig.show()
Построил ИНС на keras и обучил:
model = keras.Sequential()
model.add( Dense(units=1, activation="sigmoid", input_shape=(1,)) )
model.add( Dense(units=1, activation="sigmoid") )
model.add( Dense(units=1, activation="sigmoid") )
model.compile(loss="mean_squared_error", optimizer="Adamax")
model.fit(input_train_data, output_train_data, epochs=1500, batch_size=20)
result = model.evaluate(input_test_data, output_test_data,verbose=2)
result = model.evaluate(input_test_data, output_test_data, verbose=1)
print(result)
>>0.34740047256151835
Потом я пытаюсь предсказать тестовые данные:
predict_input = input_test_data
predict_output = model.predict(predict_input)
fig = px.scatter(x = predict_input.reshape(1,-1)[0], y = predict_output.reshape(1,-1)[0], title="y=sin(rad)")
fig.show()
Как видно выстраивается совсем не синусоида, скорее сигмоида. Почему так? Может я чего-то не понимаю?
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
В общем, нужно побольше размерность слоёв и линейную активацию на выходе:
n = 50
model = keras.Sequential()
model.add(keras.layers.Dense(units=n, activation="relu", input_shape=(1,)) )
model.add(keras.layers.Dense(units=n, activation="relu", input_shape=(n,)) )
model.add(keras.layers.Dense(units=1, activation="linear", input_shape=(n,)) )
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
model.fit(input_train_data, output_train_data, epochs=500, batch_size=32, verbose=0)
result = model.evaluate(input_test_data, output_test_data,verbose=2)
print(result)
[0.00045047128029788536, 0.014124496839940548]

