Pytorch学习 day09(简单神经网络模型的搭建)

简单神经网络模型的搭建

  • 针对CIFAR 10数据集的神经网络模型结构如下图:
    在这里插入图片描述
  • 由于上图的结构没有给出具体的padding、stride的值,所以我们需要根据以下公式,手动推算:
    • 注意:当stride太大时,padding也会变得很大,这不合理,所以stride从1开始推,dilation没有特殊说明为空洞卷积的话(默认为1)
      在这里插入图片描述
    • 第一个卷积层的padding、stride如下:
      在这里插入图片描述
  • 网络模型代码如下:
import torch.nn
from torch import nnclass Tudui(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 32, 5, 1, 2)self.maxpool1 = nn.MaxPool2d(2,2)self.conv2 = nn.Conv2d(32, 32, 5, 1, 2)self.maxpool2 = nn.MaxPool2d(2,2)self.conv3 = nn.Conv2d(32, 64, 5, 1, 2)self.maxpool3 = nn.MaxPool2d(2,2)self.flatten = nn.Flatten()# flatten也有层,跟torch.flatten()用法不一样,flatten层不会合并batch_size,只会将batch_size内的每个样本的数据展平,但是torch.flatten()会将整个输入数据展平,即会合并batch_sizeself.linear1 = nn.Linear(1024, 64)self.linear2 = nn.Linear(64, 10) # 为什么最后的输出是10,因为CIFAR10有10个类别,最后输出各类别的概率,取最大的那个概率对应的类别作为预测结果def forward(self, input):x = self.conv1(input)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.maxpool3(x)x = self.flatten(x)x = self.linear1(x)output = self.linear2(x)return outputtudui = Tudui()
# 通过ones()函数创建一个全1的tensor,作为输入数据,我们只需要指定输入数据的形状即可
# 我们可以通过ones()创建的简单输入,来检测网络的结构是否正确
input = torch.ones([64,3,32,32])
print(tudui)
output = tudui(input)
print(output.shape)  # 输出的shape为[64, 10],即每个样本的输出是10个类别的概率# 输出结果:
# Tudui(
#   (conv1): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#   (maxpool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   (conv2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#   (maxpool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   (conv3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#   (maxpool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#   (flatten): Flatten(start_dim=1, end_dim=-1)
#   (linear1): Linear(in_features=1024, out_features=64, bias=True)
#   (linear2): Linear(in_features=64, out_features=10, bias=True)
# )
# torch.Size([64, 10])
  • 我们可以使用sequential来合并各种层,简化代码,如下:
import torch.nn
from torch import nnclass Tudui(nn.Module):def __init__(self):super().__init__()self.module1 = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, input):output = self.module1(input)return outputtudui = Tudui()
# 通过ones()函数创建一个全1的tensor,作为输入数据,我们只需要指定输入数据的形状即可
input = torch.ones([64,3,32,32])
print(tudui)
output = tudui(input)
print(output.shape)  # 输出的shape为[64, 10],即每个样本的输出是10个类别的概率# 输出结果:
# Tudui(
#   (module1): Sequential(
#     (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#     (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#     (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#     (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#     (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
#     (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
#     (6): Flatten(start_dim=1, end_dim=-1)
#     (7): Linear(in_features=1024, out_features=64, bias=True)
#     (8): Linear(in_features=64, out_features=10, bias=True)
#   )
# )
# torch.Size([64, 10])
  • 也可以使用tensorboard来可视化模型,代码如下:
import torch.nn
from torch import nn
from torch.utils.tensorboard import SummaryWriterclass Tudui(nn.Module):def __init__(self):super().__init__()self.module1 = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, input):output = self.module1(input)return outputwriter = SummaryWriter('logs_seq')
tudui = Tudui()
# 通过ones()函数创建一个全1的tensor,作为输入数据,我们只需要指定输入数据的形状即可
input = torch.ones([64,3,32,32])
print(tudui)
output = tudui(input)
print(output.shape)  # 输出的shape为[64, 10],即每个样本的输出是10个类别的概率
writer.add_graph(tudui, input)  # 将模型和输入数据写入TensorBoard
writer.close()
  • 结果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/272954.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频推拉流EasyDSS平台直播通道重连无法转推的原因排查与解决

视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推,发现只要关闭…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

【滑动窗口】力扣239.滑动窗口最大值

前面的文章我们练习数十道 动态规划 的题目。相信小伙伴们对于动态规划的题目已经写的 得心应手 了。 还没看过的小伙伴赶快关注一下,学习如何 秒杀动态规划 吧! 接下来我们开启一个新的篇章 —— 「滑动窗口」。 滑动窗口 滑动窗口 是一种基于 双指…

03.axios数据提交和错误处理

一.axios常用请求方法和数据提交 1. 想要提交数据,先来了解什么是请求方法 请求方法是一些固定单词的英文,例如:GET,POST,PUT,DELETE,PATCH(这些都是http协议规定的)&am…

axios的详细使用

目录 axios:现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios&#xff1a…

vue中性能优化

目录 1. 编码优化 2. 源码优化 3. 打包优化 4. 利用 Vue Devtools 总结 Vue.js 作为一个强大的前端框架,提供了丰富的功能和工具来帮助开发者构建高效的 Web 应用。然而,在开发过程中,性能优化仍然是一个需要关注的问题。以下是对 Vue.j…

3/7—21. 合并两个有序链表

代码实现: 方法1:递归 ---->难点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {/*1.如果l1为…

Luajit 2023移动版本编译 v2.1.ROLLING

文章顶部有编好的 2.1.ROLLING 2023/08/21版本源码 Android 64 和 iOS 64 luajit 目前最新的源码tag版本为 v2.1.ROLLING on Aug 21, 2023应该是修正了很多bug, 我是出现下面问题才编的. cocos2dx-lua 游戏 黑屏 并报错: [LUA ERROR] bad light userdata pointer 编…

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接:https://leetcode-cn.com/problems/rotate-array/ 题目: 思路: 通过题目我们可以知道这是一个无序数组,只需要将数组中的数按给定条件重新排列,因此我们可以想到以下几种方法: 1.暴力求解法…

详解DNS服务

华子目录 概述产生原因作用连接方式 因特网的域名结构拓扑分类域名服务器类型划分 DNS域名解析过程分类解析图图过程分析注意 搭建DNS域名解析服务器概述安装软件bind服务中的三个关键文件 配置文件分析主配置文件共4部分组成区域配置文件作用区域配置文件示例分析正向解析反向…

Linux 之七:Linux 防火墙 和进程管理

防火墙 查看防火墙 查看 Centos7 的防火墙的状态 sudo systemctl status firewalld。 查看后,看到active(running)就意味着防火墙打开了。 关闭防火墙,命令为: sudo systemctl stop firewalld。 关闭后查看是否关闭成功,如果…

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步,不再需要借助回调函数,让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今,音频内容与形式日渐丰富,可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用,音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…

14 OpenCv边缘处理

文章目录 卷积边界问题边缘处理copyMakeBorder 算子代码 卷积边界问题 图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘…

关于 JVM

1、请你谈谈你对JVM的理解? JVM由JVM运行时数据区(图示中蓝色框包含部分)、执行引擎、本地库接口、本地方法库组成。 JVM运行时数据区,分为方法区、堆、虚拟机栈、本地方法栈和程序计数器。 1.方法区 Java 虚拟机规范中定…

实验一:华为VRP系统的基本操作

1.1实验介绍 1.1.1关于本实验 本实验通过配置华为设备,了解并熟悉华为VRP系统的基本操作 1.1.2实验目的 理解命令行视图的含义以及进入离开命令行视图的方法 掌握一些常见的命令 掌握命令行在线帮助的方法 掌握如何撤销命令 掌握如何使用命令快捷键 1.1.3实验组网 …

将Xilinx DDR3 MIG IP核的APP接口封装成FIFO接口(含源码)

1、概括 前文完成了xilinx DDR3 MIG IP的仿真和上板测试,对MIG IP的读、写需要去通过使能信号和应答信号进行握手。这对于图像处理、AD采集等大量数据的存储不太方便,常见的使用方式是把MIG IP的用户接口封装成FIFO的接口。 如下图所示,如果要…

深入浅出计算机网络 day.1 概论③ 电路交换、分组交换和报文交换

人无法同时拥有青春和对青春的感受 —— 04.3.9 内容概述 01.电路交换、分组交换和报文交换 02.三种交换方式的对比 一、电路交换、分组交换和报文交换 1.电路交换 计算机之间的数据传送是突发式的,当使用电路交换来传送计算机数据时,其线路的传输效率一…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前,我们先来了解一下作为生产管理信息化的关键部分,车间管理系统包含哪几个部分:一、mes系统中的车间管理通常包含以下部分: 1、设备管理:用于监控车间内的设备状态&#xf…

C语言:编译和链接(从.c文件到输出结果的过程)

和黛玉学编程.......> 前言 在ANSI C中,有两个不同的环境 1.翻译环境 2.执行环境 我们在打开编程软件的时候,需要在源文件上添加 如果是C语言,需要使用.C的源文件,是C的话,就是.cpp, 我们创建的.c文件…