本节任务

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

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

一些常见的参数

  • 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就是输入数据的特征(列数或上一层的输出特征数),偏置参数个数等于输出个数

神经网络回归python 神经网络回归任务_损失函数

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

 

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)

神经网络回归python 神经网络回归任务_迭代_02

 

 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)

神经网络回归python 神经网络回归任务_神经网络_03

 

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')

神经网络回归python 神经网络回归任务_神经网络_04

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