日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

卷积神经网络CNN入门【pytorch学习】

發布時間:2025/4/16 卷积神经网络 200 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷积神经网络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)
# test_data為 [10000, 28, 28]這樣的一個數組,這里就只截取一段就好了 test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor) test_y = test_data.test_labels

構建CNN框架

  • nn.Module非常常見的自定義類,所有模型的基類
  • 第一個網絡是:先是一個卷積,再是一個ReLU激活函數,最后再來個最大池化

如果真的是新手的話,會發下這里賊多知識點。

  • 先看懂什么是卷積
  • 再搞定padding,stride這些參數什么意思
  • 池化: 這個反而是最簡單的。就是給一個矩形(小一點的),然后通過一定的移動方式,在這個區間上找最大值。然后不重復的這樣遍歷完所有的像素點。得到的一張新圖(新的張量)
  • 所以,我在注釋的地方表示的是到這里的時候這個數據的shape
  • 通過.view(shape(0),-1) 這樣的方式,將數據展開為一個一維向量。之后,再通過一個線性函數,轉成10個線性函數的結果來。(表示對應10個數字的概率(其實可能是負數的,但是會逐漸的改善,大致上能擬合出結果來)
class 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 x

訓練

  • 這里的遍歷,其實是會把所有的訓練集數據都訓練過一遍為止。
  • 損失函數調用的是交叉熵。https://blog.csdn.net/zziahgf/article/details/80196376
  • 公式的含義,其實非常簡單,就是希望目標數對應下標的那個數值要大一點。但是又不能是因為所有為止上的點的數值都變大導致了。
cnn = 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)))

我這里跑的一個結果是

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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的卷积神经网络CNN入门【pytorch学习】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。