关于LSTM和RNN,可以看我的 blog,关于pytorch的一些基本操作,可以先看我的 blog,这里总结一下如何用pytorch构建LSTM网络,以及如何进行训练验证和测试。
LSTM
many to one型
构建模型
对于LSTM,我们的数据实际长成 <N, seq_len, features>,N表示记录条数;seq_len表示一条记录的时序步长;features表示每个时序的特征数,也是LSTM在每个时间点实际的输入数据。这里利用pytorch的高度集成的nn.LSTM进行,但是目前这个方法堆叠的LSTM单元的隐层是固定的,即设定隐层数(假设为6)和隐层神经元数(假设为32),6个隐层的神经元数都会是32,如果想改变隐层神经元数,可以考虑使用多个nn.LSTMcell的方法。
下面的代码按照实际顺序给出,是全部代码,复制时只需按照顺序执行即可
import torch
import torch.nn as nn
import numpy as np
import torchvision
from torch.utils.data import DataLoader
from datetime import datetime # 用于计算时间
# 定义常量
INPUT_SIZE = 28 # 定义输入的特征数
HIDDEN_SIZE = 32 # 定义一个LSTM单元有多少个神经元
BATCH_SIZE = 32 # batch
EPOCH = 10 # 学习次数
LR = 0.001 # 学习率
TIME_STEP = 28 # 步长,一般用不上,写出来就是给自己看的
DROP_RATE = 0.2 # drop out概率
LAYERS = 2 # 有多少隐层,一个隐层一般放一个LSTM单元
MODEL = 'LSTM' # 模型名字
# 定义一些常用函数
# 保存日志
# fname是要保存的位置,s是要保存的内容
def log(fname, s):
f = open(fname, 'a')
f.write(str(datetime.now()) + ': ' + s + '\n')
f.close()
# 定义LSTM的结构
class lstm(nn.Module):
def __init__(self):
super(lstm, self).__init__()
self.rnn = nn.LSTM(
input_size = INPUT_SIZE,
hidden_size = HIDDEN_SIZE,
num_layers = LAYERS,
dropout = DROP_RATE,
batch_first = True # 如果为True,输入输出数据格式是(batch, seq_len, feature)
# 为False,输入输出数据格式是(seq_len, batch, feature),
)
self.hidden_out = nn.Linear(HIDDEN_SIZE, 10) # 最后一个时序的输出接一个全连接层
self.h_s = None
self.h_c = None
def forward(