返回顶部
首页 > 资讯 > 后端开发 > Python >pytorch 如何使用batch训练lstm网络
  • 291
分享到

pytorch 如何使用batch训练lstm网络

2024-04-02 19:04:59 291人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

batch的lstm # 导入相应的包 import torch import torch.nn as nn import torch.nn.functional as F im

batch的lstm


# 导入相应的包
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.utils.data as Data 
torch.manual_seed(1) 
 
# 准备数据的阶段
def prepare_sequence(seq, to_ix):
    idxs = [to_ix[w] for w in seq]
    return torch.tensor(idxs, dtype=torch.long)
  
with open("/home/lstm_train.txt", encoding='utf8') as f:
    train_data = []
    Word = []
    label = []
    data = f.readline().strip()
    while data:
        data = data.strip()
        SP = data.split(' ')
        if len(SP) == 2:
            word.append(SP[0])
            label.append(SP[1])
        else:
            if len(word) == 100 and 'I-PRO' in label:
                train_data.append((word, label))
            word = []
            label = []
        data = f.readline()
 
word_to_ix = {}
for sent, _ in train_data:
    for word in sent:
        if word not in word_to_ix:
            word_to_ix[word] = len(word_to_ix)
 
tag_to_ix = {"O": 0, "I-PRO": 1}
for i in range(len(train_data)):
    train_data[i] = ([word_to_ix[t] for t in train_data[i][0]], [tag_to_ix[t] for t in train_data[i][1]])
 
# 词向量的维度
EMBEDDING_DIM = 128
 
# 隐藏层的单元数
HIDDEN_DIM = 128
 
# 批大小
batch_size = 10  
class LSTMTagger(nn.Module):
 
    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size, batch_size):
        super(LSTMTagger, self).__init__()
        self.hidden_dim = hidden_dim
        self.batch_size = batch_size
        self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
 
        # The LSTM takes word embeddings as inputs, and outputs hidden states
        # with dimensionality hidden_dim.
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
 
        # The linear layer that maps from hidden state space to tag space
        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
 
    def forward(self, sentence):
        embeds = self.word_embeddings(sentence)
        # input_tensor = embeds.view(self.batch_size, len(sentence) // self.batch_size, -1)
        lstm_out, _ = self.lstm(embeds)
        tag_space = self.hidden2tag(lstm_out)
        scores = F.log_softmax(tag_space, dim=2)
        return scores
 
    def predict(self, sentence):
        embeds = self.word_embeddings(sentence)
        lstm_out, _ = self.lstm(embeds)
        tag_space = self.hidden2tag(lstm_out)
        scores = F.log_softmax(tag_space, dim=2)
        return scores 
 
loss_function = nn.NLLLoss()
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix), batch_size)
optimizer = optim.SGD(model.parameters(), lr=0.1)
 
data_set_word = []
data_set_label = []
for data_tuple in train_data:
    data_set_word.append(data_tuple[0])
    data_set_label.append(data_tuple[1])
torch_dataset = Data.TensorDataset(torch.tensor(data_set_word, dtype=torch.long), torch.tensor(data_set_label, dtype=torch.long))
# 把 dataset 放入 DataLoader
loader = Data.DataLoader(
    dataset=torch_dataset,  # torch TensorDataset fORMat
    batch_size=batch_size,  # mini batch size
    shuffle=True,  #
    num_workers=2,  # 多线程来读数据
)
 
# 训练过程
for epoch in range(200):
    for step, (batch_x, batch_y) in enumerate(loader):
        # 梯度清零
        model.zero_grad()
        tag_scores = model(batch_x)
 
        # 计算损失
        tag_scores = tag_scores.view(-1, tag_scores.shape[2])
        batch_y = batch_y.view(batch_y.shape[0]*batch_y.shape[1])
        loss = loss_function(tag_scores, batch_y)
        print(loss)
        # 后向传播
        loss.backward()
 
        # 更新参数
        optimizer.step()
 
# 测试过程
with torch.no_grad():
    inputs = torch.tensor([data_set_word[0]], dtype=torch.long)
    print(inputs)
    tag_scores = model.predict(inputs)
    print(tag_scores.shape)
    print(torch.argmax(tag_scores, dim=2))

补充:PyTorch基础-使用LSTM神经网络实现手写数据集识别

看代码吧~


import numpy as np
import torch
from torch import nn,optim
from torch.autograd import Variable
from torchvision import datasets,transforms
from torch.utils.data import DataLoader

# 训练集
train_data = datasets.MNIST(root="./", # 存放位置
                            train = True, # 载入训练集
                            transform=transforms.ToTensor(), # 把数据变成tensor类型
                            download = True # 下载
                           )
# 测试集
test_data = datasets.MNIST(root="./",
                            train = False,
                            transform=transforms.ToTensor(),
                            download = True
                           )

# 批次大小
batch_size = 64
# 装载训练集
train_loader = DataLoader(dataset=train_data,batch_size=batch_size,shuffle=True)
# 装载测试集
test_loader = DataLoader(dataset=test_data,batch_size=batch_size,shuffle=True)

for i,data in enumerate(train_loader):
    inputs,labels = data
    print(inputs.shape)
    print(labels.shape)
    break

# 定义网络结构
class LSTM(nn.Module):
    def __init__(self):
        super(LSTM,self).__init__()# 初始化
        self.lstm = torch.nn.LSTM(
            input_size = 28, # 表示输入特征的大小
            hidden_size = 64, # 表示lstm模块的数量
            num_layers = 1, # 表示lstm隐藏层的层数
            batch_first = True # lstm默认格式input(seq_len,batch,feature)等于True表示input和output变成(batch,seq_len,feature)
        )
        self.out = torch.nn.Linear(in_features=64,out_features=10)
        self.softmax = torch.nn.Softmax(dim=1)
    def forward(self,x):
        # (batch,seq_len,feature)
        x = x.view(-1,28,28)
        # output:(batch,seq_len,hidden_size)包含每个序列的输出结果
        # 虽然lstm的batch_first为True,但是h_n,c_n的第0个维度还是num_layers
        # h_n :[num_layers,batch,hidden_size]只包含最后一个序列的输出结果
        # c_n:[num_layers,batch,hidden_size]只包含最后一个序列的输出结果
        output,(h_n,c_n) = self.lstm(x)
        output_in_last_timestep = h_n[-1,:,:]
        x = self.out(output_in_last_timestep)
        x = self.softmax(x)
        return x

# 定义模型
model = LSTM()
# 定义代价函数
mse_loss = nn.CrossEntropyLoss()# 交叉熵
# 定义优化器
optimizer = optim.Adam(model.parameters(),lr=0.001)# 随机梯度下降

# 定义模型训练和测试的方法
def train():
    # 模型的训练状态
    model.train()
    for i,data in enumerate(train_loader):
        # 获得一个批次的数据和标签
        inputs,labels = data
        # 获得模型预测结果(64,10)
        out = model(inputs)
        # 交叉熵代价函数out(batch,C:类别的数量),labels(batch)
        loss = mse_loss(out,labels)
        # 梯度清零
        optimizer.zero_grad()
        # 计算梯度
        loss.backward()
        # 修改权值
        optimizer.step()
        
def test():
    # 模型的测试状态
    model.eval()
    correct = 0 # 测试集准确率
    for i,data in enumerate(test_loader):
        # 获得一个批次的数据和标签
        inputs,labels = data
        # 获得模型预测结果(64,10)
        out = model(inputs)
        # 获得最大值,以及最大值所在的位置
        _,predicted = torch.max(out,1)
        # 预测正确的数量
        correct += (predicted==labels).sum()
    print("Test acc:{0}".format(correct.item()/len(test_data)))
    
    correct = 0
    for i,data in enumerate(train_loader): # 训练集准确率
        # 获得一个批次的数据和标签
        inputs,labels = data
        # 获得模型预测结果(64,10)
        out = model(inputs)
        # 获得最大值,以及最大值所在的位置
        _,predicted = torch.max(out,1)
        # 预测正确的数量
        correct += (predicted==labels).sum()
    print("Train acc:{0}".format(correct.item()/len(train_data)))

# 训练
for epoch in range(10):
    print("epoch:",epoch)
    train()
    test()

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: pytorch 如何使用batch训练lstm网络

本文链接: https://lsjlt.com/news/127083.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pytorch 如何使用batch训练lstm网络
    batch的lstm # 导入相应的包 import torch import torch.nn as nn import torch.nn.functional as F im...
    99+
    2024-04-02
  • 使用PyTorch训练LSTM时出现loss.backward()报错如何解决
    使用PyTorch训练LSTM时出现loss.backward()报错如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。正确做法:LSRM / RNN模...
    99+
    2023-06-15
  • 使用Pytorch训练two-head网络的操作
    之前有写过一篇如何使用Pytorch实现two-head(多输出)模型 在那篇文章里,基本把two-head网络以及构建讲清楚了(如果不清楚请先移步至那一篇博文)。 但是我后来发现之...
    99+
    2024-04-02
  • pytorch 如何使用float64训练
    pytorch默认使用单精度float32训练模型, 原因在于: 使用float16训练模型,模型效果会有损失,而使用double(float64)会有2倍的内存压力,且不会带来太多...
    99+
    2024-04-02
  • Pytorch 如何训练网络时调整学习率
    为了得到更好的网络,学习率通常是要调整的,即刚开始用较大的学习率来加快网络的训练,之后为了提高精确度,需要将学习率调低一点。 如图所示,步长(学习率)太大容易跨过最优解。 代码如下...
    99+
    2024-04-02
  • 如何使用Pytorch训练分类器
    如何使用Pytorch训练分类器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 数据通常来说,当你处理图像,文本,语音或者视频数据时,你可以使用标准python包将数据加载...
    99+
    2023-06-02
  • Pytorch 使用Google Colab训练神经网络深度学习
    目录学习前言什么是Google Colab相关链接利用Colab进行训练一、数据集与预训练权重的上传1、数据集的上传2、预训练权重的上传二、打开Colab并配置环境1、笔记本的创建2...
    99+
    2024-04-02
  • Pytorch怎么使用Google Colab训练神经网络深度
    本篇内容介绍了“Pytorch怎么使用Google Colab训练神经网络深度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是...
    99+
    2023-06-30
  • 使用Pytorch怎么实现半精度浮点型网络训练
    今天就跟大家聊聊有关使用Pytorch怎么实现半精度浮点型网络训练,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。用Pytorch2.0进行半精度浮点型网络训练需要注意下问题:网络要在...
    99+
    2023-06-15
  • PyTorch中如何使用预训练的模型
    在PyTorch中使用预训练的模型可以通过torchvision库中的models模块实现。该模块包含了一些常用的预训练模型,如Re...
    99+
    2024-03-05
    PyTorch
  • 使用Pytorch 2.0训练踩坑
    概述 最近博主在跑一个实验,但它在Pytorch 1.8版本下感觉有点慢,刚好又看到Pytorch 2.0版本加速很多,所以准备用Pytorch 2.0版本运行代码。在这个过程中,出现了一些小问题,还...
    99+
    2023-09-22
    pytorch 深度学习 python
  • pytorch 如何在GPU上训练
    1.网络模型转移到CUDA上 net = AlexNet() net.cuda()#转移到CUDA上 2.将loss转移到CUDA上 criterion = nn.Cros...
    99+
    2024-04-02
  • 利用Pytorch实现ResNet网络构建及模型训练
    目录构建网络训练模型构建网络 ResNet由一系列堆叠的残差块组成,其主要作用是通过无限制地增加网络深度,从而使其更加强大。在建立ResNet模型之前,让我们先定义4个层,每个层由多...
    99+
    2023-05-17
    Pytorch ResNet构建网络模型训练 Pytorch ResNet
  • 详解如何使用Pytorch进行多卡训练
    目录1.DP2.DDP2.1Pytorch分布式基础2.2Pytorch分布式训练DEMO当一块GPU不够用时,我们就需要使用多卡进行并行训练。其中多卡并行可分为数据并行和模型并行。...
    99+
    2024-04-02
  • 如何在python中使用Tensorflow训练BP神经网络
    如何在python中使用Tensorflow训练BP神经网络?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用软件Python 3.8,Tensorflow2.0问题描述鸢...
    99+
    2023-06-15
  • pytorch如何调用训练好的模型
    要调用训练好的模型,首先需要加载模型的参数,并将其应用到一个 PyTorch 模型中。以下是一个简单的示例代码,展示如何加载模型参数...
    99+
    2024-04-02
  • pytorch 如何使用amp进行混合精度训练
    简介 AMP:Automatic mixed precision,自动混合精度,可以在神经网络推理过程中,针对不同的层,采用不同的数据精度进行计算,从而实现节省显存和加快速度的目的。...
    99+
    2024-04-02
  • pytorch训练神经网络爆内存的解决方案
    训练的时候内存一直在增加,最后内存爆满,被迫中断。 后来换了一个电脑发现还是这样,考虑是代码的问题。 检查才发现我的代码两次存了loss,只有一个地方写的是loss.item()。...
    99+
    2024-04-02
  • 怎么在pytorch中使用float64训练
    怎么在pytorch中使用float64训练?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原因在于:使用float16训练模型,模型效果会有损失,而使用double(float...
    99+
    2023-06-15
  • 详解利用Pytorch实现ResNet网络之评估训练模型
    目录正文评估模型训练 ResNet50 模型正文 每个 batch 前清空梯度,否则会将不同 batch 的梯度累加在一块,导致模型参数错误。 然后我们将输入和目标张量都移动到所需的...
    99+
    2023-05-16
    Pytorch ResNet网络 Pytorch ResNet
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作