• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 小魚的Pytorch撞墻到撞墻墻到撞墻墻墻的精通之路二:自動微分

    標簽: python  神經網絡  pytorch 深度學習 機器學習


    基于官方教程,記載小魚的個人理解,記錄些許項目,以及不斷遇到的離奇的bug及殺蟲方法。

    autograd

    autograd是pytorch之中的一個核心計算,提供了自動計算微分、跟蹤微分過程、反向傳播的方法,可以讓我們在建立好神經網絡之后,直接調用反向傳播等autograd中包含的方法,高效訓練神經網絡。本文中只簡單介紹一些常用的autograd方法,在后續的機器學習實戰中,小魚將展現給你autograd的用法。

    requires_grad && grad_fn

    設置tensor的requires_grad屬性為True,代表記錄tensor進行的運算操作。對于編程員自己聲明的tensor,默認requires_grad=False,而對于計算得到的tensor,默認requires_grad=True

    import torch
    x=torch.ones(9,5,requires_grad=True)
    y=x+2
    print(x)
    print(y)
    
    tensor([[1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.]], requires_grad=True)
    tensor([[3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.],
            [3., 3., 3., 3., 3.]], grad_fn=<AddBackward0>)
    

    grad_fn則記錄了tensor的計算方法。

    tensor.backward && tesnor.grad

    為了計算某個out對于值x的微分,需要先將out進行反向傳播,再運算x.grad即out對于x的微分值。

    z=3*y*y
    out=z.mean()
    print(z)
    print(out)
    out.backward(retain_graph=True)
    print(x.grad)
    v=torch.ones(9,5)
    z.backward(v)
    print(x.grad)
    
    tensor([[27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.],
            [27., 27., 27., 27., 27.]], grad_fn=<MulBackward0>)
    tensor(27., grad_fn=<MeanBackward0>)
    tensor([[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
            [0.4000, 0.4000, 0.4000, 0.4000, 0.4000]])
    tensor([[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
            [18.4000, 18.4000, 18.4000, 18.4000, 18.4000]])
    

    由于out是一個值,x則是9×59\times5矩陣,所以out對x的微分用矩陣表示,矩陣中每個值,即out對該位置的值的微分。而且由于out是一個值,所以out.backward不需要填寫參數,默認參數為torch.tensor(1.)。文中還設置了retain_graph=True,是為了下文再進行backward操作,否則后續backward操作會報錯。而反向傳播矩陣z時,我們則需要設置一個同規模的簡單矩陣,以之為參數進行反向傳播。
    關于原理可以參考官方文檔中的這部分內容。從x到out的計算過程相同,區別在于官方文檔的x規模為2×22\times2
    在這里插入圖片描述

    總結&&參考文獻

    神經網絡中常用的即tensor.backward()方法和tensor.grad()方法,熟練使用可以高效編寫神經網絡代碼。
    PyTorch官方教程中文版:http://pytorch123.com/

    版權聲明:本文為StarfishCu原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/StarfishCu/article/details/107061873

    智能推薦

    jquery 圖像滑塊_jQuery的圖像墻

    jquery 圖像滑塊 View demo 查看演示 Download Source 下載源 Today we want to show you how to create a neat image wall with jQuery. The idea is to scatter some thumbnails with different sizes on the page and make a...

    Flex 實現可伸縮的圖片墻

    效果演示: CSS 部分 CSS 在這個過程中占了重點,運用 flex 可以使各個元素按一定比例占據頁面。在調試的時候,可以把邊框顯示出來方便查看效果。(border: 1px solid #f00;) 將 .panels 設置為 display:flex 設定每個子 panel 的 flex 值為 1 針對每個子 panel,設為 display:flex,設置其 flex 主軸方向 控制 .p...

    照片墻

    通過調取Win窗口選取圖片并且均勻切割后展示在屏幕中,小圖可以隨鼠標介入放大,周圍圖片做擴散。 首先,調取Win窗口選取所需圖片,并下載下來; 圖片加載好后調取事件對圖片進行切割,在UI上對切割刀圖片進行布局設置、 3.鼠標移入事件 4.鼠標移出事件 工程部分截圖 下面是工程鏈接地址:https://download.csdn.net/download/qq_24099007/10503578...

    照片墻

     ...

    墻磚

    問題描述 : 你的面前有一堵矩形的、由多行磚塊組成的磚墻。 這些磚塊高度相同但是寬度不同。你現在要畫一條自頂向下的、穿過最少磚塊的垂線。 磚墻由行的列表表示。 每一行都是一個代表從左至右每塊磚的寬度的整數列表。 如果你畫的線只是從磚塊的邊緣經過,就不算穿過這塊磚。你需要找出怎樣畫才能使這條線穿過的磚塊數量最少,并且返回穿過的磚塊數量。 你不能沿著墻的兩個垂直邊緣之一畫線,這樣顯然是沒有穿過一塊磚的...

    猜你喜歡

    神奇的Batch Normalization 如果一個模型僅訓練BN層會是什么樣的

    您可能會感到驚訝,但這是有效的。 ? 最近,我閱讀了arXiv平臺上的Jonathan Frankle,David J. Schwab和Ari S. Morcos撰寫的論文“Training BatchNorm and Only BatchNorm: On the Expressive Power of Random Features in CNNs”。 這個主意立刻引起了...

    用Python實現校園通知更新提醒

    前言 這個項目實已經在一個月前已經完成了,一直都想寫一篇博客來總結這個過程中遇到的一些問題。但最近一個月來都比較忙,所以一直拖到了現在。 首先說說起因吧,我沒事的時候,總喜歡依次點開學校主頁、教務處、圖書館以及學院的網站,看看有沒有什么新通知,雖然大多與我無關。恰逢最近正在學Python,經常聽到別人說用Python寫爬蟲很簡單,但自己尚未接觸過爬蟲。于是抱著試一試的心態看了幾篇關于Python爬...

    spring_ioc相關_第一章

    1 spring是一站式框架,在javaee的三層結構中,每一層都提供不提并的解決技術 web層:springMVC service層:spring的ioc dao層:spring的jdbcTemplate 2 javaee為避免兩個類之間出現耦合,則把對象的創建交給spring進行管理,spring的ioc操作:(1)ioc的配置文件方式;(2)ioc注解方式 3 ioc的底層原理使用技術(1)...

    【Python+OpenCV】視頻流局部區域像素值處理-一種特征提取方法

    參考我之前寫的處理圖片的文章:Python+OpenCV實現【圖片】局部區域像素值處理(改進版) 開發環境:Python3.6.0 + OpenCV3.2.0 任務目標:攝像頭采集圖像(例如:480*640),并對視頻流每一幀(灰度圖)特定矩形區域(480*30)像素值進行行求和,得到一個480*1的數組,用這480個數據繪制條形圖,即在逐幀采集視頻流并處理后“實時”顯示采...

    JavaWeb——【前端】——注冊頁面

    頁面效果 實現代碼 注意事項 主要使用的bootstrap樣式 如果想引用,不要直接復制,沒用的。 先介紹下所引用的文件: boostrap的js、bootstrap的css、jquery的js、以及自己編寫的register.css。 因為博主用的thymeleaf語法,所以有th符號。 若要使用時,根據個人情況導入相應的依賴。...

    精品国产乱码久久久久久蜜桃不卡