小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
神经网络可以用来模拟回归问题 (regression),实质上是单输入单输出神经网络模型。
一、导入相关模块
1、numpy :用于生成训练数据
2、pyplot :用于绘制散点图,直观显示拟合结果
3、Sequential:顺序模型(通过堆叠多层,构建深度神经网络)
4、Dense:全连接神经层
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
二、生成数据
生成500个随机数据,并为其添加随机噪声,再生成随机数据散点图
# 使用numpy生成500个随机点
x_data = np.random.rand(500)
# 添加噪声
noise = np.random.normal(0,0.01,x_data.shape)
y_data = x_data*0.1 + 0.2 + noise
#散点图
plt.scatter(x_data,y_data)
plt.show()
三、建立模型
使用 Sequential 建立 model,再用 model.add 添加神经层,添加的是 Dense 全连接神经层。 Dense 全连接神经层参数有两个,一个是输入数据的维度,另一个units代表神经元数,即输出单元数。如果需要添加下一个神经层的时候,不用再定义输入的纬度,因为它默认就把前一层的输出作为当前层的输入。再使用model.compile来设置loss函数和优化器,误差函数用的是 mse均方误差;优化器用的是 sgd 随机梯度下降法。
# 构建神经网络模型
model = Sequential()
# 在模型中添加全连接层
model.add(Dense(units=1,input_dim=1))
# 选定loss函数和优化器
# mse :Mean Squared Error,均方误差
# sgd:Stochastic gradient descent,随机梯度下降法
model.compile(loss='mse', optimizer='sgd')
四、训练模型
训练时用 model.train_on_batch 一批一批的训练 x_data, y_data。默认的返回值是 cost,每500步输出一下结果。最后打印出训练后的权值和偏置值
#训练过程
print('Training -----------')
#训练5001个批次
forstepinrange(5001):
cost = model.train_on_batch(x_data, y_data)
ifstep % 500 == 0:
print("After %d trainings, the cost: %f"% (step, cost))
#打印权值和偏置值
W, b = model.layers[0].get_weights()
print('Weights=', W,'\nbiases=', b)
五、可视化训练结果
最后绘制出出预测结果,与训练集的值进行对比。
# 将训练结果绘出
# 预测值y_pred
Y_pred = model.predict(x_data)
# 随机点的散点图
plt.scatter(x_data, y_data)
# 显示预测结果
plt.plot(x_data, Y_pred,'r',lw = 3)
plt.show()