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

时间:2017-04-12 13:34:27

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

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

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

我尝试添加更多图层,但它没有帮助看到编辑,如果我添加更多,IT DID帮助

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倍以上的纪录(总共100个)它确实有效。因此,将正初始化权重转换为负数

需要很长时间

4 个答案:

答案 0 :(得分:2)

我会初步确定第一个重量为负值 keras.initializers.Constant(值= -1) https://keras.io/initializers/#constant

可能有助于让第一个神经元射击。

答案 1 :(得分:1)

我不熟悉您正在使用的库,但您似乎必须在input_shape行中对Dense进行说明。

  

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

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

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

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

答案 2 :(得分:1)

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

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

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

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

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

这可能是你的模特背后的原因'结果

(或)

可能会在执行乘法时发生错误。

答案 3 :(得分:0)

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

增加训练量(更多的纪元,更小的批次,更多的训练数据)最终导致渐变从正变为负。