PyTorch :pad_sequence、pack_padded_sequence、pad_packed_sequence 序列填充与打包详解

用GRU处理变长序列的完整流程:从Padding到Pack_padded_sequence的PyTorch实现 本文详细介绍了使用PyTorch中的GRU处理变长序列的完整流程,重点讲解了从数据填充(Padding)到使用pack_padded_sequence的核心步骤。通过实战代码演示了如何高效处理长度不一的序列数据,避免计算资源浪费,并对比了GRU与LSTM在序列任务中的性能差异,为NLP等场景提供了可复用的解决方案。 阅读详情

pad_sequence、pack_padded_sequence、pad_packed_sequence 序列填充与打包详解

这三个函数是处理变长序列的核心工具,专门解决 NLP、时间序列等场景中「样本长度不一致」的问题,让 RNN/LSTM/GRU 能高效处理数据。

实际场景

在深度学习中,一个 batch 的序列必须长度相同(比如句子长度、时间步长度),但实际数据中每个样本长度不一样:

  • 例:batch 有 3 个句子,长度分别为 [5, 3, 4]

  • 直接输入 RNN 会报错,必须统一长度

这三个函数分工明确:

函数输入输出核心作用
pad_sequence变长序列列表等长填充张量统一序列长度
pack_padded_sequence填充张量 + 真实长度PackedSequence去除填充,加速 RNN
pad_packed_sequencePackedSequence填充张量 + 长度还原序列,方便后续计算

pad_sequence:序列填充(最基础)

作用

将多个长度不同的一维序列,填充到相同长度,生成标准 batch 张量。

核心参数

  • sequences:列表形式的变长序列(每个元素是 tensor)

  • batch_first:True → 输出形状 [batch_size, seq_len](最常用);False → [seq_len, batch_size]

  • padding_value:填充值,默认 0

使用示例

import torch
from torch.nn.utils.rnn import pad_sequence
​
# 1. 构造变长序列(3个样本,长度分别5、3、4)
seq1 = torch.tensor([1, 2, 3, 4, 5])    # 长度5
seq2 = torch.tensor([6, 7, 8])          # 长度3
seq3 = torch.tensor([9, 10, 11, 12])    # 长度4
sequences = [seq1, seq2, seq3]
​
# 2. 填充(batch_first=True 最常用)
padded_seq = pad_sequence(sequences, batch_first=True, padding_value=0)
print("填充后的序列:")
print(padded_seq)
print("形状:", padded_seq.shape)  # [3, 5] → batch=3,最大长度=5

输出结果

填充后的序列: 直接按照最长的填充
tensor([[ 1,  2,  3,  4,  5],
        [ 6,  7,  8,  0,  0],
        [ 9, 10, 11, 12,  0]])
形状: torch.Size([3, 5])

pack_padded_sequence:打包填充序列(加速 RNN)

作用

去除填充值(0),把填充后的等长序列压缩成紧凑的 PackedSequence 对象。

  • RNN 计算时 只计算真实数据,会跳过填充值,不浪费算力在填充值上 ,大幅提升效率

  • 必须传入每个序列的真实长度

核心参数

  • sequence:pad_sequence 输出的填充序列

  • lengths:每个样本的真实长度(必须从大到小排序!)

  • batch_first:和 pad_sequence 保持一致

示例

import torch
from torch.nn.utils.rnn import pad_sequence,pad_packed_sequence
from torch.nn.utils.rnn import pack_padded_sequence
​
​
# 1. 按照长度降序排列
seq1 = torch.tensor([1, 2, 3, 4, 5])    # 长度5
seq3 = torch.tensor([9, 10, 11, 12])    # 长度4
seq2 = torch.tensor([6, 7, 8])          # 长度3
sequences = [seq1,seq3,  seq2]
# 2. 填充(batch_first=True 最常用)
padded_seq = pad_sequence(sequences, batch_first=True, padding_value=0)
print(padded_seq)
# 1. 每个序列的真实长度(必须 降序排列!)
lengths = torch.tensor([5, 4, 3])  # 对应 seq1、seq3、seq2(一定要排序)
# 2. 打包(去除填充值)
packed_seq = pack_padded_sequence(
    padded_seq,
    lengths=lengths,
    batch_first=True,
    enforce_sorted=True  # 表示已按长度降序排序,
)
print(packed_seq.data)
print(packed_seq.batch_sizes)

输出结果

tensor([[ 1,  2,  3,  4,  5],
        [ 6,  7,  8,  0,  0],
        [ 9, 10, 11, 12,  0]])
tensor([ 1,  6,  9,  2,  7, 10,  3,  8, 11,  4,  0,  5])
tensor([3, 3, 3, 2, 1])

坑!!!!!!

输入序列必须按真实长度 降序排列!

  • 例:长度 5 > 4 > 3,对应样本顺序:seq1、seq3、seq2 在这里插入图片描述

代码

import torch
import torch.nn as  nn
from torch.nn.utils.rnn import pad_sequence, pack_padded_sequence, pad_packed_sequence
from torch.utils.data import Dataset, DataLoader
import torch
from torch.nn.utils.rnn import pad_sequence,pad_packed_sequence
from torch.nn.utils.rnn import pack_padded_sequence
​
​
# 1. 按照长度降序排列
seq1 = torch.tensor([1, 2, 3, 4, 5])    # 长度5
seq3 = torch.tensor([9, 10, 11, 12])    # 长度4
seq2 = torch.tensor([6, 7, 8])          # 长度3
sequences = [seq1,seq3,  seq2]
# 2. 填充(batch_first=True 最常用)
padded_seq = pad_sequence(sequences, batch_first=True, padding_value=0)
length = torch.tensor([5, 4, 3])
batch_x_l =(padded_seq, length)
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.embedding = nn.Embedding(num_embeddings=20, embedding_dim=5, padding_idx=0)
        self.rnn = nn.RNN(input_size=5, hidden_size=10, num_layers=1, batch_first=True)
​
    def forward(self, x_l):
        x =x_l[0]
        length = x_l[1]
        embd = self.embedding(x)
        packed_seq = pack_padded_sequence(embd, length, batch_first=True)
        y = self.rnn(packed_seq)
        return  y
model = Model()
y, h = model(batch_x_l)
print(type( y))
print(y.data.shape)
print(y.batch_sizes)
​

输出结果

<class 'torch.nn.utils.rnn.PackedSequence'>
torch.Size([12, 10])
tensor([3, 3, 3, 2, 1])

pad_packed_sequence:填充打包对象

作用

把 RNN 输出的打包 PackedSequence 对象,还原成填充前的等长序列, 因为之前喂给模型的是数据是 : tensor([ 1, 6, 9, 2, 7, 10, 3, 8, 11, 4, 0, 5]) 批次 : tensor([3, 3, 3, 2, 1]) 在这里插入图片描述 模型输出 torch.Size([12, 10]) 批次 : tensor([3, 3, 3, 2, 1]) 所以还需要将rnn 输出的模型形状变成 [3,5], 方便后续做损失计算、预测。

核心参数

  • sequence:打包后的 PackedSequence 对象

  • batch_first:和之前保持一致

  • padding_value:填充值(默认 0)

使用示例

import torch
from torch.nn.utils.rnn import pad_packed_sequence, pad_sequence, pack_padded_sequence
​
# 1. 按照长度降序排列
seq1 = torch.tensor([1, 2, 3, 4, 5])    # 长度5
seq3 = torch.tensor([9, 10, 11, 12])    # 长度4
seq2 = torch.tensor([6, 7, 8])          # 长度3
sequences = [seq1,seq3,  seq2]
# 2. 填充(batch_first=True 最常用)
padded_seq = pad_sequence(sequences, batch_first=True, padding_value=0)
print("填充后的序列:")
print(padded_seq)
# 1. 每个序列的真实长度(必须 降序排列!)
lengths = torch.tensor([5, 4, 3])  # 对应 seq1、seq3、seq2(一定要排序)
# 2. 打包(去除填充值)
packed_seq = pack_padded_sequence(
    padded_seq,
    lengths=lengths,
    batch_first=True,
    enforce_sorted=True  # 表示已按长度降序排序,
)
print("打包后的序列:")
print(packed_seq.data)
print(packed_seq.batch_sizes)
# 1. 解包还原
unpacked_seq, unpacked_lengths = pad_packed_sequence(
    packed_seq,
    batch_first=True,
    padding_value=0
)
​
print("解包后的序列:")
print(unpacked_seq)
print("解包后的长度:", unpacked_lengths)

输出结果

解包后的序列:
tensor([[ 1,  2,  3,  4,  5],
        [ 9, 10, 11, 12,  0],
        [ 6,  7,  8,  0,  0]])
torch.Size([3, 5])
解包后的长度: tensor([5, 4, 3])

✅ 解包结果和原始填充序列完全一致!


完整流水线(RNN 标准流程)

实际项目中,三个函数配合使用,标准流程:

  1. 原始变长序列 → pad_sequence → 填充序列

  2. 填充序列 → pack_padded_sequence → 打包序列(输入 RNN)

  3. RNN 输出打包序列 → pad_packed_sequence → 还原填充序列

完整代码

import torch
import torch.nn as  nn
from torch.nn.utils.rnn import pad_sequence, pack_padded_sequence, pad_packed_sequence
from torch.utils.data import Dataset, DataLoader
​
class MyData(Dataset):
    def __init__(self, data):
        self.data = data
​
    def __len__(self):
        return len(self.data)
​
    def __getitem__(self, idx):
        return self.data[idx]
​
def collate_fn(data):
    data.sort(key=lambda x: len(x), reverse=True)
    seq_len = [s.size(0) for s in data]
    data = pad_sequence(data, batch_first=True)
    return data, seq_len
​
a = torch.tensor([1,2,3,4])
b = torch.tensor([5,6,7])
c = torch.tensor([7,8])
d = torch.tensor([9])
train_x = [a, b, c, d]
​
data = MyData(train_x)
data_loader = DataLoader(data, batch_size=2, collate_fn=collate_fn)
batch_x_l = iter(data_loader).__next__()
​
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.embedding = nn.Embedding(num_embeddings=20, embedding_dim=5, padding_idx=0)
        self.rnn = nn.RNN(input_size=5, hidden_size=10, num_layers=1, batch_first=True)
​
    def forward(self, x_l):
        x =x_l[0]
        length = x_l[1]
        embd = self.embedding(x)
        packed_seq = pack_padded_sequence(embd, length, batch_first=True)
        y = self.rnn(packed_seq)
        return  y
print("batch_x:", batch_x_l)
model = Model()
y, h = model(batch_x_l)
print(type( y))
print(y)
out_pad, out_len = pad_packed_sequence(y, batch_first=True)
print(out_pad.shape)
print(out_len)
print(out_pad)
​

总结

  1. pad_sequence:解决「batch 长度不一致」问题,用 0 填充成等长序列;

  2. pack_padded_sequence:压缩填充值,让 RNN 不计算无效填充,提升效率;

  3. pad_packed_sequence:把 RNN 输出还原为填充格式,适配后续任务;

pytorch之数据:pack_padded_sequence()与pad_packed_sequence() 前言 pack_padded_sequence()与pad_packed_sequence()这两个函数属于torch.nn.utils包中用来处理数据的。前者用于压紧数据,后面用于解压数据。 一. 官方+理解 1. pack_padded_sequence '官方函数' torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False) → PackedSequence 这里的pack,理解成压紧比较好。 将一个 填充过的 阅读详情

相关推荐

pytorch中关于pack_padded_sequence和pad_packed_sequence的解释。

已经有人解释的比较详细了,参考了一些我写在下面: 总结就是一句话:以batch为一个单位,对补齐后的batch进行压缩计算最后解压。减少这个batch中大量pad对输出的影响。 参考:https://zhuanlan.zhihu.com/p/34418001 https://www.cnblogs.com/lindaxin/p/8052043.html 如果已经看过类似解释的同学,可以直接...

shange19的博客 2186

使用 pad_sequence

pad_sequence 是用来干嘛的? 首先 pad_sequence 是用来对对tensor做padding 的,先看官方示例: 文档地址https://pytorch.org/docs/stable/generated/torch.nn.utils.rnn.pad_sequence.html?highlight=pad_sequence#torch.nn.utils.rnn.pad_sequence from torch.nn.utils.rnn import pad_sequence a = tor

Zhao_knight的博客 2万+

pytorch rnn 变长输入序列问题

pytorch实现变长输入的rnn分类 输入数据是长度不固定的序列数据,主要讲解两个部分 Data.DataLoader的collate_fn用法,以及按batch进行padding数据 pack_padded_sequence和pad_packed_sequence来处理变长序列 collate_fn Dataloader的collate_fn参数,定义数据处理和合并成batch的方式。 由...

猴小能的博客 6016

pad_sequence —— 填充句子到相同长度

torch.nn.utils.rnn.pad_sequence(sequences, batch_first=False, padding_value=0) 用padding_value 填充一系列可变长度的tensor,把它们填充到等长 Example >>> from torch.nn.utils.rnn import pad_sequence >>> a...

哪惧明天,风高路斜 1万+

pad_sequence和nn.utils.rnn.pack_padded_sequence和nn.utils.rnn.pad_packed_sequence

pad_sequence 填充可变长度张量列表 例子 >>> from torch.nn.utils.rnn import pad_sequence >>> a = torch.ones(25, 300) >>> b = torch.ones(22, 300) >>> c = torch.ones(15, 300) >>> pad_sequence([a, b, c]).size() torch.Size(

小白之比白更白的博客 1059

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1534

torch.nn.utils.rnn.pad_sequence()详解【Pytorch入门手册】

填充张量(tensor)至等长度

“365天深度学习训练营”报名进行中~ 3843

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3843

(done) 关于 pytorch 代码里常出现的 batch_first 到底是啥?

TODO:here。

shimly123456的博客 782

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 960

从零到一:ESP32-P4 PPA加速的配置陷阱与避坑指南

本文详细解析ESP32-P4结合LVGL的PPA硬件加速配置中的常见陷阱,包括内存对齐、缓冲区设置和同步机制等关键问题。提供实用的避坑指南和优化方案,帮助开发者高效启用esp32p4的PPA加速功能,显著提升图形渲染性能。

sky77的博客 396

pytorch 之pad_sequence, pack_padded_sequence, pack_sequence, pad_packed_sequence使用

该函数用padding_value来填充一个可变长度的张量列表。将长度较短的序列填充为和最长序列相同的长度。,张量的形状为T × B × ∗。否则,张量的形状为B × T × ∗。包含填充序列的张量的元组,以及包含批次中每个序列的长度列表的张量。函数进行填充的时候,产生了冗余,因此需要对其进行pack。压紧(pack)一个包含可变长度的填充序列的张量,在使用。函数对返回的结果进行填充以恢复为原来的形状。如果 batch_first 是。一句话就是:填充句子到相同长度。

weixin_43788986的博客 823

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1117

pytorch中的pad_sequence、pack_padded_sequence和pad_packed_sequence函数

torch.nn.utils.rnn.pad_sequence、torch.nn.utils.rnn.pack_padded_sequence和torch.nn.utils.rnn.pad_packed_sequence 在使用pytorch训练模型的时候,一般采用batch的形式同时处理多个样本序列,而同一batch中时序信息的的长度是不同的,这样就无法传入RNN,LSTM,GRU这样的模型中进行处理。一个常用的做法是按照一个指定的长度(或者按照batch中最长的序列长度)对batch中的序列进行填充(p

tcn760的博客 1万+

电路保护设计实战:保险丝选型、I²t计算与多级协同方案

电路保护是电子系统可靠性的基石,其核心原理是在发生过流或过压等异常情况时,及时切断故障回路,防止能量持续灌入导致元器件损坏甚至安全事故。从技术价值看,优秀的保护设计能显著提升产品寿命、安全性和市场口碑,尤其在快充、电动汽车等高功率密度应用中,保护器件已成为不可或缺的安全屏障。在众多保护器件中,保险丝作为最基础的过流保护元件,其正确选型与应用直接关系到保护效果。本文聚焦于保险丝选型的实战细节,深入解析了I²t(电流平方时间积)这一关键参数,它定义了熔断所需的能量阈值,是匹配被保护半导体器件耐受能力、实现有效保

weixin_42662171的博客 309

【网络安全 | 渗透工具】Githack工具安装及使用教程详析

本文仅分享Githack工具基本安装及使用相关知识不承担任何法律责任。Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代码库。然而,在配置不当的情况下,可能会导致.git文件夹被直接部署到线上环境中,这可能会导致Git泄露问题。可通过githack下载泄露的Git存储库,以获取包含未加密密码、凭据和敏感信息的站点代码库。使用githack下载Git存储库的方法有两种。本文仅分享。

等风来 3万+

关于pack_padded_sequence 和 pad_packed_sequence最清楚的解释

pack_padded_sequence 和 pad_packed_sequence TX-7 ​ 生活~我是认真的 39 人赞同了该文章 首先需要申明的是,本文中所使用到的 PyTorch 版本为:1.4.0 。 当采用 RNN 训练序列样本数据时,会面临序列样本数据长短不一的情况。比如做 NLP 任务、语音处理任务时,每个句子或语音序列的长度经常是不相同。难道要一个序列一个序列的喂给网络进行训练吗?这显然是行不通的。 为了更高效的进行 batch 处理,就需要对样本序列进行填充,保证各

wangchaoxjtu的专栏 3529

华为OD机试双机位C卷-虚拟文件系统(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【虚拟文件系统】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【虚拟文件系统】。

qq_45776114的博客 480

pytorch中torch.nn.utils.rnn相关sequence的pad和pack操作

自然语言处理任务中,模型的输入一般都是变长的。为了能够组成batch输入模型进行并行计算,都是要把变长的数据处理为等长的。之前都是自己手动padding来实现的,后面发现torch中已经有了相应的API能够高速快速的处理这样的问题,同时也能够处理好padding无意义的值带来的影响。下面就一起来看看torch.nn.utils.rnn中处理这些问题的API吧! 一、pad_sequence 二、pack_sequence 三、pad_packed_sequence 四、pack...

HUSTHY的博客 9482

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pack_padded_sequence 和 pad_packed_sequence

首先需要申明的是,本文中所使用到的 PyTorch 版本为:1.4.0 。 当采用 RNN 训练序列样本数据时,会面临序列样本数据长短不一的情况。比如做 NLP 任务、语音处理任务时,每个句子或语音序列的长度经常是不相同。难道要一个序列一个序列的喂给网络进行训练吗?这显然是行不通的。 为了更高效的进行 batch 处理,就需要对样本序列进行填充,保证各个样本长度相同,在 PyTorch 里面使用函数 pad_sequence 对序列进行填充。填充之后的样本序列,虽然长度相同了,但是序列里面可能填充了很多

yaohaishen的专栏 1982

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pytorch中如何在lstm中输入可变长的序列

pytorch中如何在lstm中输入可变长的序列pytorch中如何在lstm中输入可变长的序列torch.nn.utils.rnn.pad_sequence()torch.nn.utils.rnn.pack_padded_sequence()torch.nn.utils.rnn.pad_packed_sequence() pytorch中如何在lstm中输入可变长的序列 我在做的时候主要参考了这...

kejizuiqianfang的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pack_padded_sequence,pad_packed_sequence

pack_padded_sequence: 我们正常传进RNN模型的是一个被填充之后的序列矩阵。但是这样pad会影响模型的效果,所以要把pad删除再传进模型。 pack_padded_sequence就是起这个功能的。 pack之后,原来填充的 PAD占位符被删掉了。 输入的形状可以是(T×B×* )。T是最长序列长度,B是batch size,*代表任意...

七月听雪的博客 3435

【Pytorch】详解RNN网络中文本的pack和pad操作

1. 引言 RNN模型一般设定固定的文本长度(text sequence length,可理解为文本序列在时间维度上的步数 time step),以保证网络输出层数据维度的一致性。但在训练和测试时,难以保证输入文本长度的一致性,因此常常需要截断操作(即将超过预设长度的文本截断)和pad操作(即对不足预设长度的文本进行补0填充)。pad操作需满足: (1)pad后,不足预设长度的文本用相同特征维度的...

guofei_fly的博客 3876

通过例子10分钟快速看懂pad_sequence、pack_padded_sequence以及pad_packed_sequence

前言 import torch import torch.nn as nn from torch.nn.utils.rnn import pad_sequence from torch.nn.utils.rnn import pack_padded_sequence from torch.nn.utils.rnn import pad_packed_sequence 注意到上面的utils.rnn了没有?这几个函数“通常”都是用于RNN相关处理的。所以你得明白RNN的一些标准概念,然后5分钟你就能看懂了

qq_43391414的博客 4279

pytorch 如何用pack_padded_sequence和pad_packed_sequence处理变长序列

假设在一个批中我们有以下四个句子做为输入 1.I love China. 2.The dog is running. 3.Be yourself! 4.We are family! 第一步我们将句子转化为词的id序列

Hello_word5的博客 1280

PyTorch中的pack_padded_sequence和pad_packed_sequence

在pytorch中为什么会使用pack_padded_sequence和pad_packed_sequence,讲一句话的id序列直接嵌入再跑一遍RNN不香吗? 举个简单的例子: import torch from torch import nn # 输入的句子的id序列 txt_id_seq = torch.tensor([[3,2,1,0], [2,1,0,0], [5,0,0,0]])

锦恢的博客 962
上一篇: VGG16模型原理讲解-手写代码解析VGG16模型
下一篇: ResNet-18网络模型+原理解析+Pytorch实现+手写模型
王_teacher
博客等级 码龄9年 118粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值