在 keras 中创建一个神经网络来将两个输入整数相乘

D.G*_*ths 6 python machine-learning neural-network keras tensorflow

我正在使用 Python v2.7(Tensorflow 后端)中的 Keras v2.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)))
Run Code Online (Sandbox Code Playgroud)

这可以很好地训练并且不会产生意外的结果。但是,当我通过将两个输入相乘来创建训练数据时,每个时期的模型损失保持在 7,000,000,000 左右,并且模型根本不收敛。为此,数据创建函数如下:

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 
Run Code Online (Sandbox Code Playgroud)

当我拥有单个输入整数的训练数据并通过对输入数据进行平方来创建标签时,我也遇到了同样的问题。但是,当我只将单个输入乘以一个常数值或加上/减去一个常数时,它工作得很好。

我有两个问题:

1)为什么会这样?我认为它与神经网络的基础知识有关,但我无法解决。

2)我如何调整此代码以训练将两个输入数字相乘的模型。

网络架构 (2 - 3 - 5 - 3 - 5 - 1) 现在相当随机。我尝试了许多不同的层和神经元,当我写这篇文章时,这个恰好出现在我的屏幕上,并且添加两个输入的准确度为 100%。