python代码用于简单的神经网络求解c=a1-a2不工作



我是python和神经网络的新手,所以如果有任何帮助,我将不胜感激。试图弄清楚如何使这个简单的NN计算c=a1-a2,但不确定从哪里开始,因为不需要偏差项,如果a=[(1,0(,(0,0(,(0,1(],那么我如何为每个元组计算c?或者为张量找到权重?

training_data = np.array([[1,0],[0,0],[0,1]], "float32")
target_data = np.array([[1],[0],[-1]], "float32")
print("input : " + str(training_data))
print("output : " + str(target_data))
model = models.Sequential()
model.add(layers.core.Dense(16, input_dim=2, activation='relu'))
model.add(layers.core.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
model.fit(training_data, target_data, epochs=100)
scores = model.evaluate(training_data, target_data)
print("n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
print (model.predict(training_data).round())

这就是我所拥有的,但它的准确率(约33%(很低,不确定我错过了什么

此处有多个问题。

  1. 您使用的是sigmoid输出函数,但您的目标包括负数。您的模型无法工作,因为sigmoid将输出限制为[0,1]。一般来说,你必须考虑你的数据范围以及什么是合适的输出函数。这里,只需在输出层中使用no激活即可
  2. 精度对于回归任务来说毫无意义,因为它只会在精确相等的情况下计算匹配。准确性仅用于分类任务。因此,完全忽略准确性,只关注误差/损失的平方
  3. 你只是训练时间不够长。我增加到1000步
  4. 请注意,你的目标函数是线性的,所以你甚至不需要隐藏层(但在这里也没有坏处(

使用此代码:

training_data = np.array([[1,0],[0,0],[0,1]], "float32")
target_data = np.array([[1],[0],[-1]], "float32")
print("input : " + str(training_data))
print("output : " + str(target_data))
model = models.Sequential()
model.add(layers.Dense(16, input_dim=2, activation='relu'))
model.add(layers.Dense(1))
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
model.fit(training_data, target_data, epochs=1000)
scores = model.evaluate(training_data, target_data)
print("n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
print (model.predict(training_data))

我得到输出[[ 1.0008523 ], [-0.00198349], [-0.99906766]]

注意,对你的问题的评论是不正确的,你应该期望神经网络在小的训练集上表现得很好——如果不是,那么你的模型和/或训练过程可能有问题。

最新更新