【发布时间】: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