中文版官方教程:http://pytorch123.com/
1.一篇總結(jié)很好的文章
pytorch學(xué)習(xí):https://blog.csdn.net/lantuxin/article/details/87709344
2.查看類型拾因、大小
實(shí)例:
import torch
a=torch.tensor([1,2,3],dtype=torch.float32)
print(a)
print(a.type())#查看類型
print(type(a))#查看類型
#size等價于shape
print(a.shape)#查看大小
print(a.size())#查看大小
打印結(jié)果:
tensor([1., 2., 3.])
torch.FloatTensor
<class 'torch.Tensor'>
torch.Size([3])
torch.Size([3])
3.轉(zhuǎn)換Torch tensor到numpy
實(shí)例:
import numpy as np
import torch
a=torch.tensor([1,2,3],dtype=torch.float32)
print(a)
print(a.type())#查看類型
b=a.numpy()
print(b)
print(type(b))
打印結(jié)果:
tensor([1., 2., 3.])
torch.FloatTensor
[1. 2. 3.]
<class 'numpy.ndarray'>
4.轉(zhuǎn)換numpy到Torch tensor
實(shí)例:
import numpy as np
import torch
c=np.array([[1,2]])
print(c)
a=torch.from_numpy(c)
print(a)
print(torch.tensor(c))
打印結(jié)果:
[[1 2]]
tensor([[1, 2]], dtype=torch.int32)
tensor([[1, 2]], dtype=torch.int32)
5.轉(zhuǎn)置
實(shí)例:
import torch
c=torch.tensor([[1,2]])
print(c)
print(c.t())
打印結(jié)果:
tensor([[1, 2]])
tensor([[1],
? ? ? ? [2]])
6.dot()
錯誤1:RuntimeError: dot: Expected 1-D argument self, but got 2-D
????新版本中(>=0.3.0), 關(guān)于 tensor.dot() 有了新的改變, 它只能針對于一維的數(shù)組. 所以上面的有所改變.輸入1維數(shù)組就ok
實(shí)例:
import torch
a=torch.tensor([[1,2,3],[0,3,6]])
print(a)
b=torch.tensor([[2,1,2],[1,2,3]])
print(b)
c=torch.dot(a.flatten(),b.flatten())
print(c)
打印結(jié)果:
tensor([[1, 2, 3],
? ? ? ? [0, 3, 6]])
tensor([[2, 1, 2],
? ? ? ? [1, 2, 3]])
tensor(34)
7.矩陣乘法:@条获、mm
實(shí)例:
import torch
a=torch.tensor([[1,2,3],[0,3,6]])
b=torch.tensor([[2,1,2],[1,2,3]])
print(a@b.t())
print(torch.mm(a,b.t()))
打印結(jié)果:
tensor([[10, 14],
? ? ? ? [15, 24]])
tensor([[10, 14],
? ? ? ? [15, 24]])
8.where
實(shí)例:
import torch
a=torch.tensor([[1,2,3],[0,3,6]])
a=torch.where(a>0,torch.tensor(0),torch.tensor(-1))
print(a)
打印結(jié)果:
tensor([[ 0, 0, 0],
? ? ? ? [-1,? 0,? 0]])
9.查看系統(tǒng)是否支持CHDA
實(shí)例:
import torch
print(torch.cuda.is_available())
打印結(jié)果:
True(我自己電腦上裝有GPU顯卡)
10.使用GPU和CPU計(jì)算
很好的原文:https://blog.csdn.net/qq_21578849/article/details/85240797
(1)模型轉(zhuǎn)為cuda
gpus = [0] #使用哪幾個GPU進(jìn)行訓(xùn)練滤钱,這里選擇0號GPU
cuda_gpu = torch.cuda.is_available()? #判斷GPU是否存在可用
net = Net(12288, 25, 16, 6)
if(cuda_gpu):
? ? net = torch.nn.DataParallel(net, device_ids=gpus).cuda()? #將模型轉(zhuǎn)為cuda類型
(2)數(shù)據(jù)轉(zhuǎn)化為cuda
(minibatchX, minibatchY) = minibatch
minibatchX = minibatchX.astype(np.float32).T
minibatchY = minibatchY.astype(np.float32).T
if(cuda_gpu):
? ? b_x = Variable(torch.from_numpy(minibatchX).cuda())? ? #將數(shù)據(jù)轉(zhuǎn)為cuda類型
? ? b_y = Variable(torch.from_numpy(minibatchY).cuda())
else:
? ? b_x = Variable(torch.from_numpy(minibatchX))
? ? b_y = Variable(torch.from_numpy(minibatchY))
(3)輸出數(shù)據(jù)去cuda僧叉,轉(zhuǎn)為numpy
correct_prediction = sum(torch.max(output, 1)[1].data.squeeze() == torch.max(b_y, 1)[1].data.squeeze())
if(cuda_gpu):
? ? correct_prediction = correct_prediction.cpu().numpy()? #.cpu將cuda轉(zhuǎn)為tensor類型叉讥,.numpy將tensor轉(zhuǎn)為numpy類型
else:
? ? correct_prediction = correct_prediction.numpy()
(4)附加
實(shí)例:
import torch
a=torch.tensor([[1,2,3],[0,3,6]])
b=torch.tensor([[2,1,2],[1,2,3]])
print(torch.cuda.is_available())
if torch.cuda.is_available():
a=a.cuda()
b=b.cuda()
else:
a=a.cpu()
b=b.cpu()
print(a+b)#GPU
打印結(jié)果:
True(我自己電腦上有GPU)
tensor([[3, 3, 5],
? ? ? ? [1, 5, 9]], device='cuda:0')
11.一個簡單的梯度下降實(shí)例
(1)~(4):預(yù)備工作侍郭;(5):小案例
(1)zip
????使用zip()函數(shù)來可以把列表合并鸠珠,并創(chuàng)建一個元組對的列表
????好文鏈接:https://www.cnblogs.com/wdz1226/p/10181354.html
附加實(shí)例:
x=[1,2,3]
y=[4,5,6]
print(zip(x,y))
for i in zip(x,y):
print(i)
打印結(jié)果:
<zip object at 0x000002A45F847888>
(1, 4)
(2, 5)
(3, 6)
(2)grad_fn
原文鏈接:https://blog.csdn.net/duanmuji/article/details/85217338
Varibale包含三個屬性:
data:存儲了Tensor遗淳,是本體的數(shù)據(jù)
grad:保存了data的梯度变泄,本事是個Variable而非Tensor弊仪,與data形狀一致
grad_fn:指向Function對象,用于反向傳播的梯度計(jì)算之用
(3)mean
原文鏈接:https://blog.csdn.net/sinat_40624829/article/details/91127373
torch.mean(input) 輸出input 各個元素的的均值杖刷,不指定任何參數(shù)就是所有元素的算術(shù)平均值励饵,指定參數(shù)可以計(jì)算每一行或者 每一列的算術(shù)平均數(shù)
(4)backward()
pytorch中 backward 機(jī)制理解:https://blog.csdn.net/baidu_36161077/article/details/81435627
(5)小案例
a)案例1
import torch
from torch.autogradimport Variable
x=Variable(torch.tensor([1.,2,3]),requires_grad=True)#使用Variable()封裝變量
z=x+3
y=2*z
print(z)
print(y)
print(y.grad_fn)#每一步的操作。pyThorch根據(jù)每一步的操作計(jì)算導(dǎo)數(shù)滑燃。
#backward只能被應(yīng)用在一個標(biāo)量上役听,也就是一個一維tensor,或者傳入跟變量相關(guān)的梯度表窘。
y=y.mean()#變成標(biāo)量典予。
y.backward()
#dx=1/3*2
print(x.grad)#打印導(dǎo)數(shù)。對標(biāo)量求導(dǎo)乐严。
print(x.data)
b=torch.tensor([2.],requires_grad=True)#實(shí)際中瘤袖,在后期版本,將Variable和tensor的東西合并了昂验,不需要使用Variable()封裝變量捂敌。
b.backward()
print(b.grad )
打印結(jié)果:
tensor([4., 5., 6.], grad_fn=<AddBackward0>)
tensor([ 8., 10., 12.], grad_fn=<MulBackward0>)
<MulBackward0 object at 0x0000024AAC36B080>
tensor([0.6667, 0.6667, 0.6667])
tensor([1., 2., 3.])
tensor([1.])
b)案例2
import random
_x=[i/100 for i in range(100)]#i/100:歸一化
print(_x)
_y=[3*e+4 for e in _x]
print(_y)
#隨機(jī)給w、b
w=random.random()
b=random.random()
for i in range(100):
????for x,yin zip(_x,_y):
????#前向傳播
? ? ? ? z=w*x+b
????????o=2*z-y
????????loss=o**2
? ? ? ? #反向求導(dǎo)
? ? ? ? dw=-2*o*x
????????db=-2*o
#梯度更新
? ? ? ? w=w+0.1*dw#0.1:步長既琴、學(xué)習(xí)率
? ? ? ? b=b+0.1*db
print(w,b,loss)