import torch import numpy as np np_data = np.arange(6).reshape((2, 3)) torch_data = torch.from_numpy(np_data) tensor2array = torch_data.numpy()
# abs 絕對值計算 data = [-1, -2, 1, 2] tensor = torch.FloatTensor(data) # 轉換成32位浮點 tensor print( '\nabs', '\nnumpy: ', np.abs(data), # [1 2 1 2] '\ntorch: ', torch.abs(tensor) # [1 2 1 2] ) # sin 三角函數 sin print( '\nsin', '\nnumpy: ', np.sin(data), # [-0.84147098 -0.90929743 0.84147098 0.90929743] '\ntorch: ', torch.sin(tensor) # [-0.8415 -0.9093 0.8415 0.9093] ) # mean 均值 print( '\nmean', '\nnumpy: ', np.mean(data), # 0.0 '\ntorch: ', torch.mean(tensor) # 0.0 ) # matrix multiplication 矩陣點乘 data = [[1,2], [3,4]] tensor = torch.FloatTensor(data) # 轉換成32位浮點 tensor # correct method print( '\nmatrix multiplication (matmul)', '\nnumpy: ', np.matmul(data, data), # [[7, 10], [15, 22]] '\ntorch: ', torch.mm(tensor, tensor) # [[7, 10], [15, 22]] ) # !!!! 下面是錯誤的方法 !!!! data = np.array(data) print( '\nmatrix multiplication (dot)', '\nnumpy: ', data.dot(data), # [[7, 10], [15, 22]] 在numpy 中可行 '\ntorch: ', tensor.dot(tensor) # torch 會轉換成 [1,2,3,4].dot([1,2,3,4) = 30.0 )
在Torch中的Variable就是一個存放會變化的值的地理位置。裏面的值會不停的變化。其中的值就是torch的Tensor.若是用Variable進行計算,那返回的也是一個同類型的Variable.python
import torch from torch.autograd import Variable # torch 中 Variable 模塊 # 先生雞蛋 tensor = torch.FloatTensor([[1,2],[3,4]]) # 把雞蛋放到籃子裏, requires_grad是參不參與偏差反向傳播, 要不要計算梯度 variable = Variable(tensor, requires_grad=True) print(tensor) """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable) """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """
t_out = torch.mean(tensor*tensor) # x^2 v_out = torch.mean(variable*variable) # x^2 print(t_out) print(v_out) # 7.5
時刻計住,Variable計算是,它在背景幕布後面一步步默默搭建着一個龐大的系統,叫作計算圖,computational graph.這個圖將全部的計算步驟(節點)都鏈接起來,最後進行偏差反向傳遞的時候一次性將全部variable裏面的修改幅度(梯度)都計算出來,而tensor就沒有這個能力。git
直接print(variable)只會輸出Variable形式的數據,在不少時候是用不了的(畫圖), 因此咱們要將其變成tensor形式。github
print(variable) # Variable 形式 """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data) # tensor 形式 """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data.numpy()) # numpy 形式 """ [[ 1. 2.] [ 3. 4.]] """
import torch import numpy as np import torch import torch.nn.functional as F # 激勵函數都在這 from torch.autograd import Variable # 作一些假數據來觀看圖像 x = torch.linspace(-5, 5, 200) # x data (tensor), shape=(100, 1) x = Variable(x) x_np = x.data.numpy() # 換成 numpy array, 出圖時用 # 幾種經常使用的 激勵函數 y_relu = F.relu(x).data.numpy() y_sigmoid = F.sigmoid(x).data.numpy() y_tanh = F.tanh(x).data.numpy() y_softplus = F.softplus(x).data.numpy() # y_softmax = F.softmax(x) softmax 比較特殊, 不能直接顯示, 不過他是關於機率的, 用於分類 if __name__ == '__main__': import matplotlib.pyplot as plt # python 的可視化模塊, 我有教程 (https://morvanzhou.github.io/tutorials/data-manipulation/plt/) plt.figure(1, figsize=(8, 6)) plt.subplot(221) plt.plot(x_np, y_relu, c='red', label='relu') plt.ylim((-1, 5)) plt.legend(loc='best') plt.subplot(222) plt.plot(x_np, y_sigmoid, c='red', label='sigmoid') plt.ylim((-0.2, 1.2)) plt.legend(loc='best') plt.subplot(223) plt.plot(x_np, y_tanh, c='red', label='tanh') plt.ylim((-1.2, 1.2)) plt.legend(loc='best') plt.subplot(224) plt.plot(x_np, y_softplus, c='red', label='softplus') plt.ylim((-0.2, 6)) plt.legend(loc='best') plt.show()