为什么我的基于神经网络的计算器不起作用?

人工智能 神经网络 张量流
2021-11-08 09:14:43

我正在使用 Tensorflow 中的神经网络,我想一个有趣的测试是我是否可以使用 Tensorflow 神经网络编写计算器。

我从简单的加法开始,它有点工作(所以给定 2、4 它将得到大约 5.9 或 6.1)。

然后我想添加使用“+”、“-”和“*”计算的能力。

这是我最后想出的代码:

import numpy as np
import tensorflow as tf
from random import randrange

def generate_input(size):
    nn_input = []
    for i in range(0,size):
        symbol = float(randrange(3))
        nn_input.append([
                float(randrange(1000)),
                float(randrange(1000)),
                1 if symbol == 0 else 0,
                1 if symbol == 1 else 0,
                1 if symbol == 2 else 0,
                ])
    return nn_input

def generate_output(input_data):
    return [[generate_single_output(i)] for i in input_data]

def generate_single_output(input_data):
    plus = input_data[2]
    minus = input_data[3]
    multiplication = input_data[4]

    if (plus):
        return input_data[0] + input_data[1]

    if (minus):
        return input_data[0] - input_data[1]

    if (multiplication):
        return input_data[0] * input_data[1]

def user_input_to_nn_input(user_input):
    symbol = user_input[1]
    return np.array([[
            float(user_input[0]),
            float(user_input[2]),
            1 if symbol == '+' else 0,
            1 if symbol == '-' else 0,
            1 if symbol == '*' else 0,
            ]])


if __name__ == '__main__':
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(64, activation='relu', input_shape=(5,)),
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dense(1),
        ])

    model.compile(tf.keras.optimizers.RMSprop(0.001), loss=tf.keras.losses.MeanSquaredError())


    input_data = np.array(generate_input(10000))
    output_data = np.array(generate_output(input_data))

    model.fit(input_data, output_data, epochs=20)

    while True:
        user_calculation = input("Enter expression (e.g. 2 + 3):")
        user_input = user_calculation.split()
        nn_input = user_input_to_nn_input(user_input)
        print(model.predict(nn_input)[0][0])

这个想法建立在本教程之上:https ://www.tensorflow.org/tutorials/keras/basic_regression

输入是 5 个字段:数字 1、数字 2、加号?、减号?、乘法?

最后 3 个只是 1 或 0 取决于这是否是我想要做的计算。

作为说 [1,4,1,0,0] 的输出,我期望 [1,4,0​​,1,0] 的 1 + 4 = 5 我期望 1 - 4 = -3 等。

出于某种原因,尽管我得到的数字完全不正确,而且似乎是随机的。

基本上我想了解我出了什么问题?输入到 NN 的数据似乎是正确的,并且该模型基于我引用的教程中使用的模型(并且问题看起来非常相似,所以我希望如果一个可以工作,另一个也可以)。

1个回答

由于神经元的设置方式,神经网络不擅长根据这 3 个输入参数选择函数。

您应该做的是为每个操作制作一个神经网络,或者为每个操作使用不同的输入神经元。例如,2 个输入神经元用于加法运算,2 个用于乘法运算,2 个用于减法运算。总共 6 个输入,其中 4 个始终为 0。

这将使神经网络更容易计算结果。