当前位置: 首页 > news >正文

9.卷积神经网络操作

9.1 填充与步幅计算

import torch 
from torch import nndef comp_conv2d(conv2d,X):X=X.reshape((1,1)+X.shape)#(BS,CHANNEL,H,W)Y=conv2d(X)return Y.reshape(Y.shape[2:])#这个时候在把前面维度拿掉
#测试样例1
conv2d=nn.Conv2d(1,1,kernel_size=3,padding=1)
X=torch.rand(size=(8,8))
print(comp_conv2d(conv2d,X).shape)#8+2*1-(3-1)=8
#测试样例2
conv2d=nn.Conv2d(1,1,kernel_size=(5,3),padding=(2,1))
X=torch.rand(size=(8,8))
print(comp_conv2d(conv2d,X).shape)#8+2*2-(5-1)=8|8+2*1-(3-1)=8
#测试样例3
conv2d=nn.Conv2d(1,1,kernel_size=(5,3),padding=(2,1),stride=2)
X=torch.rand(size=(8,8))
print(comp_conv2d(conv2d,X).shape)#8+2*2-5/2+1=4|8+2*1-3/2+1=4,向下取值floor
#
conv2d=nn.Conv2d(1,1,kernel_size=(3,5),padding=(0,1),stride=(3,4))
X=torch.rand(size=(8,8))
print(comp_conv2d(conv2d,X).shape)#8+2*0-(3-1)/3+1=2|8+2*1-5+1/4+1=2

9.2 多输入通道计算

#多个输入通道
import torch
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()
def corr2d_multi_in(X,K):return sum(corr2d(x,k) for x,k in zip(X,K))
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])#2*3*3
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]],[[1.0, 2.0], [3.0, 4.0]]])
corr2d_multi_in(X,K)

9.3 多输出通道计算

#多输出通道
import torch
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
def corr2d_multi_in(X,K):return sum(corr2d(x,k) for x,k in zip(X,K))
#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()
def corr2d_multi_in_out(X,K):return torch.stack([corr2d_multi_in(X,k) for k in K],0)#return sum(corr2d(x,k) for x,k in zip(X,K))'
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]],[[1.0, 2.0], [3.0, 4.0]]])
K = torch.stack((K,K+1,K+2),0)
print(K.shape)
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])#2*3*3
#将X的每一个通道与每一个卷积核做计算之后相加得到一个2x2的特征,然后由于有3个卷积,所以stack在一起就变成[3,2,2]的结果了
corr2d_multi_in_out(X,K)

在这里插入图片描述

9.4 多输出通道计算(1x1卷积)

#1x1的卷积核测试
import torch
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
def corr2d_multi_in(X,K):return sum(corr2d(x,k) for x,k in zip(X,K))
#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()
def corr2d_multi_in_out(X,K):return torch.stack([corr2d_multi_in(X,k) for k in K],0)#return sum(corr2d(x,k) for x,k in zip(X,K))'
def corr2d_multi_in_out_1x1(X,K):c_i,h,w=X.shape#[2,2,2]c_o=K.shape[0]#[3,2,2,2]X=X.reshape((c_i,h*w))#flatten()K=K.reshape((c_o,c_i))Y=torch.matmul(K,X)print(Y.shape)return Y.reshape((c_o,h,w))
X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))#K.shape[0]是我自己设定的
Y1=corr2d_multi_in_out_1x1(X,K)
Y2=corr2d_multi_in_out(X,K)
assert float(torch.abs(Y1-Y2).sum())<1e-6#检查Y1==Y2
torch.isclose(Y1,Y2,rtol=1e-6,atol=0.0)

9.5 池化操作

import torch
from torch import nn
import matplotlib.pyplot as pltdef pool2d(X,pool_size,mode='max'):ph,pw=pool_sizeY=torch.zeros((X.shape[0]-ph+1,X.shape[1]-pw+1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode=='max':Y[i,j]=X[i:i+ph,j:j+pw].max()elif mode=='avg':Y[i,j]=X[i:i+ph,j:j+pw].mean()return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
print(pool2d(X, (2, 2),mode='max'))
print(pool2d(X, (2, 2),mode='avg'))
http://www.dtcms.com/a/275040.html

相关文章:

  • 【网络编程】KCP——可靠的 UDP 传输协议——的知识汇总
  • 公链的主要特征有哪些?
  • 【Docker#1】技术架构演进之路
  • Script Error产生的原因及解法
  • 新品上架后,亚马逊卖家如何高效投放广告
  • 自信的本质:在克服逆境的过程中爱上自己
  • 四、神经网络——正则化方法
  • Operation Blackout 2025 Phantom Check hayabusa+ControlSet001+VirtualBox
  • 【笔记】训练步骤代码解析
  • docker安装Consul笔记
  • Java(7.11 设计模式学习)
  • PLC框架-1.3- 汇川PN伺服(3号报文)
  • 多种人脸处理方案——人脸裁剪
  • Webview 中可用的 VS Code 方法
  • G1 垃圾回收算法详解
  • 【TCP/IP】16. 简单网络管理协议
  • 天晟科技携手万表平台,共同推动RWA项目发展
  • 从「小公司人事」到「HRBP」:选对工具,比转岗更能解决成长焦虑
  • Java大厂面试故事:谢飞机的互联网音视频场景技术面试全纪录(Spring Boot、MyBatis、Kafka、Redis、AI等)
  • kubernetes单机部署踩坑笔记
  • DIDCTF-蓝帽杯
  • 谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
  • 【数据结构与算法】206.反转链表(LeetCode)
  • C++:非类型模板参数,模板特化以及模板的分离编译
  • 实现将文本数据(input_text)转换为input_embeddings的操作
  • 《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》
  • Vue 表单开发优化实践:如何优雅地合并 `data()` 与 `resetForm()` 中的重复对象
  • Sigma-Aldrich 细胞培养实验方案 | 通过Hoechst DNA染色检测细胞的支原体污染
  • 拔高原理篇
  • 奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官