Pytorch的nn.module

本文介绍了一个使用PyTorch实现的卷积神经网络(CNN)模型,并通过具体的代码示例展示了如何构建网络结构、设置训练过程及评估模型性能。文章详细解释了各层的参数配置以及训练过程中使用的优化器和损失函数。
部署运行你感兴趣的模型镜像

包引入

import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable

定义类

class net(nn.Module):
	def __init__(self):
		super(net, self).__init__()
		self.conv1 = nn.sequential(
			nn.Conv2d(1, 16, kernal_size=5, padding = 1 ),
			 #输入深度1,输入深度16,卷积核5*5,0填充为1
			nn.BatchNorm2d(16),     #归一化
			nn.ReLU(),
			nn.MaxPool2d(2)), #池化,核是2
			
		self.conv2 = nn.sequential(
			nn.Conv2d(16, 32, kernal_size=2, padding = 1 ),
			 #输入深度1,输入深度16,卷积核5*5,0填充为1
			nn.BatchNorm2d(32),     #归一化
			nn.ReLU(),
			nn.MaxPool2d(3)), #池化,核是3
	
		self.fc = nn.Linear(32,2)  #全连接层
	
	def forward(self, x):
		out = self.conv1(x)
		out = self.conv2(out)
		out = out.view(out.size(0), -1) #一维是out.size(0),剩下的在2维
		out = self.fc(out)
		return out

注意:view函数只能由于contiguous的张量上,具体而言,就是在内存中连续存储的张量。具体而言,可以参看link。所以,当tensor之前调用了transpose, permute函数就会是tensor内存中变得不再连续,就不能调用view函数。
所以,应该提前做tensor.contiguous()的操作!

训练

def main():
    torch.set_default_tensor_type("torch.DoubleTensor")
    trainx = np.array([[[[0.0, 0, 1, 0, 0],
                         [0, 1, 1, 0, 0],
                         [0, 0, 1, 0, 0],
                         [0, 0, 1, 0, 0],
                         [1, 1, 1, 1, 1]]],
                       [[[0, 1, 1, 0, 0],
                         [1, 1, 1, 1, 0],
                         [1, 0, 1, 1, 0],
                         [0, 1, 1, 0, 0],
                         [1, 1, 1, 1, 1]]]])
    trainy = np.array([[1, 0.0], [0, 1]])
    N = net()

    trainx = torch.from_numpy(trainx)
    trainy = torch.from_numpy(trainy)
    print(trainx.shape)
    input()
    criterion = nn.MSELoss()  #平方损失函数
    optimizer = optim.SGD(N.parameters(), lr=1e-4) #随机梯度下降
    num_epochs = 10000

    for epoch in range(num_epochs):
        inputs = Variable(trainx)
        target = Variable(trainy)

        out = N(inputs)
        loss = criterion(out, target)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (epoch) % 50 == 0:
            print("loss:{}".format(loss.data))

    N.eval() #转变为测试模式
    predict = N(Variable(trainx))
    predict = predict.data.numpy()
    print(predict)
    pass


main()

在这里插入图片描述

在这里插入图片描述

转自:https://www.jianshu.com/p/76fb6e8e59e6
https://blog.youkuaiyun.com/m0_37586991/article/details/88371251

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### PyTorch 中 `nn.Module` 的使用方法 #### 定义神经网络模型 `nn.Module` 是 PyTorch 提供的一个基类,用于定义神经网络模型。通过继承此基类并重写其构造函数 (`__init__`) 和前向传播函数 (`forward`) 来创建自定义的神经网络模型[^3]。 ```python import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 初始化卷积层和其他组件 self.conv1 = nn.Conv2d(in_channels=1, out_channels=20, kernel_size=5) self.conv2 = nn.Conv2d(in_channels=20, out_channels=20, kernel_size=5) def forward(self, x): # 前向传播逻辑 x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) return x ``` 在此示例中,`SimpleCNN` 类继承了 `nn.Module` 并实现了两个主要部分: - **初始化阶段**:在 `__init__` 方法内完成,负责设置各种层对象(如卷积层),这些对象会被自动注册到模块内部以便后续管理和优化。 - **前向计算过程**:由 `forward` 函数描述,接收输入张量 `x` 并返回经过一系列变换后的输出张量。这里采用了激活函数 `F.relu()` 对每一层的结果进行了非线性转换[^4]。 #### 构建复杂结构 除了简单的单一层级外,`nn.Module` 还支持构建更为复杂的层次化架构。这可以通过组合多个子模块来实现,甚至可以嵌套其他 `nn.Module` 实例形成更深的层级关系[^5]。 例如,在上述基础上进一步扩展模型时,可以在新的类里引入更多类型的层或操作,并将它们合理组织起来构成完整的网络体系。 #### 参数管理与持久化 值得注意的是,基于 `nn.Module` 创建的对象不仅能够轻松地访问所有可学习参数,还提供了便捷的方法来进行状态保存和恢复工作。这意味着开发者可以直接利用内置接口高效处理模型权重文件的操作而不必手动编码繁琐的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值