(二)pytorch學習筆記

2021-03-02 coderpai

博客地址:https://blog.csdn.net/CoderPai/article/details/104137705
點擊閱讀原文,更好的閱讀體驗
CoderPai 是一個專注於人工智慧在量化交易應用的算法實戰平臺,主要關注人工智慧在量化交易上面的應用。如果你對人工智慧感興趣,請快快關注 「CoderPai」 微信號(coderpai)吧。

(一)pytorch學習筆記

(二)pytorch學習筆記

關係擬合 (回歸)

我會這次會來見證神經網絡是如何通過簡單的形式將一群數據用一條線條來表示. 或者說, 是如何在數據當中找到他們的關係, 然後用神經網絡模型來建立一個可以代表他們關係的線條.

建立數據集

我們創建一些假數據來模擬真實的情況. 比如一個一元二次函數: y = a * x^2 + b, 我們給 y 數據加上一點噪聲來更加真實的展示它.

import torch
import matplotlib.pyplot as plt

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size())                 # noisy y data (tensor), shape=(100, 1)

# 畫圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

建立神經網絡

建立一個神經網絡我們可以直接運用 torch 中的體系. 先定義所有的層屬性(__init__()), 然後再一層層搭建(forward(x))層於層的關係連結. 建立關係的時候, 我們會用到激勵函數.

import torch
import torch.nn.functional as F     # 激勵函數都在這

class Net(torch.nn.Module):  # 繼承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()     # 繼承 __init__ 功能
        # 定義每層用什麼樣的形式
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隱藏層線性輸出
        self.predict = torch.nn.Linear(n_hidden, n_output)   # 輸出層線性輸出

    def forward(self, x):   # 這同時也是 Module 中的 forward 功能
        # 正向傳播輸入值, 神經網絡分析出輸出值
        x = F.relu(self.hidden(x))      # 激勵函數(隱藏層的線性值)
        x = self.predict(x)             # 輸出值
        return x

net = Net(n_feature=1, n_hidden=10, n_output=1)

print(net)  # net 的結構
"""
Net (
  (hidden): Linear (1 -> 10)
  (predict): Linear (10 -> 1)
)
"""

訓練網絡

訓練的步驟很簡單, 如下:

# optimizer 是訓練的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  # 傳入 net 的所有參數, 學習率
loss_func = torch.nn.MSELoss()      # 預測值和真實值的誤差計算公式 (均方差)

for t in range(100):
    prediction = net(x)     # 餵給 net 訓練數據 x, 輸出預測值

    loss = loss_func(prediction, y)     # 計算兩者的誤差

    optimizer.zero_grad()   # 清空上一步的殘餘更新參數值
    loss.backward()         # 誤差反向傳播, 計算參數更新值
    optimizer.step()        # 將參數更新值施加到 net 的 parameters 上

可視化訓練過程

為了可視化整個訓練的過程, 更好的理解是如何訓練, 我們如下操作:

import matplotlib.pyplot as plt

plt.ion()   # 畫圖
plt.show()

for t in range(200):

    ...
    loss.backward()
    optimizer.step()

    # 接著上面來
    if t % 5 == 0:
        # plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)

在這裡插入圖片描述區分類型 (分類)

這次我們也是用最簡單的途徑來看看神經網絡是怎麼進行事物的分類.

在這裡插入圖片描述建立數據集

我們創建一些假數據來模擬真實的情況. 比如兩個二次分布的數據, 不過他們的均值都不一樣.

import torch
import matplotlib.pyplot as plt

# 假數據
n_data = torch.ones(100, 2)         # 數據的基本形態
x0 = torch.normal(2*n_data, 1)      # 類型0 x data (tensor), shape=(100, 2)
y0 = torch.zeros(100)               # 類型0 y data (tensor), shape=(100, )
x1 = torch.normal(-2*n_data, 1)     # 類型1 x data (tensor), shape=(100, 1)
y1 = torch.ones(100)                # 類型1 y data (tensor), shape=(100, )

# 注意 x, y 數據的數據形式是一定要像下面一樣 (torch.cat 是在合併數據)
x = torch.cat((x0, x1), 0).type(torch.FloatTensor)  # FloatTensor = 32-bit floating
y = torch.cat((y0, y1), ).type(torch.LongTensor)    # LongTensor = 64-bit integer

# plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')
# plt.show()

# 畫圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

建立神經網絡

建立一個神經網絡我們可以直接運用 torch 中的體系. 先定義所有的層屬性(__init__()), 然後再一層層搭建(forward(x))層於層的關係連結. 這個和我們在前面 regression 的時候的神經網絡基本沒差. 建立關係的時候, 我們會用到激勵函數.

import torch
import torch.nn.functional as F     # 激勵函數都在這

class Net(torch.nn.Module):     # 繼承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()     # 繼承 __init__ 功能
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隱藏層線性輸出
        self.out = torch.nn.Linear(n_hidden, n_output)       # 輸出層線性輸出

    def forward(self, x):
        # 正向傳播輸入值, 神經網絡分析出輸出值
        x = F.relu(self.hidden(x))      # 激勵函數(隱藏層的線性值)
        x = self.out(x)                 # 輸出值, 但是這個不是預測值, 預測值還需要再另外計算
        return x

net = Net(n_feature=2, n_hidden=10, n_output=2) # 幾個類別就幾個 output

print(net)  # net 的結構
"""
Net (
  (hidden): Linear (2 -> 10)
  (out): Linear (10 -> 2)
)
"""

訓練網絡

訓練的步驟很簡單, 如下:

# optimizer 是訓練的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.02)  # 傳入 net 的所有參數, 學習率
# 算誤差的時候, 注意真實值!不是! one-hot 形式的, 而是1D Tensor, (batch,)
# 但是預測值是2D tensor (batch, n_classes)
loss_func = torch.nn.CrossEntropyLoss()

for t in range(100):
    out = net(x)     # 餵給 net 訓練數據 x, 輸出分析值

    loss = loss_func(out, y)     # 計算兩者的誤差

    optimizer.zero_grad()   # 清空上一步的殘餘更新參數值
    loss.backward()         # 誤差反向傳播, 計算參數更新值
    optimizer.step()        # 將參數更新值施加到 net 的 parameters 上

可視化訓練過程

為了可視化整個訓練的過程, 更好的理解是如何訓練, 我們如下操作:

import matplotlib.pyplot as plt

plt.ion()   # 畫圖
plt.show()

for t in range(100):

    ...
    loss.backward()
    optimizer.step()

    # 接著上面來
    if t % 2 == 0:
        plt.cla()
        # 過了一道 softmax 的激勵函數後的最大概率才是預測值
        prediction = torch.max(F.softmax(out), 1)[1]
        pred_y = prediction.data.numpy().squeeze()
        target_y = y.data.numpy()
        plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')
        accuracy = sum(pred_y == target_y)/200.  # 預測中有多少和真實值一樣
        plt.text(1.5, -4, 'Accuracy=%.2f' % accuracy, fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)

plt.ioff()  # 停止畫圖
plt.show()

在這裡插入圖片描述

連結:

https://morvanzhou.github.io/tutorials/machine-learning/torch/

https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/301_regression.py

https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/302_classification.py

作者:chen_h

微信號&QQ:862251340

相關焦點

  • pytorch學習筆記(2):在 MNIST 上實現一個 cnn
    在前面我要先說一下,這個系列是為了讓大家對 pytorch 從入門到熟悉,對於 deep learning 相關的知識我們不會花費過多的內容去介紹。如果大家對一些 DL 的基礎相關知識不懂的話,推薦幾個資源去學習:所以我們在筆記中對於一些相關的知識就不做深入介紹了。
  • 從零開始深度學習Pytorch筆記(12)—— nn.Module
    從零開始深度學習Pytorch筆記(1)——安裝Pytorch從零開始深度學習Pytorch
  • PyTorch 學習筆記(七):PyTorch的十個優化器
    點擊文末「閱讀原文」立刻申請入群~作者 | 餘霆嵩來源專欄 | PyTorch學習筆記https://blog.csdn.net/u011995719/article/details/88988420本文截取自一個github上千星的火爆教程——《PyTorch 模型訓練實用教程》,教程內容主要為在
  • pytorch專題前言 | 為什麼要學習pytorch?
    2.為什麼要學習pytorch呢?3.學習了pytorch我怎麼應用呢?4.按照什麼順序去學習pytorch呢?5.網上那麼多資料如何選擇呢?現在開始逐一的對以上問題提出自己的看法,可能想的不夠周全,歡迎討論區一起探討!1.生物學科的朋友需要學編程麼?需要!
  • 在Linux系統中安裝深度學習框架Pytorch
    設為星標才不會錯過哦     你好呀 我是然怡這篇推文是兩個月前復現深度學習論文時做的筆記一系列的筆記做了好幾篇看著閱讀量很低就沒有再發公眾號很久沒有推文了前幾天對公眾號進行了小改「然怡乾貨鋪」改為「水文sw」頭像也是換了的
  • Pytorch深度學習從入門到成仙系列二
    他有本書叫《深度學習推薦系統》。工程和理論之間要有一個權衡。進了企業和學校不一樣,是要做一些工程的。讀了研僅僅只是多吃了三年的食堂嗎。研究生下了社會也是要實踐的,但是研究生要源於實踐還要高於實踐。       說說培訓,培訓可以說是軟體工程行業的「潛規則」。雖然我沒有培訓過,但是我也在聽一些培訓的視頻。四個月的培訓和四年的大學究竟有什麼區別。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    回想了一下自己關於 pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。有的教程一上來就是寫一個 cnn,雖然其實內容很簡單,但是直接上手容易讓人找不到重點,學的雲裡霧裡。
  • Pytorch 矩陣進階(二)
    pytorch 矩陣進階(二)「並不是所有的技巧都可以從參考書或者博客裡面學習到,因為它們能寫的東西很有限。」 這句話可能出自以後某一天我瞎說的,但是至少目前來說,它並沒有錯。就像是「沒有免費午餐定理」告訴我們沒有一個模型適用於所有場景一樣具有局限性。
  • 資料|【乾貨】PyTorch學習資源匯總
    建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。開源書籍:這是一本開源的書籍,目標是幫助那些希望和使用PyTorch進行深度學習開發和研究的朋友快速入門。但本文檔不是內容不是很全,還在持續更新中。簡單易上手的PyTorch中文文檔:非常適合新手學習。
  • 深度學習框架搭建之PyTorch
    深度學習框架搭建之PyTorchPyTorch 簡介PyTorch 是由 Facebook 推出,目前一款發展與流行勢頭非常強勁的深度學習框架。如果學習過 NumPy 以及常見的深度學習概念(如卷積層,循環層等),非常容易上手PyTorch。目前主流的深度學習框架主要有 TensorFlow,PyTorch,mxnet,caffe和Keras 等。
  • 深度學習大講堂之pytorch入門
    ,他們也一直在支持一些開源的深度學習框架,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。今天小天就帶大家從數據操作、自動求梯度和神經網絡設計的pytorch版本三個方面來入門pytorch。
  • PyTorch  深度學習新手入門指南
    ,這篇文章是為想開始用pytorch來進行深度學習項目研究的人準備的。如果在領英上,你也許會說自己是一個深度學習的狂熱愛好者,但是你只會用 keras 搭建模型,那麼,這篇文章非常適合你。2. 你可能對理解 tensorflow 中的會話,變量和類等有困擾,並且計劃轉向 pytorch,很好,你來對地方了。3. 如果你能夠用 pytorch 構建重要、複雜的模型,並且現在正在找尋一些實現細節,不好意思,你可以直接跳到最後一部分。
  • 帶你少走彎路:強烈推薦的Pytorch快速入門資料和翻譯(可下載)
    本文內容較多,可以在線學習,如果需要本地調試,請到github下載:https://github.com/fengdu78/Data-Science-Notes/tree/master/8.deep-learning/PyTorch_beginner此教程為翻譯官方地址:https://pytorch.org/tutorials/beginner
  • Torch7 開源 PyTorch:Python 優先深度學習框架
    >PyTorch 介紹在粒度層面(granular level)上,PyTorch 庫包含了以下組件:使用 PyTorch 的原因通常有二:我們為 GPU 編寫了自定義內存分配器,以保證深度學習模型在運行時有最高的內存效率,這意味著在相同硬體的情況下,你可以訓練比以前更為複雜的深度學習模型。輕鬆拓展編寫新的神經網絡模塊,或與 PyTorch 的 Tensor API 相接的設計都是很直接的,不太抽象。
  • 新手必備 | 史上最全的PyTorch學習資源匯總
    (3)這是一個比較偏算法實戰的PyTorch代碼教程,在github上有很高的star,https://github.com/yunjey/pytorch-tutorial。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。(4)接下來為大家介紹一本開源書籍:https://github.com/zergtant/pytorch-handbook。
  • 【乾貨】史上最全的PyTorch學習資源匯總
    · 比較偏算法實戰的PyTorch代碼教程(https://github.com/yunjey/pytorch-tutorial):在github上有很高的star。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。官網:http://pytorch.orgGitHub:https://github.com/pytorch/pytorchPyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:使用強大的 GPU 加速的 Tensor 計算(類似 numpy)構建於基於 tape 的 autograd 系統的深度神經網絡如有需要,你也可以復用你最喜歡的
  • 用 PyTorch 實現一個簡單的分類器
    pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。所以我總結了一下自己當初學習的路線,準備繼續深入鞏固自己的 pytorch 基礎;另一方面,也想從頭整理一個教程,從沒有接觸過 pytorch 開始,到完成一些最新論文裡面的工作。以自己的學習筆記整理為主線,大家可以針對參考。第一篇筆記,我們先完成一個簡單的分類器。
  • 最全面的深度學習框架pytorch搭建過程
    深度學習一直是比較熱門的話題,在動手學習之前,需要搭建深度學習框架,如pytorch、TensorFlow、caffe、mxnet等。
  • 深度學習筆記15:ubuntu16.04 下深度學習開發環境搭建與配置
    作者:魯偉一個數據科學踐行者的學習日記。