今天,我们来对神经网络做一些升级,让它能计算两个数的加法,通过这次学习,我们可以初步理解Dense层的输入和输出。
首先,什么是Dense呢?它是一个全连接的网络层,就目前的水平而言,你把Dense当做一个黑盒就行,它的参数比较多,目前我们只用到了两个,用于定义输入输出的格式,第一个是输出的维度,第二个是输入的维度。
举两个例子
Dense(1,input_dim = 1))
定义了一个输入一维,输出也是一维的网络
Dense(2, input_dim=2)
定义了一个输入二维,输出也是二维的网络
如果我们想计算两个数的加法,应该怎么传参数呢?加法是把输入的两个数(加数和被加数),变成一个数(和),所以,输入是二维,输出是一维,定义如下
Dense(1, input_dim=2)
想让神经网络学会加法,必须传递数据合适的训练数据,我们把generateData修改一下,传递的数据变成两个数的加法
当然,预测的数据也要更新下,否则会提示数据格式不符
修改完毕的代码如下,代码位于
https://github.com/gongrennengzhi/nmt/blob/master/keras_dense.py
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import random
def generateData():
i = 1
X =[]
Y = []
while i < 1000:
t1 = random.randint(0,1000)
t2 = random.randint(0,1000)
X.append([t1, t2])
Y.append( t1 + t2)
i = i + 1
return np.array( X), np.array(Y)
model = Sequential()
model.add(Dense(1,input_dim = 2))
model.compile(loss='mean_absolute_error', optimizer ='adam')
model.summary()
X,Y=generateData()
model.fit(X[0:700],Y[0:700], epochs=500, batch_size=1)
scores= model.evaluate(x=X[70:],y=Y[70:])
print(scores)
t = np.array([[2020,4040]])
print(model.predict(t))
运行结果
[[6058.168]]
由于训练的次数不够多,略微有误差,还在可以接受的范围内
课后作业
1 修改代码,计算三个数的加法
2 查看model.fit的文档,把训练步数提上去,看看结果是否会有变化