ReLU 没有学习处理负输入 Keras / Tensorflow

ReLU not learning to handle negative inputs Keras / Tensorflow

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

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

我尝试添加更多层,但没有帮助查看编辑,如果我添加更多层,它确实有帮助

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 个)它确实有效。所以将正初始化权重转换为负

只需要很长时间

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

where None indicates that any positive integer may be expected

因此,如果您没有输入 input_shape,那么它会假设您的输入是任何正数。

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

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

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

可能有助于启动第一个神经元。

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

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

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

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

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

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

(或)

可能是乘法运算出错

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

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