【Pytorch】神经网络的基本骨架

news/2024/9/7 21:49:20 标签: 神经网络, pytorch, 深度学习

【Pytorch】神经网络的基本骨架

    • nn.module的基本使用
    • 卷积操作
    • 神经网络卷积层
    • 最大池化的使用-池化层

nn.module的基本使用

nn.module是所有神经网络的基本类,其他的所有神经网络都是继承该类,在此基础上进行修改。

在这里插入图片描述

在这里插入图片描述

上面的forward函数,首先进行卷积操作,然后进行一次非线性操作,然后进行卷积操作,非线性操作

module的简单使用

import torch
from torch import nn

class Tudui(nn.Module):

    #  初始化 父类
    def __init__(self):
        super().__init__()

    def  forward(self,input):
        output = input + 1
        return output
    
tudui  =Tudui()

x = torch.tensor(1.0)
output = tudui.forward(x)

print(output)


卷积操作

使用卷积核对输入的图像进行操作

在这里插入图片描述

stride=1 卷积核走一步

在这里插入图片描述

卷积之后的输出

在这里插入图片描述

二维卷积

import torch

#  导入卷积函数
import torch.nn.functional as F

#  输入二维矩阵 模拟一个图像
input = torch.tensor([[1,2,0,3,1],
                    [0,1,2,3,1],
                    [1,2,1,0,0],
                    [5,2,3,1,1],
                    [2,1,0,1,1]])

# 卷积核
kernel = torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])

#  batchsize 1 一个channel  5 x 5的图像
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))

print(input.shape)
print(kernel.shape)


#  进行卷积操作  步长为1
output = F.conv2d(input,kernel,stride = 1)
print(output)


#  卷积步长为2
output = F.conv2d(input,kernel,stride = 2)
print(output)

#  填充1
output = F.conv2d(input,kernel,stride = 1,padding = 1)
print(output)



在这里插入图片描述

神经网络卷积层

一个卷积核

在这里插入图片描述

两个卷积核
在这里插入图片描述

  • in_channels:输入通道数 由输入图像通道数决定
  • out_channels;输出通道数 由卷积核数量进行决定 也代表最终输出通道数
  • kernel_size:卷积核大小 控制输出大小
  • stride:步长,也控制输出大小
import torchvision
from torch.utils.data import DataLoader
from torch import nn
from torch.nn import Conv2d
from tensorboardX import SummaryWriter
import torch


# 转换成tensor张量形式 下载测试数据集
dataset = torchvision.datasets.CIFAR10("../data",train = False,transform = torchvision.transforms.ToTensor(),download = True)

#  每次取出64长图片
dataloader = DataLoader(dataset,batch_size = 64)


class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        #  6个卷积核 n x n

        #  比如图片是3 x 3的 使用6 个 3 x 3的卷积核进行卷积操作  得到6个输出  每一个卷积核不一样
        self.conv1 = Conv2d(in_channels = 3,out_channels=6,kernel_size=3,stride =1,padding=0)

    #  前向传播
    def forward(self,x):
        x = self.conv1(x)
        return x


tudui = Tudui()
print(tudui)


writer = SummaryWriter("../logs")

step = 0

for data in dataloader:
    imgs,targets = data # 拆分元组
    output = tudui.forward(imgs)

    #  打印原始大小 64 3 32 32
    print(imgs.shape)

    #  每次取出64张图片  每张图片原本是3个channel 经过卷积操作变成6个channel  每张图片都是30 x 30大小
    print(output.shape)

    writer.add_images("input",imgs,step)

    #  对output 进行一次reshape 然后进行显示 64 6 30 30  -》 ?3 30 30  将图片转换成三通道
    output = torch.reshape(output,(-1,3,30,30))
    writer.add_images("output",output,step)

    step = step + 1


最大池化的使用-池化层

每次取出卷积核范围内最大的那个数字

如果cell_model = true表示图像中的数字不足以覆盖卷积核 仍然取出最大值

在这里插入图片描述

Input: N C H W N 代表batchsize C代表通道数

import torch
from torch import nn
from torch.nn import MaxPool2d




input  = torch.tensor([[1,2,0,3,1],
                       [0,1,2,3,1],
                       [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]],dtype=torch.float32)

#  改变tensor的形状
input = torch.reshape(input,(-1,1,5,5))

print(input.shape)

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        #  定义池化操作 最大卷积操作
        self.maxpool1 = MaxPool2d(kernel_size = 3,ceil_mode = True)

    #  前向传播
    def forward(self,input):
        output = self.maxpool1(input)
        return output
    
tudui = Tudui()
#  前向传播
output = tudui.forward(input)
print(output)



http://www.niftyadmin.cn/n/215304.html

相关文章

(第十四届蓝桥真题) 整数删除(线段树+二分)

样例输入: 5 3 1 4 2 8 7 样例输出: 17 分析:这道题我想的比较复杂,不过复杂度还是够用的,我是用线段树二分来做的。 我们用线段树维护所有位置的最小值,那么我们每次删除一个数之前先求一遍最小值&a…

【Linux网络】网络基础(TCP/IP协议栈、局域网通信原理、封装与解包、有效载荷分用)

文章目录1、认识网络1.1 重新看待计算机结构1.2 网络的问题1.3 初识网络协议1.4 TCP/IP五层结构2、网络与操作系统2.1 网络和OS的关系2.2 局域网(以太网)通信原理和MAC地址2.3 主机的跨网络2.4 有效载荷的分用1、认识网络 在早年计算机之间是相互独立的…

Docker开启远程访问

一、修改配置文件 #修改配置文件 vim /etc/systemd/system/multi-user.target.wants/docker.service # 增加-H tcp://0.0.0.0[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socket firewa…

ChatGPT大规模封号+停止注册?最火概念会凉吗?

一、背景 这个周末,先是意大利暂时封杀ChatGPT,限制OpenAI处理本国用户信息。 接着,据韩国媒体报道,三星导入ChatGPT不到20天,便曝出机密资料外泄(涉及半导体设备测量资料、产品良率等内容,已…

C++ Primer第五版_第十三章习题答案(11~20)

文章目录练习13.11练习13.12练习13.13练习13.14练习13.15练习13.16练习13.17练习13.18练习13.19练习13.20练习13.11 为前面练习中的 HasPtr 类添加一个析构函数。 #ifndef ex13_11_h #define ex13_11_h#include <string>class HasPtr { public:HasPtr(const std::string …

opencv--可选颜色物体追踪函数

目录 一、函数介绍 1. cv2.createTrackbar() 2. cv2.getTrackbarPos() 3. bitwise_and() 4.cv2.morphologyEx() 5. cv2.GaussianBlur() 一、函数介绍 1. cv2.createTrackbar() 作用&#xff1a;创建一个滑动条 cv2.createTrackbar(Track_name, img, min, max, Trackbar…

[C++]vector类的模拟实现和相关函数的详解

文章目录架构实现默认构造函数构造函数拷贝构造为什么不能使用memcpy()进行拷贝&#xff08;浅拷贝问题&#xff09;析构函数赋值重载[]迭代器begin && end操作函数size() && capacity()push_back()reserve()resize()insert()erase()完整代码架构 首先由于自定…

[Java·算法·困难]LeetCode10. 正则表达式匹配

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1&#x1f449;️ 力扣原文 题目 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整…