一、深度学习相关的基础概念
深度学习:基于数据集的质量训练模型
深度学习有三种:
1、基于监督学习:所有的训练集和测试集都是有标签的,有标准答案的
2、基于半监督学习:一部分有标签,一部分没有标签
3、基于无监督学习:没有标签
深度学习的缺点:
1、首先,深度学习作为一种端到端的解决方法,属于黑盒模型,解释性较差。
2、其次,为了获得满意的模型容量,深度模型包含数层神经网络,参数量往往十分庞大,训练时间长且消耗资源多。
深度神经网络有三种:
1、前馈神经网络
2、卷积神经网络CNN
3、循环神经网络RNN
其中,前馈神经网络应用最多,CNN适合用于图像处理,RNN适合处理诸如语言、音乐,股票曲线等序列类型的数据。
二、RNN与LSTM
RNN(循环神经网络)连接存在着大量的环路,信息在传递的过程中有可能长期在网络保留,因此它比普通的前馈神经网络具有更好的记忆能力。
然而,即使加入了神经元之间的环路连接,由于普通人工神经元在处理信息时存在着信号的衰减,RNN的记忆能力仍然不足以应对真实序列中的长期依赖特性。
于是,提出了LSTM(Long Short-Term Memory 长短时记忆)网络模型,通过增加新的门控单元来尽可能长时间地保留信息。
LSTM的内部结构:包括一个记忆细胞和3个门控开关,分别是输入门,遗忘门和输出门。
三、LSTM的具体结构和工作
推荐李宏毅老师的讲解,讲的很好:视频
要存入cell里面的input是Z
操控input gate 的signal是Zi
操控forget gate 的signal是Zf
操控output gate 的signal是Zo
活化方程 f 通常是sigmoid方程(结果在0到1之间,代表gate的打开程度,1是打开/记得的状态,0则是关闭/遗忘)
输入层 xt 乘上相应的权重变成Z,Zi,Zf,Zo去操控相应的gate
四、LSTM模型代码
# LSTM网络
import torch as t
class LstmNet(t.nn.Module):
def __init__(self,input_size,hidden_size,num_layers,num_classes):
# input_size:输入元素个数,hidden_size:隐藏层元素个数,num_layers:隐藏层数
super(LstmNet,self),__init__()
self.hidden_size=hiddent_size
self.num_layers=num_layers
self.lstm=t.nn.LSTM(input_size,hidden_size,num_layers,batch_first=True)
# batch_first=True主要决定几个参数的顺序。
self.fc=t.nn.Linear(hidden_size,num_classes) # 输出的全连接网络
def forward(self,x):
# 通过x.size(0)获取batch中的元素个数
# h0和c0的格式为:(层数*方向数,批次数,隐藏层数)
b_size=x.size(0)
h0=t.zeros(self.num_layers,b_size,self.hidden_size)
c0=t.zeros(self.num_layers,b_size,self.hidden_size)
lstm_out,_=self.lstm(x,(h0,c0))
fc_out=self.fc(lstm_out[:,-1,:])
return fc_out