TensorFlow:基于Keras构建网络模型——回归任务

本节任务

基于往日气温搭建神经网络,划分训练集与验证集,用训练集进行神经网络训练,用验证集验证神经网络的好坏(即判断验证集中的气温预测结果与实际结果的差距)。

注:这是一个回归任务,即根据往日数据来推测当天的气温。

一些常见的参数

  • activation:激活函数的选择,一般用relu
  • kernel_initializer,bias_initializer:权重与偏置参数的初始化方法,有时网络不收敛的话,换种初始化就能解决;
  • kernel_regularizer,bias_regularizer:是否正则化;
  • inputs:输入,可以自己指定,也可以让网络自动选;
  • units:神经元个数。

1、按顺序构造网络模型

假设构造一个中间层有2层的神经网络模型(最简单的Wx+b的顺序神经网络),那么整个网络模型的运行流程就是:

输入

中间层1(16个神经元)

中间层2(32个神经元)

输出(1个得分)

 

①定义层次和每层神经元个数

写代码时,先按照以下写法写模型的样式:

model=tf.keras.Sequential() #说明这是一个顺序神经网络
model.add(layers.Dense(16))#隐含层1 神经元个数,Dense是全连接层的意思
model.add(layers.Dense(32))#隐含层2
model.add(layers.Dense(1)) #输出层

②指定优化器损失函数:model.compile(...)

不同损失函数对结果的影响是很大的,需要仔细分析并加以选取。

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')

③训练:model.fit(X,Y,验证集比例,迭代次数,每次迭代/梯度更新时的迭代样本)

迭代样本尽量选择64*n,且越大越好

model.fit(input_ft,labels,validation_split=0.25,epochs=10,batch_size=64)

 

结果

复制代码
Epoch 1/10
5/5 [==============================] - 9s 50ms/step - 
loss: 4267.8633 - val_loss: 3270.8772 Epoch 2/10 5/5 [==============================] - 0s 8ms/step -
loss: 2302.9319 - val_loss: 5021.0410 ... Epoch 9/10 5/5 [==============================] - 0s 8ms/step -
loss: 43.1946 - val_loss: 802.5125 Epoch 10/10 5/5 [==============================] - 0s 7ms/step -
loss: 34.9554 - val_loss: 740.9500
复制代码

前一个loss是训练集的损失值,后一个loss是验证集的损失值,二者都应该是越来越小。

但是二者之间如果差距过大,说明可能存在过拟合,所以需要加一些补充措施避免。

 

训练完之后,可以用model.summary()来大致预览网络模型

model.summary()

最后一项各层参数的=Wx+b,W就是每层神经元个数,x就是输入数据的特征(列数或上一层的输出特征数),偏置参数个数等于输出个数

以上流程构建的网络存在问题,好像没有完全收敛,接下来是优化过程。

 

2、网络优化

1)修改权重初始化方法

要借助一开始所说的那些参数。

权重初始化方法选择高斯分布的随机数

model=tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer='random_normal'))
model.add(layers.Dense(32,kernel_initializer='random_normal'))
model.add(layers.Dense(1,kernel_initializer='random_normal'))

②之后的优化器、损失函数、训练过程都不变

迭代次数设置为100

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
model.fit(input_ft,labels,validation_split=0.25,epochs=100,batch_size=64)

 

 2)加入正则化惩罚项

model=tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
model.fit(input_ft,labels,validation_split=0.25,epochs=100,batch_size=64)

 

3、预测模型结果:model.predict()

对所有X进行预测,展示结果的尺寸:

predict=model.predict(input_ft)

predict.shape
(348, 1)

 

测试结果并进行展示

复制代码
#创建一个表格用于存储日期及其对应的标签数值
true_data=pd.DataFrame(data={'date':dates,'actual':labels})
#同理,再创建一个用于存放日期及其对应的模型预测值
months=ft['month']
days=ft['day']
years=ft['year']
test_dates=[datetime.datetime(Y,M,D) for Y,M,D in zip(years,months,days)]
predictions_data=pd.DataFrame(data={'date':test_dates,'prediction':predict.reshape(-1)})


plt.style.use('fivethirtyeight')
#真实值 用线的形式绘制
plt.plot(true_data['date'],true_data['actual'],'b-',label='actual')
#预测值 用点的形式绘制
plt.plot(predictions_data['date'],predictions_data['prediction'],'ro',label='prediction')
plt.xticks(rotation=60)
plt.legend()
#图名
plt.xlabel('Date')
plt.ylabel('Maximum Temperature(F)')
plt.title('Actual and Predicted Values')
复制代码

以上就是通过搭建神经网络完成天气预测的过程简述(这是一个回归问题)。

 

posted @   ShineLe  阅读(421)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
历史上的今天:
2021-05-24 QT:Qt Creator中创建的各种项目说明
2021-05-24 QT:QT Creator下载安装
2019-05-24 Python:取整函数、四舍五入
点击右上角即可分享
微信分享提示