PyTorch搭建网络模型流程总结

PyTorch搭建模型流程总结

​ 之前手动搭建的一个神经网络来实现MINIST识别问题,但是效果不好,正好课题需要使用PyTorch,也学习了一段时间,对搭建流程做一个总结,顺便看一下自己写的网络和torch相差多少~~

​ 使用PyTorch主要需要自己实现的部分就是 定义自己的网络 以及 定义自己的训练流程,下面也会对着两点分别讲述,最终使用之前MINIST的数据集进行训练。之前手动实现的

继承Module实现自己的层

nn.Module是一个模型构造类,我们可以继承他来实现自己想要的模型。在自己定义的新类里面只需要对Module的 __init__() 以及 forward() 两个方法进行重载即可。

​ 在__init__() 里面主要进行网络层的定义,将自己网络中所需要的层进行初始化。首先将定义自己所需的层,感觉一般需要的层在touch里面都已经定义好了,当然这里的层也可以是我们自己定义的,比如我们实现的一个网络,也可以作为一个层加入网络中作为网络的一部分。然后对模型参数进行初始化。以Bert的源码为例:

Bert参考部分源码

    def __init__(self, config, add_pooling_layer=True):
        super().__init__(config)
        self.config = config 
		
        #  首先定义了如下三层 其中每一层都是之前自定义的模型类的实例
        self.embeddings = BertEmbeddings(config) 
        self.encoder = BertEncoder(config)

        self.pooler = BertPooler(config) if add_pooling_layer else None
		#  接下来对所有参数进行初始化
        self.init_weights()

​ 那么为什么将模型实例化后加入自定义的类就可以将他们联系在一起进行训练了呢?是因为模型的参数都是Parameter类,只要将模型加入Module中 或者 将Parameter加入到Module中,就会自动将其添加到模型的参数列表,就可以进行后面自动梯度的计算。

​ 那么对于第二个方法forward()也需要重载,在这个方法里面主要规定前面定义的层之间的计算顺序问题。因为我们在前面定义的层都是作为模型的一个参数,是没有顺序的(也可以使用Sequential类进行更方便的实现模型,添加的顺序就是定义的顺序,但是这样不如自己实现一个类灵活)。对于计算,一般来说就可以按顺序,第一层的输出作为第二层的输入,以此计算,最后输出输出层的输出(套娃概念,不愧是我~~~)。那么还是以Bert为例,但是这里只截取重要的部分:

embedding_output = self.embeddings(
    input_ids=input_ids,
    position_ids=position_ids,
    token_type_ids=token_type_ids,
    inputs_embeds=inputs_embeds,
    past_key_values_length=past_key_values_length,
)
encoder_outputs = self.encoder(
    embedding_output, #  这里就是上一层的输出
    attention_mask=extended_attention_mask,
    head_mask=head_mask,
    encoder_hidden_states=encoder_hidden_states,
    encoder_attention_mask=encoder_extended_attention_mask,
    past_key_values=past_key_values,
    use_cache=use_cache,
    output_attentions=output_attentions,
    output_hidden_states=output_hidden_states,
    return_dict=return_dict,
)
sequence_output = encoder_outputs[0]
pooled_output = self.pooler(sequence_output) if self.pooler is not None else None # 这里也一样

if not return_dict:
	return (sequence_output, pooled_output) + encoder_outputs[1:]

return BaseModelOutputWithPoolingAndCrossAttentions(
    last_hidden_state=sequence_output,
    pooler_output=pooled_output,
    past_key_values=encoder_outputs.past_key_values,
    hidden_states=encoder_outputs.hidden_states,
    attentions=encoder_outputs.attentions,
    cross_attentions=encoder_outputs.cross_attentions,
)

​ 那么我们可以定义神经网络如下:

import torch
from torch import nn
# 定义神经网络
class ANN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size ):
        super().__init__()
        
        self.hidden_linear = nn.Linear(input_size, hidden_size)    
        self.relu = nn.ReLU()
        
        self.output_linear = nn.Linear(hidden_size, output_size)
        
        for params in self.parameters(): # 随机初始化参数
            nn.init.normal_(params,mean=0,std=
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch搭建神经网络可以分为以下几个步骤: 1. 导入必要的库和模块 ```python import torch import torch.nn as nn import torch.optim as optim ``` 2. 定义神经网络结构 在 PyTorch 中,可以通过继承 nn.Module 类来定义神经网络结构。具体来说,需要在 __init__ 方法中定义网络的各个层,以及在 forward 方法中定义前向传播的流程。 ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 上面的代码定义了一个简单的卷积神经网络,包含两个卷积层、两个池化层和三个全连接层。 3. 定义损失函数和优化器 在训练神经网络时,需要定义损失函数和优化器。PyTorch 中提供了多种常见的损失函数和优化器,可以根据实际情况选择使用。 ```python criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 上面的代码定义了交叉熵损失函数和随机梯度下降优化器。 4. 训练神经网络 在定义好神经网络结构、损失函数和优化器后,就可以开始训练神经网络了。训练过程包括多个 epoch,每个 epoch 中包含多个 batch。 ```python for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 ``` 上面的代码展示了训练神经网络的过程,其中 trainloader 是一个 DataLoader 对象,用于加载训练数据。在每个 batch 中,需要先将 optimizer 的梯度清零,然后计算预测值和损失,最后反向传播更新参数。 5. 使用训练好的神经网络进行预测 在训练好神经网络后,可以使用它来进行预测。具体来说,需要将测试数据输入到神经网络中,然后得到预测结果。 ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 上面的代码展示了使用训练好的神经网络进行预测的过程。其中 testloader 是一个 DataLoader 对象,用于加载测试数据。在预测过程中,需要将输出结果转换为概率值,然后取最大概率对应的类别作为预测结果。最后可以计算模型的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值