- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
官方文档: Sequential — PyTorch 2.0 documentation 。
# Using Sequential to create a small model. When `model` is run,
# input will first be passed to `Conv2d(1,20,5)`. The output of
# `Conv2d(1,20,5)` will be used as the input to the first
# `ReLU`; the output of the first `ReLU` will become the input
# for `Conv2d(20,64,5)`. Finally, the output of
# `Conv2d(20,64,5)` will be used as input to the second `ReLU`
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
在第一个变量名model中,依次执行 nn.Convd2d(1,20,5) 、 nn.ReLU() 、 nn.Conv2d(20,64,5) 、 nn.ReLU() 四个函数。这样写起来的好处是使代码 更简洁 .
由此可见,函数 \(Sequential\) 的主要作用为 依次执行 括号内的函数 。
采用 \(CIFAR10\) 中的数据,并对其进行简单的分类。以下图为例:
以上,就是CIFAR10模型的结构。本节的代码也基于CIFAR10 model的结构构建.
输入图像为3通道,输出图像为32通道,故: \(in\_channels=3\) ; \(out\_channels=32\) 。
卷积核尺寸为 \(5×5\) 。
图像经过卷积层conv1前后的尺寸均为32×32,根据公式:
可得:
即:
若 \(stride[0]\) 或 \(stride[1]\) 设置为2,那么上面的 \(padding\) 也会随之扩展为一个很大的数,这很不合理。所以这里设置: \(stride[0]=stride[1]=1\) ,由此可得: \(padding[0]=padding[1]=2\) 。
其余卷积层的参数设计及计算方法均 同上 .
其余最大池化参数设计方法均 同上 .
通过三次卷积和最大池化操作后,图像尺寸变为64通道4×4。之后使用 \(Flatten()\) 函数将图像展成一列,此时图像尺寸变为:1×(64×4×4),即 \(1×1024\) 。
因此,之后通过第一个线性层, \(in\_features=1024\) , \(out\_features=64\) 。
通过第二个线性层, \(in\_features=64\) , \(out\_features=10\) 。
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
class Demo(nn.Module):
def __init__(self):
super(Demo,self).__init__()
# 搭建第一个卷积层:in_channels=3,out_channels=32,卷积核尺寸为5×5,通过计算得出:padding=2;stride默认情况下为1,不用设置
self.conv1=Conv2d(3,32,5,padding=2)
# 第一个最大池化操作,kennel_size=2
self.maxpool1=MaxPool2d(2)
# 第二个卷积层及最大池化操作
self.conv2=Conv2d(32,32,5,padding=2)
self.maxpool2=MaxPool2d(2)
# 第三个卷积层及最大池化操作
self.conv3=Conv2d(32,64,5,padding=2)
self.maxpool3=MaxPool2d(2)
# 展开图像
self.flatten=Flatten()
# 线性层参数设计
self.linear1=Linear(1024,64)
self.linear2=Linear(64,10)
# 如果是预测概率,那么取输出结果的最大值(它代表了最大概率)
def forward(self,x):
x = self.conv1(x)
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) #如果线性层的1024和64不会计算,可以在self.flatten之后print(x.shape)查看尺寸,以此设定linear的参数
x = self.linear2(x)
return x
demo=Demo()
print(demo)
"""
[Run]
Demo(
(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)
)
可以看出,网络还是有模有样的
"""
#构建输入,测试神经网络
input=torch.ones((64,3,32,32)) #构建图像,batch_size=64,3通道,32×32
output=demo(input)
print(output.shape) #[Run] torch.Size([64, 10])
这里的 \(forward\) 函数写的有点烦,这时候 \(Sequential\) 函数的优越就体现出来了(墨镜黄豆)。下面是 \(class\) \(Demo\) 优化后的代码:
class Demo(nn.Module):
def __init__(self):
super(Demo,self).__init__()
self.model1=Sequential(
Conv2d(3,32,5,padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x=self.model1(x)
return x
极简主义者看过后表示很满意ε٩(๑> ₃ <)۶з 。
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs_seq")
writer.add_graph(demo,input)
writer.close()
这样就可以清晰地看到神经网络的相关参数啦 。
最后此篇关于深度学习(十二)——神经网络:搭建小实战和Sequential的使用的文章就讲到这里了,如果你想了解更多关于深度学习(十二)——神经网络:搭建小实战和Sequential的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!