我正在使用 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 的数据似乎是正确的,并且该模型基于我引用的教程中使用的模型(并且问题看起来非常相似,所以我希望如果一个可以工作,另一个也可以)。