【问题标题】:Multi-dimensional regression with Keras使用 Keras 进行多维回归
【发布时间】: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


【解决方案1】:

问题是,您将所有权重都初始化为零。问题是,如果所有权重都相同,那么所有梯度都是相同的。所以就好像你有一个网络,每一层都有一个神经元。删除它,以便使用默认的随机初始化并且它可以工作:

model = Sequential()
model.add(Dense(16, input_shape=(1,)))
model.add(Activation('relu'))
model.add(Dense(16, input_shape=(1,)))
model.add(Activation('relu'))
model.add(Dense(2))
model.compile(loss='mean_squared_error', optimizer='Adam')

1000 epochs 后的结果:

Epoch 1000/1000
10/10 [==============================] - 0s - loss: 5.2522e-08

In [59]: test_outputs
Out[59]:
array([[ 0.09983768,  0.00040025],
       [ 0.09986718,  0.010469  ],
       [ 0.09985521,  0.02051429],
       [ 0.09984323,  0.03055958],
       [ 0.09983127,  0.04060487],
       [ 0.09995781,  0.05083206],
       [ 0.09995599,  0.06089856],
       [ 0.09995417,  0.07096504],
       [ 0.09995237,  0.08103154],
       [ 0.09995055,  0.09109804]], dtype=float32)

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2018-06-18
    • 2020-05-20
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多