【发布时间】:2017-10-14 13:38:46
【问题描述】:
我想使用 Keras 来训练神经网络进行二维回归。
我的输入是一个数字,我的输出有两个数字:
model = Sequential()
model.add(Dense(16, input_shape=(1,), kernel_initializer=initializers.constant(0.0), bias_initializer=initializers.constant(0.0)))
model.add(Activation('relu'))
model.add(Dense(16, input_shape=(1,), kernel_initializer=initializers.constant(0.0), bias_initializer=initializers.constant(0.0)))
model.add(Activation('relu'))
model.add(Dense(2, kernel_initializer=initializers.constant(0.0), bias_initializer=initializers.constant(0.0)))
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
然后我创建了一些用于训练的虚拟数据:
inputs = np.zeros((10, 1), dtype=np.float32)
targets = np.zeros((10, 2), dtype=np.float32)
for i in range(10):
inputs[i] = i / 10.0
targets[i, 0] = 0.1
targets[i, 1] = 0.01 * i
最后,我在循环中使用小批量进行训练,同时对训练数据进行测试:
while True:
loss = model.train_on_batch(inputs, targets)
test_outputs = model.predict(inputs)
print test_outputs
问题是,打印出来的输出如下:
[0.1, 0.045]
[0.1, 0.045]
[0.1, 0.045]
.....
.....
.....
因此,虽然第一个维度是正确的 (0.1),但第二个维度是不正确的。第二个维度应该是 [0.01, 0.02, 0.03, .....]。所以实际上,网络的输出 (0.45) 只是第二维中所有值的平均值。
我做错了什么?
【问题讨论】:
-
你可能训练得太少了。通常,您需要数千个样本才能正确训练网络。
-
标准化你的输出或使用一些激活函数是一个很好的主意,因为你期望的结果非常小,而你的层使用“relu”,最后一个根本不使用激活.
-
你只训练了一个 epoch/batch,这是行不通的。你应该训练直到损失收敛到一个较低的值。
-
感谢这些 cmets。我确实训练了多个时期的损失收敛,所以我不认为这些问题是导致结果的原因。这是一个学习起来非常简单的函数,训练数据中没有噪音,因此不需要那么多的训练数据。我如何设置多维回归损失似乎更为基础。有什么想法......?
-
@Karnivaurus 没有证据表明您在问题中刚刚提到的任何内容,请提供此类信息,例如收敛到什么损失值,验证损失是多少等。您对需要多少数据的假设显然是错误的,在这种情况下,模型中的参数比数据中的样本多。
标签: tensorflow deep-learning keras theano