简单的TensorFlow模型会导致性能下降

时间:2019-06-04 22:35:59

标签: tensorflow keras mathematical-optimization

我正在尝试使用由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,在几个时期内,它拒绝更改任何内容(即使我像100个时期那样疯狂地做,也总是那次损失)。您能看到我在这里做错什么吗?似乎任何值的预测都是0.

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

1 个答案:

答案 0 :(得分:1)

我能想到的一些原因

  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]]