免费的企业网站建设流程,wordpress数据库移动,淮北房产网,网站模板 静态模版网络中的网络#xff0c;NIN。
AlexNet和VGG都是先由卷积层构成的模块充分抽取空间特征#xff0c;再由全连接层构成的模块来输出分类结果。但是其中的全连接层的参数量过于巨大#xff0c;因此NiN提出用1*1卷积代替全连接层#xff0c;串联多个由卷积层和“全连接”层构成…网络中的网络NIN。
AlexNet和VGG都是先由卷积层构成的模块充分抽取空间特征再由全连接层构成的模块来输出分类结果。但是其中的全连接层的参数量过于巨大因此NiN提出用1*1卷积代替全连接层串联多个由卷积层和“全连接”层构成的小网络来构建⼀个深层网络。
AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者可以想象在这个过程的早期使用全连接层。然而如果使用了全连接层可能会完全放弃表征的空间结构。
网络中的网络NiN提供了一个非常简单的解决方案在每个像素的通道上分别使用多层感知机。也就是使用了多个1*1的卷积核。同时他认为全连接层占据了大量的内存所以整个网络结构中没有使用全连接层。
NIN块 一个卷积层后跟两个全连接层。
步幅为1无填充输出形状跟卷积层输出一样。起到全连接层的作用。
NIN网络结构 无全连接层 交替使用NIN块和步幅为2的最大池化层 逐步减小高宽和增大通道数 最后使用全局平均池化层得到输出 其输入通道数是类别数
此网络结构总计4层 3mlpconv 1global_average_pooling
优点
提供了网络层间映射的一种新可能增加了网络卷积层的非线性能力。 总结 NIN块使用卷积层加上个 1 × 1 1\times 1 1×1卷积后者对每个像素增加了非线性性NIN使用全局平均池化层来替代VGG和AlexNet中的全连接层不容易过拟合更少的参数个数 代码实现
使用CIFAR-10数据集。 maxpooling不改变通道数只改变长和宽 model.py
import torch
from torch import nn# nin块
def nin_block(in_channels,out_channels,kernel_size,strides,padding):return nn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size,strides,padding),nn.ReLU(),nn.Conv2d(out_channels,out_channels,kernel_size1),nn.ReLU(),nn.Conv2d(out_channels,out_channels,kernel_size1),nn.ReLU(),)# 构建网络
class NIN(nn.Module):def __init__(self, *args, **kwargs) - None:super().__init__(*args, **kwargs)self.model nn.Sequential(nin_block(3,96,kernel_size11,strides4,padding0),nn.MaxPool2d(3,stride2),nin_block(96,256,kernel_size5,strides1,padding2),nn.MaxPool2d(3,stride2),nin_block(256,384,kernel_size3,strides1,padding1),nn.MaxPool2d(3,stride2),nn.Dropout(0.5),nin_block(384,10,kernel_size3,strides1,padding1),nn.AdaptiveAvgPool2d((1,1)),nn.Flatten())def forward(self,x):return self.model(x)# 验证模型正确性
if __name__ __main__:nin NIN()x torch.ones((64,3,244,244))output nin(x)print(output)train.py
import torch
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets
from torchvision.transforms import transforms
from model import NIN# 扫描数据次数
epochs 3
# 分组大小
batch 64
# 学习率
learning_rate 0.01
# 训练次数
train_step 0
# 测试次数
test_step 0# 定义图像转换
transform transforms.Compose([transforms.Resize(224),transforms.ToTensor()
])
# 读取数据
train_dataset datasets.CIFAR10(root./dataset,trainTrue,transformtransform,downloadTrue)
test_dataset datasets.CIFAR10(root./dataset,trainFalse,transformtransform,downloadTrue)
# 加载数据
train_dataloader DataLoader(train_dataset,batch_sizebatch,shuffleTrue,num_workers0)
test_dataloader DataLoader(test_dataset,batch_sizebatch,shuffleTrue,num_workers0)
# 数据大小
train_size len(train_dataset)
test_size len(test_dataset)
print(训练集大小{}.format(train_size))
print(验证集大小{}.format(test_size))# GPU
device torch.device(mps if torch.backends.mps.is_available() else cpu)
print(device)
# 创建网络
net NIN()
net net.to(device)
# 定义损失函数
loss nn.CrossEntropyLoss()
loss loss.to(device)
# 定义优化器
optimizer torch.optim.SGD(net.parameters(),lrlearning_rate)writer SummaryWriter(logs)
# 训练
for epoch in range(epochs):print(-------------------第 {} 轮训练开始-------------------.format(epoch))net.train()for data in train_dataloader:train_step train_step 1images,targets dataimages images.to(device)targets targets.to(device)outputs net(images)loss_out loss(outputs,targets)optimizer.zero_grad()loss_out.backward()optimizer.step()if train_step%1000:writer.add_scalar(Train Loss,scalar_valueloss_out.item(),global_steptrain_step)print(训练次数{}Loss{}.format(train_step,loss_out.item()))# 测试net.eval()total_loss 0total_accuracy 0with torch.no_grad():for data in test_dataloader:test_step test_step 1images, targets dataimages images.to(device)targets targets.to(device)outputs net(images)loss_out loss(outputs, targets)total_loss total_loss loss_outaccuracy (targets torch.argmax(outputs,dim1)).sum()total_accuracy total_accuracy accuracy# 计算精确率print(total_accuracy)accuracy_rate total_accuracy / test_sizeprint(第 {} 轮验证集总损失为{}.format(epoch1,total_loss))print(第 {} 轮精确率为{}.format(epoch1,accuracy_rate))writer.add_scalar(Test Total Loss,scalar_valuetotal_loss,global_stepepoch1)writer.add_scalar(Accuracy Rate,scalar_valueaccuracy_rate,global_stepepoch1)torch.save(net,./model/net_{}.pth.format(epoch1))print(模型net_{}.pth已保存.format(epoch1))