卷积神经网络CNN入门【pytorch学习】
生活随笔
收集整理的這篇文章主要介紹了
卷积神经网络CNN入门【pytorch学习】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
在學習GANs的時候遇到一篇論文DCGANs,說是其中用到了卷積神經網絡。
所以,就抽空學習一下,結果,真沒想到有那么多的坑。
文章目錄
- 簡述
- 數據配置
- 配套的代碼段
- 參數設置
- 訓練集批處理構建
- 測試集
- 構建CNN框架
- 訓練
- 測試結果
- 全部代碼
- 參考
數據配置
第一步配置數據的時候就賊坑了。。。
- 看下面的這一篇文章就可以解決,就是手動下載之后,放在一個目錄下,之后,再修改源碼中指定的位置,之后再運行,代碼會從本地下載(其實就是轉移位置),但是由于它同時也會生成兩個c文件。所以,不推薦直接手動的建目錄之類的操作。
- pytorch下載mnist超時解決方案
配套的代碼段
import torch import torch.nn as nn import torchvision import torch.utils.data as DataDOWNLOAD_MNIST = True # 已經下載好的話,會自動跳過的# Mnist 手寫數字 train_data = torchvision.datasets.MNIST(root='./mnist/', # 保存或者提取位置train=True, # this is training datatransform=torchvision.transforms.ToTensor(), # 轉換 PIL.Image or numpy.ndarray 成# torch.FloatTensor (C x H x W), 訓練的時候 normalize 成 [0.0, 1.0] 區間download=DOWNLOAD_MNIST, # 沒下載就下載, 下載了就不用再下了 )test_data = torchvision.datasets.MNIST(root='./mnist/',train=False )參數設置
- 這里只測試一次的原因其實是,訓練集有60000個。雖然之后使用批處理的方式,但是我們BATCH_SIZE設置為了50,所以,也有1200次的訓練了。所以,只用一次就好了。
- BATCH_SIZE 就是每一次訓練的那個塊中的數據數量
- LR學習率
這些參數在建立GANs的時候也用到了。
# Hyper Parameters EPOCH = 1 # 訓練整批數據多少次, 為了節約時間, 我們只訓練一次 BATCH_SIZE = 50 LR = 0.001 # 學習率訓練集批處理構建
# 訓練集丟BATCH_SIZE個, 圖片大小為28*28 train_loader = Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True # 是否打亂順序 )測試集
其實這里調用出來是沒有什么用,但是任然放出來了,主要是為了跟學習的一份代碼中保持一致性。找bug的時候,這樣很方便。
但是這里有一個重點(對于新手)
- torch.unsqueeze()函數,給數組加上一個維度。dim=1表示在添加的這個維度是再哪?
- 比如dim=1時候
- (10,20)變成了(10,1,20)
構建CNN框架
- nn.Module非常常見的自定義類,所有模型的基類
- 第一個網絡是:先是一個卷積,再是一個ReLU激活函數,最后再來個最大池化
如果真的是新手的話,會發下這里賊多知識點。
- 先看懂什么是卷積
- 再搞定padding,stride這些參數什么意思
- 池化: 這個反而是最簡單的。就是給一個矩形(小一點的),然后通過一定的移動方式,在這個區間上找最大值。然后不重復的這樣遍歷完所有的像素點。得到的一張新圖(新的張量)
- 所以,我在注釋的地方表示的是到這里的時候這個數據的shape
- 通過.view(shape(0),-1) 這樣的方式,將數據展開為一個一維向量。之后,再通過一個線性函數,轉成10個線性函數的結果來。(表示對應10個數字的概率(其實可能是負數的,但是會逐漸的改善,大致上能擬合出結果來))
訓練
- 這里的遍歷,其實是會把所有的訓練集數據都訓練過一遍為止。
- 損失函數調用的是交叉熵。https://blog.csdn.net/zziahgf/article/details/80196376
- 公式的含義,其實非常簡單,就是希望目標數對應下標的那個數值要大一點。但是又不能是因為所有為止上的點的數值都變大導致了。
測試結果
print('finished training') test_out = cnn(test_x) predict_y = torch.argmax(test_out, 1).data.numpy() print('Accuracy in Test : %.4f%%' % (sum(predict_y == test_y.data.numpy()) * 100/ len(predict_y)))我這里跑的一個結果是
finished training Accuracy in Test : 98.2000%然后速度其實是有點慢的。之后會再看看其他的實現。
全部代碼
import torch import torch.nn as nn import torchvision import torch.utils.data as Data# Hyper Parameters EPOCH = 1 # 訓練整批數據多少次, 為了節約時間, 我們只訓練一次 BATCH_SIZE = 50 LR = 0.001 # 學習率 DOWNLOAD_MNIST = True # 已經下載好的話,會自動跳過的# Mnist 手寫數字 train_data = torchvision.datasets.MNIST(root='./mnist/', # 保存或者提取位置train=True, # this is training datatransform=torchvision.transforms.ToTensor(), # 轉換 PIL.Image or numpy.ndarray 成# torch.FloatTensor (C x H x W), 訓練的時候 normalize 成 [0.0, 1.0] 區間download=DOWNLOAD_MNIST, # 沒下載就下載, 下載了就不用再下了 )test_data = torchvision.datasets.MNIST(root='./mnist/',train=False )# 訓練集丟BATCH_SIZE個, 圖片大小為28*28 train_loader = Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True # 是否打亂順序 )# test_data為 [10000, 28, 28]這樣的一個數組,這里就只截取一段就好了 test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor) test_y = test_data.test_labels# cnnclass CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.layer1 = nn.Sequential(# (1, 28, 28)nn.Conv2d(in_channels=1,out_channels=16,kernel_size=5, # 卷積filter, 移動塊長stride=1, # filter的每次移動步長padding=2,groups=1),# (16, 28, 38)nn.ReLU(),nn.MaxPool2d(kernel_size=2)# (16, 14, 14))self.layer2 = nn.Sequential(nn.Conv2d(in_channels=16,out_channels=32,kernel_size=5,stride=1,padding=2),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.layer3 = nn.Linear(32 * 7 * 7, 10)def forward(self, x):# print(x.shape)x = self.layer1(x)# print(x.shape)x = self.layer2(x)# print(x.shape)x = x.view(x.size(0), -1)# print(x.shape)x = self.layer3(x)# print(x.shape)return xcnn = CNN()optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) loss_function = nn.CrossEntropyLoss() for epoch in range(EPOCH):for step, (b_x, b_y) in enumerate(train_loader):output = cnn(b_x)loss = loss_function(output, b_y)optimizer.zero_grad()loss.backward()optimizer.step()print('finished training') test_out = cnn(test_x) predict_y = torch.argmax(test_out, 1).data.numpy() print('Accuracy in Test : %.4f%%' % (sum(predict_y == test_y.data.numpy()) * 100/ len(predict_y)))參考
- https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-03-A-CNN/
- https://github.com/sunshineatnoon/Paper-Implementations
總結
以上是生活随笔為你收集整理的卷积神经网络CNN入门【pytorch学习】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nn.Conv2d中padding详解【
- 下一篇: (深度卷积生成对抗神经网络)DCGANs