主要內容:
1、tensor的定義
2、tensor與numpy的相互轉換
3、tensor使用cuda加速
4、tensor封裝成Variable后的使用
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 8 16:40:47 2019
pytorch快速入門教程
參考書籍:《深度學習框架pytorch:入門與實踐》
@author: zhaoqidong
"""
import torch as t
import numpy as np
#####################1Tensor的基礎使用###########
#1.1、構建5*3的矩陣,未分配空間進行初始化
x1=t.Tensor(5,3)
print(x1)
#1.2、使用[0 1]的均勻分布隨機初始化二維數組
x2=t.rand(5,3)
print(x2)
#1.3、查看矩陣的形狀
print(x2.shape)
print(x2.size())#等價寫法
#1.4、tensor 的加法
y=t.rand(5,3)
z=y+x1
print(z)
y2=t.add(y,x1)#加法的等價寫法
print(y2)
y2.add_(100)
print(y2)
#注釋:add_與add的不同
# add_ 以_進行結尾,函數會修改對象本身的值
# add的語法則是等式形式
########################2、Tensor與numpy的結合###########################
#tensor不支持的操作可以先轉為numpy,操作之后在轉為tensor進行操作
#2.1、tensor轉換為numpy
a_tensor=t.ones(5)
print(a_tensor)
b_np=a_tensor.numpy()#tensor—>numpy
print(b_np)
#2.2、將numpy轉換為tensor
c_np=np.ones(5)
print(c_np)
d_tensor=t.from_numpy(c_np)#numpy->tensor
print(d_tensor)
#注意:tensor與numpy之間的轉換,對象共享內存!!
# 內存共享意味着二者之間的轉換會很快,
# 但是同時意味着一方的值改變之后,另外一方的值也會隨之更改。
#驗證如下:
a_tensor.add_(1000)
print("內存共享:",a_tensor)
print("內存共享:",b_np)
##################3、tensor可以使用CUDA加速######################
if t.cuda.is_available():
y=y.cuda()
y2=y2.cuda()
print(x+y2)
#####################4、Autograd:自動微分#######################
#autograd.Veribale是Autograd中的核心類,封裝了tensor之后,可以調用backward實現自動計算反向梯度
from torch.autograd import Variable
x_var=Variable(t.ones(2,2),requires_grad=True)
print(x_var)
y_var=x_var.sum()
print(y_var)
print(y_var.grad_fn)
y_var.backward()
print("第一次反向傳播",x_var.grad)
y_var.backward()
print("第二次反向傳播",x_var.grad)
# 注意:grad在反向傳播的過程中是累加的,深度學習是多層神經網絡,在每次反向傳播結束之后會累加上次的結果。
# 基於上述原因,訓練過程中會在首次反向傳播之前將梯度置為零。
#將梯度置為零
x_var.grad.data.zero_()
print(x_var.grad)
y_var.backward()
print("置零之后反向傳播",x_var.grad)
