pytorch笔记:搭建简易CNN
生活随笔
收集整理的這篇文章主要介紹了
pytorch笔记:搭建简易CNN
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CNN的理論部分可見機器學習筆記:CNN卷積神經網絡_劉文巾的博客-CSDN博客
1 導入庫
import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt2 超參數定義
EPOCH=1 BATCH_SIZE=50 LR=0.001 DOWNLOAD_MNIST=False #如果已經事先下載好了 mnist數據,那么DOWNLOAD_MNIST就是False,否則就是True3 加載數據
train_data=torchvision.datasets.MNIST( root='./mnist/', #從這個路徑找mnist數據/下載mnist數據到這個路徑下 train=True, #這時候數據是訓練集(是訓練集還是測試集對dropout等會有影響) transform=torchvision.transforms.ToTensor() #將mnist數據集中的數據類型轉換為Tensor形式, download=DOWNLOAD_MNIST)4 數據集信息及可視化
print(train_data.data.shape) #torch.Size([60000, 28, 28]) #60000條數據,每條數據是28*28的像素點train_data.targets.shape #torch.Size([60000]) #訓練集數據的標簽,每條數據對應一個標簽,代表這張圖片是哪個數字#可視化 plt.imshow(train_data.data[1]) plt.title("{}".format(train_data.targets.data[1]))5 dataloader生成
#生成dataloader train_loader=Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True )6 CNN模型定義
class CNN(nn.Module):def __init__(self):super(CNN,self).__init__()self.conv1=nn.Sequential(nn.Conv2d(in_channels=1, #輸入shape (1,28,28)out_channels=16, #輸出shape(16,28,28),16也是卷積核的數量kernel_size=5,stride=1,padding=2), #如果想要conv2d出來的圖片長寬沒有變化,那么當stride=1的時候,padding=(kernel_size-1)/2nn.ReLU(),nn.MaxPool2d(kernel_size=2)#在2*2空間里面下采樣,輸出shape(16,14,14))self.conv2=nn.Sequential(nn.Conv2d(in_channels=16, #輸入shape (16,14,14)out_channels=32, #輸出shape(32,14,14)kernel_size=5,stride=1,padding=2), #輸出shape(32,7,7),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.fc=nn.Linear(32*7*7,10) #輸出一個十維的東西,表示我每個數字可能性的權重def forward(self,x):x=self.conv1(x)x=self.conv2(x)x=x.view(x.shape[0],-1)x=self.fc(x)return xcnn=CNN() print(cnn) ''' CNN((conv1): Sequential((0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(1): ReLU()(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(conv2): Sequential((0): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(1): ReLU()(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(fc): Linear(in_features=1568, out_features=10, bias=True) ) '''7 定義優化函數和損失函數
optimizer=torch.optim.SGD(cnn.parameters(),lr=LR)loss_func=torch.nn.CrossEntropyLoss() #損失函數定義為交叉熵loss_his=[]8 訓練模型
for epoch in range(EPOCH):for step,(b_x,b_y) in enumerate(train_loader):output=cnn(b_x)loss=loss_func(output,b_y)loss_his.append(loss)optimizer.zero_grad() #清除上一次參數更新的殘余梯度loss.backward() #損失函數后向傳播optimizer.step() #參數更新9 損失函數可視化
plt.figure(figsize=(10,5)) plt.plot(loss_his)10 結果驗證
tmp=train_data.data[3] print(tmp.shape) #torch.Size([28, 28])plt.imshow(tmp)print(train_data.targets[3]) #1tmp=tmp.reshape(1,1,28,28) #reshape一下,這樣可以送入模型中cnn(tmp.type(torch.FloatTensor)) #type那一部分必須要,否則報錯“#RuntimeError: expected scalar type Byte but found Float”#tensor([[-74.7790, 140.8805, 54.7678, 2.0222, -28.6432, -62.3598, -20.4240, # -44.9795, 110.6059, -37.1277]], grad_fn=<AddmmBackward>)torch.max(cnn(tmp.type(torch.FloatTensor)),axis=1)[1] #tensor([1])總結
以上是生活随笔為你收集整理的pytorch笔记:搭建简易CNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题3. 无重复字符的最长子串
- 下一篇: pytorch 笔记 :实现Dropou