学习一下深度学习中的keras包,keras包是深度学习里面一个比较好用的包,实现起来的代码量一直都是比较少的。所以现在就来实现一下简单的NN神经网络。以下代码皆是使用Cocalc上的jupyter nootbook编写。
先是做一个简单的数据集。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-2, 6, 200)#从-2到6之间取200个数据
np.random.shuffle(X)#现场修改序列,改变自身内容。(类似洗牌,打乱顺序)
Y = 0.5 * X + 2 + 0.15 * np.random.randn(200,)#加上噪音。
# plot data
plt.scatter(X, Y)#散点图绘制
plt.show()#展示
X_train, Y_train = X[:160], Y[:160] # 160个数据给训练集
X_test, Y_test = X[160:], Y[160:] #40个给test
进行神经网络的搭建
from keras.models import Sequential#使用的序贯模型
from keras.layers import Dense#全连接神经网络
model =Sequential()#模型定义
model.add(Dense(input_dim=1,units=1))#搭建全连接层,只有一层,输入和输出都只有一个结点
model.compile(loss='mse',optimizer='sgd')#模型的编译,损失函数为均方误差,优化器为梯度下降
cost=model.fit(X_train,Y_train,epochs=100,batch_size=64)#训练模型,获得它的损失,采用的是批量
#梯度下降算法,所以batch_size的意思就是批量的大小
print(cost)#输出
输出只截取其中第一与最后一行:
第一行
Epoch 1/100
64/160 [=>…] - ETA: 0s - loss: 32.6729
160/160 [==========] - 0s 656us/step - loss: 21.7859
最后一行
Epoch 56/100
64/160 [=>…] - ETA: 0s - loss: 0.0742
从中可以观察到Epoch是迭代次数,由此我们可以发现其实该输出只输出到了迭代的56次。其中的损失从一开始的32.6729到后面的0.0742.
这次损失是呈下降趋势。
其我们还是可以把上面的cost=model.fit(X_train,Y_train,epochs=100,batch_size=64)至下部分改为:
from keras.optimizers import SGD #从优化器包里导入梯度下降
model.compile(loss='mse', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))#损失还是均方误差,
但优化器这是自己构建的,其中的lr:大于0的浮点数,学习率,momentum:大于0的浮点数,动量参数,nesterov:布尔值,确定是否使用Nesterov动量
print("Trianing--------")
for i in range(100):#迭代100次
cost=model.train_on_batch(X_train,Y_train)#这里也是批量梯度下降,只是换了一种写法
if i % 20 ==0:
print('train cost',cost)#输出
输出如下:
Trianing--------
train cost 2.160784
train cost 0.027121592
train cost 0.044771977
train cost 0.022048993
train cost 0.022066286
不做过多解释!
进入模型的评价和预测时间:
print("\nTesting-------")
loss_and_metrics=model.evaluate(X_test,Y_test,batch_size=40)#得到测试集的损失
print("test cost",cost)#输出
W,b=model.layers[0].get_weights()#获得第一层的权重与偏差
print('Weights=',W,'\nbiases= ',b)#输出
输出如下:
Testing-------
40/40 [==============================] - 0s 79us/step
test cost 0.021458160132169724
Weights= [[0.5021417]]
biases= [1.9995089]
从以上输出能够看到测试集全部预测正确,其最终的损失很小,而这个Weights与biases都是模型训练过后的数值。
Y_pred=model.predict(X_test)#预测
plt.scatter(X_test,Y_test)#散点图
plt.plot(X_test,Y_pred)
plt.show()
输出如下: