1. 程式人生 > >【PyTorch深度學習60分鐘快速入門 】Part1:PyTorch是什麽?

【PyTorch深度學習60分鐘快速入門 】Part1:PyTorch是什麽?

修改 .com org -c .cn ndarray 兩種 ble 我們

0x00 PyTorch是什麽?

PyTorch是一個基於Python的科學計算工具包,它主要面向兩種場景:

  • 用於替代NumPy,可以使用GPU的計算力
  • 一種深度學習研究平臺,可以提供最大的靈活性和速度

0x01 開始學習

1、Tensors

Tensors(張量)類似於numpy的ndarrays,不過Tensors還可以運行於GPU上以提升計算速度。

from __future__ import print_function
import torch

創建一個5x3且未初始化的矩陣:

x = torch.Tensor(5, 3)
print(x)

輸出結果:

 0.0000e+00  0.0000e+00  3.1766e-27
 4.5880e-41  3.1950e-27  4.5880e-41
 1.9468e-22  4.5880e-41  1.9468e-22
 4.5880e-41  2.3214e-22  4.5880e-41
 2.2306e-22  4.5880e-41 -2.7458e+32
[torch.FloatTensor of size 5x3]

創建一個隨機初始化的矩陣:

x = torch.rand(5, 3)
print(x)

輸出結果:

 0.9559  0.8026  0.4142
 0.8142  0.8763  0.6700
 0.4673  0.0675  0.3439
 0.2200  0.1499  0.6082
 0.7853  0.8487  0.8124
[torch.FloatTensor of size 5x3]

獲取矩陣大小:

print(x.size())

輸出結果:

torch.Size([5, 3])

註意:torch.Size實際上是一個元組,所以它支持元組的所有操作。

2、操作

PyTorch中的操作有很多不同的語法,下面我們以加法為例來學習其操作語法:
(1)加法:語法1

y = torch.rand(5, 3)
print(x + y)            # x為上文中定義的x

輸出結果:

 1.7700  1.7643  1.3732
 1.3085  1.4576  0.9668
 0.9354  0.0891  0.4727
 0.6503  0.6814  1.2334
 1.5436  0.9600  1.0965
[torch.FloatTensor of size 5x3]

(2)加法:語法2

print(torch.add(x, y))            # x為上文中定義的x

輸出結果:

 1.7700  1.7643  1.3732
 1.3085  1.4576  0.9668
 0.9354  0.0891  0.4727
 0.6503  0.6814  1.2334
 1.5436  0.9600  1.0965
[torch.FloatTensor of size 5x3]

(3)加法:將結果賦值給Tensor對象

result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
print(result)

輸出結果:

 1.7700  1.7643  1.3732
 1.3085  1.4576  0.9668
 0.9354  0.0891  0.4727
 0.6503  0.6814  1.2334
 1.5436  0.9600  1.0965
[torch.FloatTensor of size 5x3]

(4)加法:原地替換

# adds x to y
y.add_(x)
print(y)

輸出結果:

 1.7700  1.7643  1.3732
 1.3085  1.4576  0.9668
 0.9354  0.0891  0.4727
 0.6503  0.6814  1.2334
 1.5436  0.9600  1.0965
[torch.FloatTensor of size 5x3]

註意: 任何原地改變張量值的操作後綴都是固定的_,例如:x.copy_(y)x.t_(),都將原地改變x的值。
另外,你可以使用標準的numpy索引來操作Tensor對象。

print(x[:, 1])

輸出結果:

 0.8026
 0.8763
 0.0675
 0.1499
 0.8487
[torch.FloatTensor of size 5]

調整大小:如果你想調整或重塑張量形狀,那麽可以使用torch.view

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())

輸出結果:

torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

擴展閱讀: 這裏介紹了超過100個Tensor操作,包括轉置、索引、切片、數學操作、線性代數、隨機數等。

0x02 NumPy轉換

將torch中的張量轉換為numpy中的數組或者反過來都是輕而易舉的事。
torch張量與numpy數組將共享它們底層的內存位置,改變二者之一都將會改變另一個。

1、將torch張量轉換為numpy數組

定義一個torch張量對象:

a = torch.ones(5)
print(a)

輸出結果:

 1
 1
 1
 1
 1
[torch.FloatTensor of size 5]

將torch張量對象轉換為numpy中的數組對象:

b = a.numpy()
print(b)

輸出結果:

[ 1.  1.  1.  1.  1.]

下面查看numpy數組值是如何變化的:

a.add_(1)
print(a)
print(b)

輸出結果:

 2
 2
 2
 2
 2
[torch.FloatTensor of size 5]

[ 2.  2.  2.  2.  2.]

2、將numpy數組轉換為torch張量

下面查看修改numpy數組是如何自動改變torch張量的:

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

輸出結果:

[ 2.  2.  2.  2.  2.]

 2
 2
 2
 2
 2
[torch.DoubleTensor of size 5]

在CPU上的所有的張量,除了CharTensor之外,都支持轉換成NumPy對象,也支持反向轉換。

0x03 CUDA張量

使用.cuda函數可以將張量移到GPU上進行計算:

# 只有當CUDA可用時才會進行下面計算
if torch.cuda.is_available():
    x = x.cuda()
    y = y.cuda()
    x + y

以上腳本的總運行時間為:0分0.132秒。

本文中所使用的Python代碼: tensor_tutorial.py

【PyTorch深度學習60分鐘快速入門 】Part1:PyTorch是什麽?