以下代码可以让你更加熟悉seq2seq模型机制

"""
test
"""
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable # 创建字典
seq_data = [['man', 'women'], ['black', 'white'], ['king', 'queen'], ['girl', 'boy'], ['up', 'down'], ['high', 'low']]
char_arr = [c for c in 'SEPabcdefghijklmnopqrstuvwxyz']
num_dict = {n:i for i,n in enumerate(char_arr)} # 网络参数
n_step = 5
n_hidden = 128
n_class = len(num_dict)
batch_size = len(seq_data) # 准备数据
def make_batch(seq_data):
input_batch, output_batch, target_batch =[], [], [] for seq in seq_data:
for i in range(2):
seq[i] = seq[i] + 'P' * (n_step-len(seq[i]))
input = [num_dict[n] for n in seq[0]]
ouput = [num_dict[n] for n in ('S'+ seq[1])]
target = [num_dict[n] for n in (seq[1]) + 'E'] input_batch.append(np.eye(n_class)[input])
output_batch.append(np.eye(n_class)[ouput])
target_batch.append(target) return Variable(torch.Tensor(input_batch)), Variable(torch.Tensor(output_batch)), Variable(torch.LongTensor(target_batch)) input_batch, output_batch, target_batch = make_batch(seq_data) # 创建网络
class Seq2Seq(nn.Module):
"""
要点:
1.该网络包含一个encoder和一个decoder,使用的RNN的结构相同,最后使用全连接接预测结果
2.RNN网络结构要熟知
3.seq2seq的精髓:encoder层生成的参数作为decoder层的输入
"""
def __init__(self):
super().__init__()
# 此处的input_size是每一个节点可接纳的状态,hidden_size是隐藏节点的维度
self.enc = nn.RNN(input_size=n_class, hidden_size=n_hidden, dropout=0.5)
self.dec = nn.RNN(input_size=n_class, hidden_size=n_hidden, dropout=0.5)
self.fc = nn.Linear(n_hidden, n_class) def forward(self, enc_input, enc_hidden, dec_input):
# RNN要求输入:(seq_len, batch_size, n_class),这里需要转置一下
enc_input = enc_input.transpose(0,1)
dec_input = dec_input.transpose(0,1)
_, enc_states = self.enc(enc_input, enc_hidden)
outputs, _ = self.dec(dec_input, enc_states)
pred = self.fc(outputs) return pred # training
model = Seq2Seq()
loss_fun = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001) for epoch in range(5000):
hidden = Variable(torch.zeros(1, batch_size, n_hidden)) optimizer.zero_grad()
pred = model(input_batch, hidden, output_batch)
pred = pred.transpose(0, 1)
loss = 0
for i in range(len(seq_data)):
temp = pred[i]
tar = target_batch[i]
loss += loss_fun(pred[i], target_batch[i])
if (epoch + 1) % 1000 == 0:
print('Epoch: %d Cost: %f' % (epoch + 1, loss))
loss.backward()
optimizer.step() # 测试
def translate(word):
input_batch, output_batch, _ = make_batch([[word, 'P' * len(word)]])
# hidden 形状 (1, 1, n_class)
hidden = Variable(torch.zeros(1, 1, n_hidden))
# output 形状(6,1, n_class)
output = model(input_batch, hidden, output_batch)
predict = output.data.max(2, keepdim=True)[1]
decoded = [char_arr[i] for i in predict]
end = decoded.index('E')
translated = ''.join(decoded[:end]) return translated.replace('P', '') print('girl ->', translate('girl'))

参考:https://blog.csdn.net/weixin_43632501/article/details/98525673

pytorch seq2seq模型示例的更多相关文章

  1. pytorch seq2seq模型中加入teacher_forcing机制

    在循环内加的teacher forcing机制,这种为目标确定的时候,可以这样加. 目标不确定,需要在循环外加. decoder.py 中的修改 """ 实现解码器 &q ...

  2. pytorch seq2seq模型训练测试

    num_sequence.py """ 数字序列化方法 """ class NumSequence: """ ...

  3. PyTorch专栏(六): 混合前端的seq2seq模型部署

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/ 欢迎关注PyTorch官方中文教程站: http://pytorch.panchuang.net/ 专栏目录: 第一 ...

  4. 混合前端seq2seq模型部署

    混合前端seq2seq模型部署 本文介绍,如何将seq2seq模型转换为PyTorch可用的前端混合Torch脚本.要转换的模型来自于聊天机器人教程Chatbot tutorial. 1.混合前端 在 ...

  5. 时间序列深度学习:seq2seq 模型预测太阳黑子

    目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...

  6. seq2seq模型详解及对比(CNN,RNN,Transformer)

    一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...

  7. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  8. pytorch生成对抗示例

    pytorch生成对抗示例 本文对ML(机器学习)模型的安全漏洞的认识,并将深入了解对抗性机器学习的热门话题.图像添加难以察觉的扰动会导致模型性能大不相同.通过图像分类器上的示例探讨该主题.使用第一种 ...

  9. [炼丹术]使用Pytorch搭建模型的步骤及教程

    使用Pytorch搭建模型的步骤及教程 我们知道,模型有一个特定的生命周期,了解这个为数据集建模和理解 PyTorch API 提供了指导方向.我们可以根据生命周期的每一个步骤进行设计和优化,同时更加 ...

随机推荐

  1. Python中的函数(高级使用)

    一.将函数作为变量去使用 在Python中函数也是一种对象,是一种名为function的对象,所以可以将函数赋值给变量,类似整数.浮点数.列表.元组.字典赋值给变量. 我们编写如下程序: #codin ...

  2. Django2.0版本以上与pymsql 不匹配问题以及解决方法

    Django2.0版本以上与pymsql 不匹配问题以及解决方法 Django 2.0 以上 如果使用pymysql0.93,需要一下两步操作: # 1 第一次报错信息: File "D:\ ...

  3. error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

    出现如下错误: error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 解决办法:

  4. 【转】Git使用教程之基础篇

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...

  5. Java集合学习(10):hashcode() 和 equals()方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  6. 由MQTT topic的正则表达式匹配引发的特殊字符"/"匹配思考

    正则表达式中的'/'替换 近期项目对接OneNET的MQTT物联网套件,需要完成命令下发流程. 流程要求: (1)设备在接收平台下发的命令(topic为$sys/{pid}/{device-name} ...

  7. JVM常见面试题及答案

    11.JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下一个区: 方法区:1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区 ...

  8. 软件架构的演进,了解单体架构,垂直架构,SOA架构和微服务架构的变化历程

    软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程,博客里写到了这四种架它们的特点以及优缺点分析,个人学习之用,仅供参考! 1.1.1      单体架构 特点: 1 ...

  9. 堆叠降噪自编码器SDAE

    https://blog.csdn.net/satlihui/article/details/81006906 https://blog.csdn.net/github_39611196/articl ...

  10. 配置管理-git研究(版本管理)

    1. 安装git2.7 git2.7具体安装步骤如下: [root@host1 ~]# yum install curl-devel expat-devel gettext-devel openssl ...