import torch
import torch.nn as nn
import torch.nn.functional as F
class Inception(nn.Module):
def __init__(self,in_channels):#输入通道数定为未知量,当实例化模型时可以调用
super(Inception,self).__init__()
self.branch11=nn.Conv2d(in_channels,16,kernel_size=1) #1*1的卷积分支 C1=16 图片形状(h,w)未发生变化
self.branch55_1=nn.Conv2d(in_channels,16,kernel_size=1)
self.branch55_2=nn.Conv2d(16,24,kernel_size=5,padding=2) #5*5的卷积分支 C2=24 图片形状不发生变化
self.branch33_1=nn.Conv2d(in_channels,16,kernel_size=1)
self.branch33_2=nn.Conv2d(16,24,kernel_size=3,padding=1)
self.branch33_3=nn.Conv2d(24,24,kernel_size=3,padding=1) #3*3的卷积分支 C3=24 图片形状不发生变化
self.branch_pool=nn.Conv2d(in_channels,24,kernel_size=1) #1*1的池化分支 C4=24 图片形状不发生变化
def forward(self,x):
branch11=self.branch11(x)
branch55=self.branch55_1(x)
branch55=self.branch55_2(branch55)
branch33=self.branch33_1(x)
branch33=self.branch33_2(branch33)
branch33=self.branch33_3(branch33)
branch_pool=F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)
branch_pool=self.branch_pool(branch_pool)
outputs=[branch11,branch33,branch55,branch_pool]
return torch.cat(outputs,dim=1) #dim=1,在(B,C,H,W)的第二个维度C上合并 其他维度的值必须相同
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1=nn.Conv2d(1,10,kernel_size=5)
self.conv2=nn.Conv2d(88,20,kernel_size=5) #将Inception沿着C维度拼接之后,通道总数未=为88
self.incep1=Inception(in_channels=10)
self.incep2=Inception(in_channels=20)
self.mp=nn.MaxPool2d(kernel_size=2)
self.fc=nn.Linear(1408,10) ###
def forward(self,x):
in_size=x.size(0)
x=F.relu(self.mp(self.conv1(x))
x=self.incep1(x)
x=F.relu(self.mp(self.conv2(x)))
x=self.incep2(x)
x=x.view(in_size,-1) ###
x=self.fc(x) ### 随机产生一个x 去掉这三行 输出x.size()
return x
卷积神经网络:Inception Model的定义
最新推荐文章于 2023-09-26 16:28:36 发布