本篇开始学习搭建真正的神经网络,前一部分讨论深度学习中预处理数据的基本流程;后一部分构建了两种全连接网络,用三种不同方案拟合时序数据;并在例程中详细分析误差函数,优化器,网络调参,以及数据反向求导的过程。
数据预处理
本篇使用航空乘客数据AirPassengers.csv,其中包括从1949-1960年每月旅客的数量,程序则用于预测未来几年中每月的旅客数量,数据可从以下Git项目中下载。
1.读取数据
首先,引入必要的头文件,并从文件中读入数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import torch
import torch.nn as nn
from torch.autograd import Variable
df = pd.read_csv('data/AirPassengers.csv')
plt.plot(df['#Passengers'])
plt.show()
程序输出如下图所示:
2.归一化
无论机器学习还是深度学习,使用哪一种框架,归一化都是必要环节。归一化的目标是将每一维特征压缩到一定范围之内,以免不同特征因取值范围不同而影响其权重。非常大或非常小的值搭配上不恰当的学习率,往往使得收敛过慢,或者因每次调整的波动太大最终无法收敛。归一化去除了这些不稳定因素。
归一化的具体做法是将某一列特征转换成均值为 0、标准差为1的数据,在图像处理过程中,也常把0-255之间的颜色值转换为0-1之间的小数。
本例中使用了均值和标准差编写了归一化和反归一化函数:
def feature_normalize(data):
mu = np.mean(data,axis=0) # 均值
std = np.std(data,axis=0) # 标准差
return (data - mu)/std
def feature_unnormalize(data, arr):
mu = np.mean(data,axis=0)
std = np.std(data,axis=0)
return arr * std + mu
3.提取新特征
提取新特征是指从现有特征中提取更多可以代入模型的信息,从而生成新特征,本例中的数据包括两列,第一列“Month”是字符串类型的时间,第二列“#Passengers”是乘客量,也就是需要预测的数据y。下面通过拆分和类型转换,从第一列中提取具体的年“year”和月“mon”,将索引列变为特征“x”,并使用上面定义的函数实现归一化功能。
df['year'] = df['Month'].apply(lambda x: float(x[:4]))
df['mon'] = df['Month'].apply(lambda x: float(x[5:]))
df['x'] = feature_normal