我在pythonv2.7(Tensorflow后端)中使用kerasv2.0.8来创建计算简单算术函数(加法、减法、乘法等)的小型神经网络,但我有点困惑。下面的代码是我的网络,它生成带有相应标签的整数的随机训练数据集(两个输入相加):def create_data(low, high, examples):
train_data = []
label_data = []
a = np.random.randint(low=low, high=high, size=examples, dtype='int')
b = np.random.randint(low=low, high=high, size=examples, dtype='int')
for i in range(0, examples):
train_data.append([a[i], b[i]])
label_data.append((a[i] + b[i]))
train_data = np.array(train_data)
label_data = np.array(label_data)
return train_data, label_data
X, y = create_data(0, 500, 10000)
model = Sequential()
model.add(Dense(3, input_dim=2))
model.add(Dense(5, activation='relu'))
model.add(Dense(3, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(1, activation='relu'))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
model.fit(X, y, epochs=10, batch_size=10)
test_data, _ = create_data(0, 500, 10)
results = model.predict(test_data, batch_size=2)
sq_error = []
for i in range(0, len(test_data)):
print 'test value:', test_data[i], 'result:', results[i][0], 'error:',\
'%.2f' %(results[i][0] - (test_data[i][0] + test_data[i][1]))
sq_error.append((results[i][0] - (test_data[i][0] + test_data[i][1])))
print '\n total rmse error: ', sqrt(np.sum(np.array(sq_error)))
这种训练非常好,不会产生意想不到的结果。然而,当我通过将两个输入相乘来创建训练数据时,每个历元的模型损失保持在700000000左右,并且模型根本不收敛。其数据创建功能如下:
^{pr2}$
当我训练一个输入整数的数据并通过对输入数据进行平方来创建标签时,我也遇到了同样的问题。但是,当我只将单个输入乘以一个常量或加/减一个常量时,它工作得很好。在
我有两个问题:
1)为什么会这样?我想这和神经网络的基本原理有关,但我无法解决。在
2)我如何调整此代码来训练一个将两个输入数字相乘的模型。在
网络架构(2-3-5-3-5-1)现在是相当随机的。我试过很多不同层次和不同神经元的方法,这一个刚好出现在我写这篇文章的屏幕上,它的两个输入相加的准确率为100%。在