import torch
import torch.nn as nn
# batch 5 channel 128 大小 28 x 28
x = torch.zeros([5,128,28,28])
cnn = nn.Conv2d(128,256,3,groups=2)# 计算cnn 的参数数量 只有一层卷积# 第一个参数是权重 torch.Size([256, 64, 3, 3])# 因为分为两组 每一组输入特征图的通道数变成64,然后每一个卷积核的通道数 也是64# 3 x 3 卷积核 输出256 输入64 总共256个卷积核个数for var in cnn.parameters():print(var.shape)# cnn = nn.Conv1d(128,256,3,groups=2)# for var in cnn.parameters():# print(var.shape)
from torchvision.models import resnet50,mobilenet_v2
import torch
import time
model1 = resnet50()
model2 = mobilenet_v2()# 卷积速度优化# 输入1 输出3 大小 224 x 224
x = torch.randn([1,3,224,224],dtype=torch.float32)# 进行十次推理测试 每一次测试都测量模型推理时间 然后打印结果for i inrange(10):
t1 = time.perf_counter()
y = model2(x)
t2 = time.perf_counter()# 计算推理时间 进行十次推理 发现每一次推理的时间都减小print(f"{t2-t1:.3f}")
torch.save(model1.state_dict(),"resnet.pth")# 使用torch.save 保存模型的权重参数 然后以后可以加载这些模型权重 然后重用
torch.save(model2.state_dict(),"mobilenetv2.pth")
关于深度可分离卷积
import torch
import torch.nn as nn
import time
# 产生随机测试数据
x = torch.randn([32,64,300,300])# 定义卷积网络# 逐层卷积 g = Cin = Cout 卷积核大小 3 x 3
cnn1 = nn.Conv2d(64,64,3,groups=64)# 逐点卷积
cnn2 = nn.Conv2d(64,128,1,groups=1)
cnn1.eval()# 推断模型
cnn2.eval()for i inrange(10):
t1 = time.perf_counter()
x = cnn1(x)
y = cnn2(x)
t2 = time.perf_counter()print(f"{t2 - t1:.3f}")