卷积神经网络是一种稀疏连接的神经网络,虽然由于稀疏连接较全连接神经网络失去了一些拟合能力,但以此换来的对训练成本的降低却是极高的。在CNN发展史上一些经典模型有LeNet-5、AlexNet、VGG、ResNet等。
1、conv2d
import torch import torch.nn as nn torch.nn.Conv2d(in_channels,out_channels,kernel_size,strade,padding,dilation,groups,bias,padding_mode='zeros')1、in_channels
输入通道数,即输入的特征图数量
2、out_channels
输出通道数,即卷积核数量,在groups参数为1的情况下每个卷积核会逐一与输入特征图交互
3、kernel_size
卷积核大小
4、stride
步长,即卷积核单次移动步数
5、padding
填充,即在特征图四周填充的0的层数
6、dilation
空洞率,正常情况下为1,大于等于2的情况下卷积核会间隔dilation-1个像素
7、groups
分组卷积,输入通道和输出通道必须能被groups整除
8、bias
类似于ax+b中的b值,是一个可学习参数
9、padding_mode
默认zeors
2、示例代码
import torch import torch.nn as nn from torchvision import transforms,datasets import torch.utils.data as Data torch.cuda.empty_cache() device=torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') BATCH_SIZE=50 transform=transforms.Compose([ transforms.Resize((224,224)), transforms.ToTensor(), transforms.Normalize((0.1307,),( 0.3081,)) ]) train_data=datasets.MNIST( root='D:/mypython/MNISTdataset', train=True, download=True, transform=transform ) #print(train_data.train_data.size()) #print(train_data.train_labels.size()) train_loader=Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True) traintest,labeltest=next(iter(train_loader)) #print(traintest.shape) #print(labeltest.shape) test_data=datasets.MNIST( root='D:/mypython/MNISTdataset', train=False, transform=transform ) test_loader=Data.DataLoader(dataset=test_data,batch_size=50,shuffle=False) test_x,test_y=next(iter(test_loader)) #print(test_x.size()) #print(test_y.size()) class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=2,stride=2,padding=0) self.relu1=nn.ReLU() self.pool1=nn.AvgPool2d(kernel_size=2,stride=2) self.fc1=nn.Linear(32*56*56, 128) self.relu2=nn.ReLU() self.fc2=nn.Linear(128,10) def forward(self,x): x=self.pool1(self.relu1(self.conv1(x))) x=x.view(-1,32*56*56) x=self.fc2(self.relu2(self.fc1(x))) return x model=CNN() model=model.to(device=device) optimizer=torch.optim.Adam(model.parameters(),lr=0.01) loss_func=torch.nn.CrossEntropyLoss() for step,(x,y) in enumerate(train_loader): b_x=x.to(device=device) b_y=y.to(device=device) output=model(b_x) loss=loss_func(output,b_y) optimizer.zero_grad() loss.backward() if step % 100 ==0: t_x=test_x.to(device=device) t_y=test_y.to(device=device) test_output=model(t_x) pred_y=torch.max(test_output,1)[1].data.squeeze() accuracy=(pred_y==t_y).sum().item()/float(test_y.size(0)) print('train loss;%.4f' %loss.data,'|test accuracy:%.2f' %accuracy)