【问题标题】:ReLU not learning to handle negative inputs Keras / TensorflowReLU 没有学习处理负输入 Keras / Tensorflow
【发布时间】:2017-09-08 07:51:45
【问题描述】:

我希望我的神经网络将负值转换为正值。理论上,这可以使用 ReLU 函数和 1 个节点来完成,该节点将输入权重学习为 -1(因此负输入乘以 -1 = 正输入。

它只是继续输出 0。下面的代码。我使用 -1 作为输入值,看看它是否可以学习至少一个输入。

我尝试添加更多层,但无济于事查看编辑,如果我添加更多,IT 会提供帮助

train_input = np.asarray([[-1]]*10000) # Input arr of -1s
train_output = np.asarray(map(lambda x: [abs(x[0])] , train_input))

# Define the model
model = Sequential()
model.add(Dense(1, input_dim=1, kernel_initializer='normal', activation='linear'))
model.add(LeakyReLU(alpha=.001))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

# Train and evaluate
model.fit(train_input, train_output, epochs=10, batch_size=10, verbose=0)
test_model_output = model.predict(test_input)
print str(test_input[0][0]) + " " + str(test_output[0][0]) + " " +  str(test_model_output[0][0])

我得到的输出如下(第一个值是输入,第二个是预期输出,第三个是模型输出)

-1 1 0.0

编辑 我尝试使用随机统一初始化器,以便它初始化负权重并且它可以工作。我明白为什么这会让网络更容易学习。但我不明白为什么它是必要的。

from keras.initializers import RandomUniform
model.add(Dense(1, input_dim=1, kernel_initializer=RandomUniform(minval=-0.05, maxval=0.05, seed=None), activation='linear'))

编辑 2 有人提到我没有足够的时间来训练数据。起初,我认为将数据增加 10 倍,将批次缩小 10 倍(更多迭代)会起作用。它没有 但是如果我添加了 10 倍以上的 epoch(总共 100 个),它确实有效。所以将正初始化权重转换为负只需要很长时间

【问题讨论】:

  • 也许你只是没有训练足够长的时间让体重从 1 变为 -1 ?通常在这里你有 (1000/100)*10=100 梯度迭代,如果学习率为 0.01(相当标准)你的权重只有时间达到 0
  • 这实际上可以解释为什么你得到 0.0,这不应该是泄漏 relU 和 weight=1 的情况
  • 我得到了相同的结果,有 10000 个数据集和 10 个 epoch 和 10 的批量大小。我更新了问题

标签: machine-learning tensorflow neural-network artificial-intelligence keras


【解决方案1】:

我会将第一个权重初始化为负数 keras.initializers.Constant(值=-1) https://keras.io/initializers/#constant

可能有助于激发第一个神经元。

【讨论】:

  • 尝试使用随机值初始化(我认为 -1 是作弊 :p),它可以将渐变推到 -1。
【解决方案2】:

我不熟悉您使用的库,但您似乎必须在 Dense 行中指定 input_shape

其中None 表示可能需要任何正整数

因此,如果您没有输入任何内容作为 input_shape,那么它假定您的输入将是任何正数。

所以添加input_shape=(-1,1) 可能会解决您的问题!

https://keras.io/getting-started/sequential-model-guide/

【讨论】:

  • 感谢您在这里发表评论,Thomas。尝试过但出现随机错误,我不确定 -1 是否是形状的有效输入(与 Tensorflow 不同)。问题在于它需要更多的训练才能从正梯度切换到负梯度
【解决方案3】:

我认为模型的结果是正确的。

因为​,整流线性单元的工作原理如下

f(x) = max(0,x) [x -> 神经元的输入]

在您的示例中,输入值为 -1。即 (x = -1)

f(x) = max(0,-1) => 这个等式的答案是零 ['0']

这可能是模型结果背后的原因

(或)

执行乘法时可能会出错。

【讨论】:

  • 如果通向第一个神经元的权重为负,则输入会大于0。使用​​ReLu解决上述问题的方法是输入权重为-1,输出权重为1,我相信.
  • 出于这个原因,我使用了 Leaky ReLU,所以如果输入负值,它会输出一个小的负值,仍然允许训练
【解决方案4】:

问题是我没有给它足够的时间来训练。虽然这是一个非常基本的功能,但初始化的权重必须从负到正。

增加完成的训练量(更多的时期、更小的批次、更多的训练数据)最终会导致梯度从正值翻转为负值。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 2017-03-02
    • 2021-09-26
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多