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')
以上就是通过搭建神经网络完成天气预测的过程简述(这是一个回归问题)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2021-05-24 QT:Qt Creator中创建的各种项目说明
2021-05-24 QT:QT Creator下载安装
2019-05-24 Python:取整函数、四舍五入