使用简单的 TensorFlow 模型获得糟糕的性能

Getting bad performance with a simple TensorFlow model

我正在尝试使用使用 keras 构建的简单 TensorFlow 模型进行试验,但我无法弄清楚为什么我会得到如此糟糕的预测。这是模型:

x_train = np.asarray([[.5], [1.0], [.4], [5], [25]])
y_train = np.asarray([.25, .5, .2, 2.5, 12.5])

opt = keras.optimizers.Adam(lr=0.01)

model = Sequential()
model.add(Dense(1, activation="relu", input_shape=(x_train.shape[1:])))
model.add(Dense(9, activation="relu"))
model.add(Dense(1, activation="relu"))

model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mean_squared_error'])
model.fit(x_train, y_train, shuffle=True, epochs=10)

print(model.predict(np.asarray([[5]])))

如您所见,它应该学会将输入除以二。然而,损失是 32.5705,并且在几个 epoch 之后,它拒绝改变任何东西(即使我做了 100 个 epoch 之类的疯狂事情,它总是那个损失)。有什么你可以看到我在这里做错了吗?任何值的预测似乎都是 0..

它似乎也运行经常在按预期执行和上述奇怪行为之间切换。我重新 运行 它并在 200 个纪元后得到了 0.0019 的损失,但是如果我在一秒钟后使用所有相同的参数重新 运行 它,损失会像以前一样保持在 30。这是怎么回事?

我能想到的一些原因,

  1. 训练集太小
  2. 学习率高
  3. 最后一层应该只是一个线性层
  4. 对于某些运行,ReLU 单元正在消亡(请参阅死 ReLU 问题)并且您的网络权重在此之后不会改变,因此您会看到相同的损失值。
  5. 在这种情况下,tanh 激活可能会为优化提供更好的条件

我根据我的评论对您的代码进行了一些更改,并获得了不错的结果。

import keras
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation

x_train = np.random.random((50000, 1))#np.asarray([[.5], [1.0], [.4], [5], [25]])

y_train = x_train /2. #TODO: add small amount of noise to y #np.asarray([.25, .5, .2, 2.5, 12.5])

opt = keras.optimizers.Adam(lr=0.0005, clipvalue=0.5)

model = Sequential()
model.add(Dense(1, activation="tanh", input_shape=x_train.shape[1:]))
model.add(Dense(9, activation="tanh"))
model.add(Dense(1, activation=None))

model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mean_squared_error'])
model.fit(x_train, y_train, shuffle=True, epochs=10)

print(model.predict(np.asarray([.4322])))

输出:

[[0.21410337]]