1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        深度學習之 Pytorch 基礎教程!

        共 7000字,需瀏覽 14分鐘

         ·

        2022-11-24 21:13

        點擊上方小白學視覺”,選擇加"星標"或“置頂

        重磅干貨,第一時間送達

        隨著深度學習的發(fā)展,深度學習框架開始大量的出現(xiàn)。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學習框架。目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。
        這其中,TensorFlow和Pytorch占據(jù)了深度學習的半壁江山。前幾天分享了TensorFlow的基本教程后,很多人在后臺留言說能不能寫寫Pytorch入門。本著粉絲的訴求必須滿足的原則,熬夜干,有了今天的文章。所以你懂我意思吧,記得轉發(fā)、點贊、在看三聯(lián)。
        本文結合Pytorch官方教程、邱錫鵬老師的《神經(jīng)網(wǎng)絡與深度學習》和李沐老師的《動手學深度學習》,為大家介紹的一下Pytorch深度學習框架。具體目錄如下:

        一、數(shù)據(jù)操作

        import torch
        1.1 創(chuàng)建TENSOR
        # 創(chuàng)建未初始化的Tensorx = torch.empty(5,3)print(x)

        # 創(chuàng)建隨機初始化的Tensorx = torch.rand(5,3)print(x)

        # 創(chuàng)建全為0的Tensorx = torch.zeros(5,3,dtype=torch.long)print(x)

        # 根據(jù)數(shù)據(jù)創(chuàng)建Tensorx = torch.tensor([5.5,3])print(x)

        # 修改原Tensor為全1的Tensorx = x.new_ones(5,3,dtype=torch.float64)print(x)
        # 修改數(shù)據(jù)類型x = torch.rand_like(x,dtype=torch.float64)print(x)

        # 獲取Tensor的形狀print(x.size())print(x.shape)# 注意:返回的torch.Size其實就是?一個tuple, ?支持所有tuple的操作。


        這些創(chuàng)建方法都可以在創(chuàng)建的時候指定數(shù)據(jù)類型dtype和存放device(cpu/gpu)。

        1.2 操作

        1.2.1 算術操作

        在PyTorch中,同?種操作可能有很多種形式,下?面?用加法作為例子。

        # 形式1:y = torch.rand(5,3)print(x+y)

        # 形式2print(torch.add(x,y))# 還可以指定輸出result = torch.empty(5, 3)torch.add(x, y, out=result)print(result)

        # 形式3y.add_(x)print(y)

        1.2.2 索引

        我們還可以使?類似NumPy的索引操作來訪問 Tensor 的一部分,需要注意的是:索引出來的結果與原數(shù)據(jù)共享內存,也即修改?個,另?個會跟著修改。

        y = x[0,:]y += 1print(y)print(x[0,:])  # 觀察x是否改變了

        1.2.3 改變形狀

        注意 view() 返回的新tensor與源tensor共享內存(其實是同?個tensor),也即更改其中的?個,另 外?個也會跟著改變。(顧名思義,view僅是改變了對這個張量的觀察角度)

        y = x.view(15)z = x.view(-1,5) #  -1所指的維度可以根據(jù)其他維度的值推出來print(x.size(),y.size(),z.size())

        x += 1print(x)print(y)

        所以如果我們想返回?個真正新的副本(即不共享內存)該怎么辦呢?Pytorch還提供了? 個 reshape() 可以改變形狀,但是此函數(shù)并不能保證返回的是其拷貝,所以不推薦使用。推薦先 ? clone 創(chuàng)造一個副本然后再使? view 。

        x_cp = x.clone().view(15)x -= 1print(x)print(x_cp)

        另外?個常用的函數(shù)就是 item() , 它可以將?個標量 Tensor 轉換成?個Python

        number:x = torch.randn(1)print(x)print(x.item())


        1.2.4 線性代數(shù)

        官方文檔:https://pytorch.org/docs/stable/torch.html

        1.3 廣播機制

        前?我們看到如何對兩個形狀相同的 Tensor 做按元素運算。當對兩個形狀不同的 Tensor 按元素運算時,可能會觸發(fā)廣播(broadcasting)機制:先適當復制元素使這兩個 Tensor 形狀相同后再按元素運算。例如:

        x = torch.arange(1,3).view(1,2)print(x)y = torch.arange(1,4).view(3,1)print(y)print(x+y)

        1.4 Tensor和Numpy相互轉化

        我們很容易? numpy() 和 from_numpy() 將 Tensor 和NumPy中的數(shù)組相互轉換。但是需要注意的?點是:這兩個函數(shù)所產(chǎn)生的的 Tensor 和NumPy中的數(shù)組共享相同的內存(所以他們之間的轉換很快),改變其中?個時另?個也會改變?。?!

        a = torch.ones(5)b = a.numpy()print(a,b)

        a += 1print(a,b)

        b += 1print(a,b)

        使? from_numpy() 將NumPy數(shù)組轉換成 Tensor :

        import numpy as npa = np.ones(5)b = torch.from_numpy(a)print(a,b)

        a += 1print(a,b)b += 1print(a,b)

        1.5 GPU運算

        # let us run this cell only if CUDA is available# We will use ``torch.device`` objects to move tensors in and out of GPUif torch.cuda.is_available():    device = torch.device("cuda")          # a CUDA device object    y = torch.ones_like(x, device=device)  # directly create a tensor on GPU    x = x.to(device)                       # or just use strings ``.to("cuda")``    z = x + y    print(z)    print(z.to("cpu", torch.double))       # ``.to`` can also change dtype together!

        二、自動求梯度(非常重要)

        很多人看到這里是懵的,因為為什么會得出導數(shù)的結果,在這里我給出自動求導的一些原理性的知識,希望能幫助大家更好的學習pytorch這個重要的框架。
        該autograd軟件包是PyTorch中所有神經(jīng)網(wǎng)絡的核心。讓我們首先簡要地訪問它,然后我們將去訓練我們的第一個神經(jīng)網(wǎng)絡。
        該autograd軟件包可自動區(qū)分張量上的所有操作。這是一個按運行定義的框架,這意味著您的backprop是由代碼的運行方式定義的,并且每次迭代都可以不同。
        如果想了解數(shù)值微分數(shù)值積分和自動求導的知識,可以查看邱錫鵬老師的《神經(jīng)網(wǎng)絡與深度學習》第四章第五節(jié):
        下載地址:https://nndl.github.io/
        在這里簡單說說自動微分的原理吧:我們的目標是求

          

        在  處的導數(shù)。我們的做法是利用鏈式法則分解為一系列的操作:

        2.1 張量及張量的求導(Tensor)

        # 加入requires_grad=True參數(shù)可追蹤函數(shù)求導x = torch.ones(2,2,requires_grad=True)print(x)print(x.grad_fn)

        # 進行運算y = x + 2print(y)print(y.grad_fn)  # 創(chuàng)建了一個加法操作<AddBackward0 object at 0x0000017AF2F86EF0>

        像x這種直接創(chuàng)建的稱為葉子節(jié)點,葉子節(jié)點對應的 grad_fn 是 None 。

        print(x.is_leaf,y.is_leaf)

        # 整點復雜的操作z = y * y * 3out = z.mean()print(z,out)

        .requires_grad_( ... )改變requires_grad 的屬性。
        a = torch.randn(2,2)    # 缺失情況下默認 requires_grad = Falsea = ((a*3)/(a-1))print(a.requires_grad)  # Falsea.requires_grad_(True)print(a.requires_grad)b = (a*a).sum()print(b.grad_fn)

        2.2 梯度

        現(xiàn)在讓我們反向傳播:因為out包含單個標量,out.backward()所以等效于out.backward(torch.tensor(1.))。

        out.backward()print(x.grad)

        # 再來反向傳播?次,注意grad是累加的out2 = x.sum()out2.backward()print(x.grad)out3 = x.sum()x.grad.data.zero_()out3.backward()print(x.grad)

        三、神經(jīng)網(wǎng)絡設計的pytorch版本
        這是一個簡單的前饋網(wǎng)絡。它獲取輸入,將其一層又一層地饋入,然后最終給出輸出。神經(jīng)網(wǎng)絡的典型訓練過程如下:
        • 定義具有一些可學習參數(shù)(或權重)的神經(jīng)網(wǎng)絡

        • 遍歷輸入數(shù)據(jù)集

        • 通過網(wǎng)絡處理輸入

        • 計算損失(輸出正確的距離有多遠)

        • 將梯度傳播回網(wǎng)絡參數(shù)

        • 通常使用簡單的更新規(guī)則來更新網(wǎng)絡的權重:weight = weight - learning_rate * gradient

        3.1 定義網(wǎng)絡
        import torchimport torch.nn as nnimport torch.nn.functional as Fclass Net(nn.Module):    def __init__(self):        super(Net,self).__init__()        # 1 input image channel, 6 output channels, 3x3 square convolution        # kernel        self.conv1 = nn.Conv2d(1,6,3)        self.conv2 = nn.Conv2d(6,16,3)        # an affine operation: y = Wx + b        self.fc1 = nn.Linear(16*6*6,120)   # 6*6 from image dimension        self.fc2 = nn.Linear(120,84)        self.fc3 = nn.Linear(84,10)    def forward(self,x):        # Max pooling over a (2, 2) window        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))  # CLASStorch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)        x = F.max_pool2d(F.relu(self.conv2(x)),2)        x = x.view(-1,self.num_flat_features(x))        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return x    def num_flat_features(self,x):        size = x.size()[1:] # all dimensions except the batch dimension        num_features = 1        for s in size:            num_features *= s        print(num_features)        return num_featuresnet = Net()print(net)

        # 模型的可學習參數(shù)由返回 net.parameters()params = list(net.parameters())print(len(params))print(params[0].size())  # conv1's .weight

        # 嘗試一個32x32隨機輸入input = torch.randn(1,1,32,32)out = net(input)print(out)

        # 用隨機梯度將所有參數(shù)和反向傳播器的梯度緩沖區(qū)歸零:net.zero_grad()out.backward(torch.randn(1,10))
        3.2 損失函數(shù)
        output = net(input)target = torch.randn(10)    # a dummy target, for exampletarget = target.view(-1,1)  # # make it the same shape as outputcriterion = nn.MSELoss()loss = criterion(output,target)print(loss)

        我們現(xiàn)在的網(wǎng)絡結構:


        # 如果loss使用.grad_fn屬性的屬性向后移動,可查看網(wǎng)絡結構print(loss.grad_fn)  # MSELossprint(loss.grad_fn.next_functions[0][0])  # Linearprint(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

        3.3 更新權重
        實踐中使用的最簡單的更新規(guī)則是隨機梯度下降(SGD):

        weight = weight - learning_rate * gradient

        import torch.optim as optim
        # create your optimizeroptimizer = optim.SGD(net.parameters(),lr = 0.01)
        # in your training loop:optimizer.zero_grad() # zero the gradient buffersoutput = net(input)loss = criterion(output,target)loss.backward()optimizer.step()

        576

        四、寫到最后

        今天,要講的Pytorch基礎教程到這里就結束了,相信大家通過上邊的學習已經(jīng)對Pytorch基礎教程有了初步的了解。

        好消息!

        小白學視覺知識星球

        開始面向外開放啦??????




        下載1:OpenCV-Contrib擴展模塊中文版教程
        在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內容。

        下載2:Python視覺實戰(zhàn)項目52講
        小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

        下載3:OpenCV實戰(zhàn)項目20講
        小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 74
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            中文黄色视频 | 日韩乱轮小说 | 国产在线视频99 | 极品美腿少妇喷水高潮 | 国内女人喷潮完整视频 | 国产aaa精品 | 国产女人18水真多18精品一级做 | 国产精品久久久久久久久免费桃花 | 欧美精品999 | 一区二区三区久久 |