使用简单的 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。这是怎么回事?
我能想到的一些原因,
- 训练集太小
- 学习率高
- 最后一层应该只是一个线性层
- 对于某些运行,ReLU 单元正在消亡(请参阅死 ReLU 问题)并且您的网络权重在此之后不会改变,因此您会看到相同的损失值。
- 在这种情况下,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]]
我正在尝试使用使用 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。这是怎么回事?
我能想到的一些原因,
- 训练集太小
- 学习率高
- 最后一层应该只是一个线性层
- 对于某些运行,ReLU 单元正在消亡(请参阅死 ReLU 问题)并且您的网络权重在此之后不会改变,因此您会看到相同的损失值。
- 在这种情况下,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]]