循环神经网络理论知识+卷积神经网络模型

时间:2022-10-05 08:52:02

前馈神经网络
多层感知器与卷积神经网络,信息按照一个方向流动

Recurrent Neural Network , RNN
信息循环流动

两种循环神经网络==原始的循环神经网络和目前常用的长短时记忆网络

循环神经网络指的是网络的隐含层输出又作为其自身的输入。

Wxh,bxh,whh,bhh, why,bhy

x:
h
y

自己可以看到循环神经网络示意图

设置一个有限的循环次数,将其展开后相当于堆叠多个共享隐含层参数的前馈神经网络。

tanh(z)是激活函数,与sigoid类似,值域是-1到1
隐含层ht是不但与当前的输入有关,而且与上一时刻的隐含层有关
递归形式的定义。

记忆单元

处理文本分类的问题

每一个时刻都产生一个输出结果,这种结果适用于处理自然语言处理中常见的序列标注问题
词性标注,命名实体识别,分词

长短时记忆网路

网络参数难以优化
hk与ht链接,减少了网络的层数,使网络更容易优化

旧状态与新状态进行相加。

上课

Dense网络
全连接网络

Dense Layer稠密层 与 全连接层 Fully Connected Layer

Linear Layer
Sigmoid Layer

Softmax回归

多元分类

Logistic回归

输出值的大小是任意的,但是要限制在一个范围内
例如二次分类,0,1
所以这种函数就被成为激活函数

此模型就叫Logistic回归

经过Sigmoid函数归一化的模型输出可以看作一个输出属于某一类别的概率值。

提取局部特征的稠密层又被称为卷积核(Kernel)或者滤波器(Filter)

池化:卷积的结果进行进一步聚合
最大池化、平均池化、加和池化

最大池化:仅保留最有意义的局部特征

池化的好处:解决样本的输入大小不一致的问题

多个卷积核提取不同种类的局部特征

使用不同组的参数,并且使用不同的初始化参数,获得不同的卷积核

提取不同尺度的局部特征

全连接的分类层==做出最终的决策

卷积神经网络(CNN)
一维卷积

卷积提取特征,池化聚合!!!!
全连接层==拼接为一个特征向量

FFN:前反馈的神经网咯哦

模型实现

Conv1d,2d 3d
一维卷积,二维卷积,三位卷积
一维卷积:单一方向滑动

in-channels输入通道的个数
kernel-size :每个卷积宽度
out_channels:输出通道的个数

(batch,in_channels,seq_len)
输出:
(batch,out_channels,seq)len)

seq_len分别代表:输入的序列长度和输出的序列长度

从后向中排除子图

requires_grad

单一=》输出也需要
输出不需要梯度=》输入不需要

如果要对预先训练的CNN进行优化,只要切换冻结模型中的requires_grad标志就足够了,直到计算到最后一层才会保存中间缓冲区,其中的仿射变换将使用需要梯度的权重并且网络的输出也将需要它们。

volatile

不会调用.backward()
volatile也决定了require_grad is False

volatile 不同于require_grad的传递
如果一个操作甚至只有一个volatile的输入,他的输出也是volatile

https://www.freesion.com/article/80661200398/

特别重要

循环神经网络理论知识+卷积神经网络模型

import torch
from torch.nn import Conv1d
conv1 = Conv1d(5,2,4)
conv2 = Conv1d(5,2,3)
inputs = torch.rand(2,5,6)
outputs1 = conv1(inputs)
outputs2 = conv2(inputs)
print(outputs1)
print(outputs2)

循环神经网络理论知识+卷积神经网络模型

循环神经网络理论知识+卷积神经网络模型

conv2 = Convid(5,2,3)
inputs = torch.rand(1,5,6)
outputs2 = conv2(inputs)
print(output2)

循环神经网络理论知识+卷积神经网络模型

我终于好像懂了!!!

torch.nn包中定义的池化层类,主要有最大池化,平均池化。

Maxpoolid 是一维最大池化,kernel_size
池化层的大小,对多大范围进行池化。

如果对整个序列进行池化,则其大小应为卷积层输出的序列长度

所以下列例子就是对整个卷积层进行一个查找,找到一个最大的卷积层

max_poolid

无须定义一个池化层对象,就可以直接调用池化功能。

outputs_pooli = F.max_poolid(outputs1,kernel_size = outputs1.shape[2])
即outputs1的最后一维恰好为其序列的长度

记住是长度!!!!!

torch.cat将其拼接起来。
squeeze函数将最后一个为1的维度删除,即将2行1列的矩阵变为一个向量

outputs_pool_squeeze1 = outputs_pool1.squeeze(dim=2)

另一个也是一样

之后
outpus_pool  = torch.cat([outputs_pool_squeeze1,outputs_pool_squeeze2].dim=1)


全连接层,实现分类功能

from torch.nn import Linear
linear = Linear(4,2)
输入维度4.池化层输入的维度,而我只需要的是2个维度

outputs_linear = linear(outputs_pool)

print(outputs_linear)