『PyTorch』第十弹_循环神经网络
RNN基础:
『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练
TensorFlow RNN:
对于torch中的RNN相关类,有原始和原始Cell之分,其中RNN和RNNCell层的区别在于前者一次能够处理整个序列,而后者一次只处理序列中一个时间点的数据,前者封装更完备更易于使用,后者更具灵活性。实际上RNN层的一种后端实现方式就是调用RNNCell来实现的。
一、nn.RNN
import torch as t
from torch import nn
from torch.autograd import Variable as V layer = 1 t.manual_seed(1000)
# 3句话,每句话2个字,每个字4维矢量
# batch为3,step为2,每个元素4维
input = V(t.randn(2,3,4))
# 1层,输出(隐藏)神经元3维,输入神经元4维
# 1层,3隐藏神经元,每个元素4维
lstm = nn.LSTM(4,3,layer)
# 初始状态:1层,batch为3,隐藏神经元3
h0 = V(t.randn(layer,3,3))
c0 = V(t.randn(layer,3,3)) out, hn = lstm(input,(h0,c0))
print(out, hn)
Variable containing:
(0 ,.,.) =
0.0545 -0.0061 0.5615
-0.1251 0.4490 0.2640
0.1405 -0.1624 0.0303 (1 ,.,.) =
0.0168 0.1562 0.5002
0.0824 0.1454 0.4007
0.0180 -0.0267 0.0094
[torch.FloatTensor of size 2x3x3]
(Variable containing:
(0 ,.,.) =
0.0168 0.1562 0.5002
0.0824 0.1454 0.4007
0.0180 -0.0267 0.0094
[torch.FloatTensor of size 1x3x3]
, Variable containing:
(0 ,.,.) =
0.1085 0.1957 0.9778
0.5397 0.2874 0.6415
0.0480 -0.0345 0.0141
[torch.FloatTensor of size 1x3x3]
)
二、nn.RNNCell
import torch as t
from torch import nn
from torch.autograd import Variable as V t.manual_seed(1000)
# batch为3,step为2,每个元素4维
input = V(t.randn(2,3,4))
# Cell只能是1层,3隐藏神经元,每个元素4维
lstm = nn.LSTMCell(4,3)
# 初始状态:1层,batch为3,隐藏神经元3
hx = V(t.randn(3,3))
cx = V(t.randn(3,3)) out = [] # 每个step提取各个batch的四个维度
for i_ in input:
print(i_.shape)
hx, cx = lstm(i_,(hx,cx))
out.append(hx)
t.stack(out)
torch.Size([3, 4])
torch.Size([3, 4])Variable containing:
(0 ,.,.) =
0.0545 -0.0061 0.5615
-0.1251 0.4490 0.2640
0.1405 -0.1624 0.0303 (1 ,.,.) =
0.0168 0.1562 0.5002
0.0824 0.1454 0.4007
0.0180 -0.0267 0.0094
[torch.FloatTensor of size 2x3x3]
三、nn.Embedding
embedding将标量表示的字符(所以是LongTensor)转换成矢量,这里给出一个模拟:将标量词embedding后送入rnn转换一下维度。
import torch as t
from torch import nn
from torch.autograd import Variable as V # 5个词,每个词使用4维向量表示
embedding = nn.Embedding(5, 4)
# 使用预训练好的词向量初始化
embedding.weight.data = t.arange(0, 20).view(5, 4) # 大小对应nn.Embedding(5, 4) # embedding将标量表示的字符(所以是LongTensor)转换成矢量
# 实际输入词原始向量需要是LongTensor格式
input = V(t.arange(3, 0, -1)).long()
# 1个batch,3个step,4维矢量
input = embedding(input).unsqueeze(1)
print("embedding后:",input.size()) # 1层,3隐藏神经元(输出元素4维度),每个元素4维
layer = 1
lstm = nn.LSTM(4, 3, layer)
# 初始状态:1层,batch为3,隐藏神经元3
h0 = V(t.randn(layer, 3, 3))
c0 = V(t.randn(layer, 3, 3))
out, hn = lstm(input, (h0, c0))
print("LSTM输出:",out.size())
embedding后: torch.Size([3, 1, 4])
LSTM输出: torch.Size([3, 3, 3])
『PyTorch』第十弹_循环神经网络的更多相关文章
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...
- 『MXNet』第十弹_物体检测SSD
全流程地址 一.辅助API介绍 mxnet.image.ImageDetIter 图像检测迭代器, from mxnet import image from mxnet import nd data_ ...
- 『PyTorch』第五弹_深入理解Tensor对象_下:从内存看Tensor
Tensor存储结构如下, 如图所示,实际上很可能多个信息区对应于同一个存储区,也就是上一节我们说到的,初始化或者普通索引时经常会有这种情况. 一.几种共享内存的情况 view a = t.arang ...
- 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法
在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...
- 『TensorFlow』第十弹_队列&多线程_道路多坎坷
一.基本队列: 队列有两个基本操作,对应在tf中就是enqueue&dequeue tf.FIFOQueue(2,'int32') import tensorflow as tf '''FIF ...
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上
总结一下相关概念: torch.Tensor - 一个近似多维数组的数据结构 autograd.Variable - 改变Tensor并且记录下来操作的历史记录.和Tensor拥有相同的API,以及b ...
- 『PyTorch』第五弹_深入理解autograd_下:函数扩展&高阶导数
一.封装新的PyTorch函数 继承Function类 forward:输入Variable->中间计算Tensor->输出Variable backward:均使用Variable 线性 ...
- 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究
查看非叶节点梯度的两种方法 在反向传播过程中非叶子节点的导数计算完之后即被清空.若想查看这些变量的梯度,有两种方法: 使用autograd.grad函数 使用hook autograd.grad和ho ...
- 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&_广播原理简介
一.简单数学操作 1.逐元素操作 t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域. a = t.arange(0,6).view ...
随机推荐
- Chrome 性能监测
前端性能优化一直是前端工作中必不可少的一部分,但是我们如何知道哪些部分的性能有优化的空间呢?此时,Chrome 性能监测就派上用场了. 正所谓:知己知彼,百战百胜,只有确定了性能瓶颈,才能有条不紊地进 ...
- python之路----进程三
IPC--PIPE管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在 ...
- jackson 常用注解,比如忽略某些属性,驼峰和下划线互转
一般情况下使用JSON只使用了java对象与字符串的转换,但是,开发APP时候,我们经常使用实体类来做转换:这样,就需要用到注解: Jackson默认是针对get方法来生成JSON字符串的,可以使用注 ...
- 20145306 逆向与Bof基础
逆向与Bof基础 实践 一 直接修改机器指令,改变程序执行流程 本次实践的对象是一个名为pwn1的linux可执行文件. 显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返 ...
- 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践
20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...
- 20145335郝昊《网络攻防》Exp4 Adobe阅读器漏洞攻击
20145335郝昊<网络攻防>Exp4 Adobe阅读器漏洞攻击 实验内容 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 本次攻击对象为:windows xp sp ...
- vim的加密和解密?
vim中出现的错误提示含义: 参考: http://blog.csdn.net/u014599371/article/details/43955169 E488: trailing character ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解
题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...
- datagridview控件的使用
http://home.cnblogs.com/group/topic/40730.html datagridview定位到最后一行的方法 this.dataGridView2.CurrentCell ...
- 解决 Ubuntu 14.04 图形界面无法正常显示 问题
参考: ubuntu清除系统缓存的方法 apt-get(四) 每天一个linux命令(33):df 命令 Ubuntu server 12.10 /dev/sda1 disk full 解决 Ubun ...