pytorch seq2seq模型示例

以下代码可以让你更加熟悉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

原文地址:https://www.cnblogs.com/demo-deng/p/11811090.html

时间: 2024-08-30 17:13:36

pytorch seq2seq模型示例的相关文章

pytorch seq2seq模型中加入teacher_forcing机制

在循环内加的teacher forcing机制,这种为目标确定的时候,可以这样加. 目标不确定,需要在循环外加. decoder.py 中的修改 """ 实现解码器 """ import torch.nn as nn import config import torch import torch.nn.functional as F import numpy as np import random class Decoder(nn.Module)

PyTorch 1.0 中文官方教程:混合前端的 seq2seq 模型部署

译者:cangyunye 作者: Matthew Inkawhich 本教程将介绍如何是seq2seq模型转换为PyTorch可用的前端混合Torch脚本. 我们要转换的模型是来自于聊天机器人教程 Chatbot tutorial. 你可以把这个教程当做Chatbot tutorial的第二篇章,并且部署你的预训练模型,或者你也可以依据本文使用我们采取的预训练模型.就后者而言,你可以从原始的Chatbot tutorial参考更详细的数据预处理,模型理论和定义以及模型训练. 什么是混合前端(Hy

opengl漫游模型示例

opengl漫游模型示例: #include <stdio.h> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtx/transform.hpp> #include <GLFW/glfw3.h> #include "TrackballController.h" #define CIGAMA 0.1 TrackballController* TrackballControlle

学习笔记CB014:TensorFlow seq2seq模型步步进阶

神经网络.<Make Your Own Neural Network>,用非常通俗易懂描述讲解人工神经网络原理用代码实现,试验效果非常好. 循环神经网络和LSTM.Christopher Olah http://colah.github.io/posts/2015-08-Understanding-LSTMs/ . seq2seq模型基于循环神经网络序列到序列模型,语言翻译.自动问答等序列到序列场景,都可用seq2seq模型,用seq2seq实现聊天机器人的原理 http://suriyade

seq2seq模型

一.什么是seq2seq模型 seq2seq全称为:sequence to sequence ,是2014年被提出来的一种Encoder-Decoder结构.其中Encoder是一个RNN结构(LSTM.GRU.RNN等). 主要思想是输入一个序列,通过encoder编码成一个语义向量c(context),然后decoder成输出序列.这个结构重要的地方在于输入序列和输出序列的长度是可变的. 应用场景:机器翻译.聊天机器人.文档摘要.图片描述等 二.Encoder-Decoder结构 最初Enc

Seq2Seq模型与注意力机制

Seq2Seq模型 基本原理 核心思想:将一个作为输入的序列映射为一个作为输出的序列 编码输入 解码输出 解码第一步,解码器进入编码器的最终状态,生成第一个输出 以后解码器读入上一步的输出,生成当前步输出 组成部件: Encoder Decoder 连接两者的固定大小的State Vector 解码方法 最核心部分,大部分的改进 贪心法 选取一种度量标准后,在当前状态下选择最佳的一个结果,直到结束 计算代价低 局部最优解 集束搜索(Beam Search) 启发式算法 保存beam size个当

吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--训练

import tensorflow as tf # 1.参数设置. # 假设输入数据已经用9.2.1小节中的方法转换成了单词编号的格式. SRC_TRAIN_DATA = "F:\\TensorFlowGoogle\\201806-github\\TensorFlowGoogleCode\\Chapter09\\train.en" # 源语言输入文件. TRG_TRAIN_DATA = "F:\\TensorFlowGoogle\\201806-github\\TensorF

动手学pytorch-注意力机制和Seq2Seq模型

注意力机制和Seq2Seq模型 1.基本概念 2.两种常用的attention层 3.带注意力机制的Seq2Seq模型 4.实验 动手学pytorch-注意力机制和Seq2Seq模型 原文地址:https://www.cnblogs.com/54hys/p/12317068.html

[Pytorch]深度模型的显存计算以及优化

原文链接:https://oldpan.me/archives/how-to-calculate-gpu-memory 前言 亲,显存炸了,你的显卡快冒烟了! torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/THC/generic/THCStorage.cu:58 想必这是所有炼丹师们最不想看到的错误,没有之一.