人工智能
数据集
现在有一个数据集是飞机的流量数据,它包含每月的飞机流量
这个数据集我们可以看成是序列数据,因为当前月份的飞机流量肯定和前面几个月的飞机流量有关系,当我们将其看成是序列数据的时候,我们就可以使用序列模型来完成这个任务了。
本例中一共有144个月份的数据,我们将两个月的数据作为样本的特征x1、x2,然后将第三个月的数据作为样本的标签y。这样整个数据集就有143份,我们将70%作为训练集,也就是99份作为训练集,然后剩下的作为测试集。
这99份数据并不代表着我们数据集中有99个样本,如果要是有99个样本的话,那么序列就是1了,然后每个时间步输入就是两个特征(输入是两个数字,也就是说输入是2),就没有体会到序列数据的感觉。所以
我们将99份数据看成是一个样本,然后一个样本序列为99,也就是99个时间步,然后每个时间步输入维度是2,也就是两个数字,两个月份的数据。
数据预处理
现在dataset就是已经进行均值归一化的数据了,它是一个列表
然后我们构造数据集,数据集是这样构建的,训练集一共一个样本,这个样本有99个时间步,每个时间步的输入是两个月的数据,这个时间步的输出是第三个月的标签。现在我们构建这样的训练数据集。
现在划分数据集,将70%作为训练集,30%作为测试集
现在我们已经有了训练数据和测试数据了,但是我们需要构造出输入数据为seq,batch,input的格式,以及输出给格式为seq,batch,output的格式,具体来说是这样的:
模型搭建
现在我们已经有了可以放到RNN模型中的数据了,现在我们构建模型
net = lstm_reg(2, 4)
我们来分析一下forward中的维度的变化
首先输入x的维度是99,1,2,其中99表示seq,也就是99个时间步,1表示batch=1,2表示输入层神经元是2
然后输入到网络之后输出x维度为99,1,4
其中99表示seq,1表示batch,4表示输出,因为隐藏层我们定义网络是4
net = lstm_reg(2, 4)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)