Pytorch学习-Task1
生活随笔
收集整理的這篇文章主要介紹了
Pytorch学习-Task1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PyTorch學習-Task1:PyTorch張量計算與Numpy的轉換
- 張量 Tensor
- 1.張量的定義
- 2.張量的運算
- 3.Tensor與Numpy類型的轉換
- 4.自動求導
- pytorch 與神經網絡
- 實戰:訓練一個圖片分類器
- 深度學習中的優化方法 - momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
張量 Tensor
1.張量的定義
PyTorch支持的數據類型:整型和浮點型;以及對應的張量子類型
| (1) 整型 | ||
| 8位 | int8 | ByteTensor |
| 8位 | uint8 | CharTensor |
| 16位 | short | ShortTensor |
| 32位 | int | IntTensor |
| 64位 | long | LongTensor |
| (2) 浮點型 | ||
| 16位 | half / float16 | HalfTensor |
| 32位 | float / float32 | FloatTensor |
| 64位 | double / float64 | DoubleTensor |
2.張量的運算
#兩個形狀相同的張量進行相加 # 方式一 result = torch.tensor(5,3) result = x + y # 方式二 torch.add(x,y,out=result) # y與x相加 y.add_(x)# 此外,pytorch還提供了一些數學函數 # 計算余弦值 a20 = torch.tensor(0.5) a21 = torch.cos(a20)3.Tensor與Numpy類型的轉換
# tensor與numpy之間的轉換 a = torch.ones(5) b = a.numpy()# 當修改numpy時,與之相關聯的tensor也會相應改變 a.add_(1) print(a) print(b)# 將numpy的Array轉換成tensor import numpy as np a = np.ones(5) b = torch.from_numpy(a) np.add(a,1,out=a) print(a) print(b)# 除了CharTensor之外,其他的tensor都可以在GPU和CPU之間隨意轉換 if torch.cuda.is_available():x = x.cuda()y = y.cuda()x + y4.自動求導
from torch.autograd import Variable x = Variable(torch.ones(2,2),requires_grad=True) print(x) y = x+2 print(y) z = y * y * 3 print(z) out = z.mean() out.backward() # 此處輸出 d(out)/dx ''' 計算公式 o = 1/4求和zi zi = 3(xi+2)^2 zi(xi=1) = 3 * 3^2 = 27 因此,o對于xi求導等于3/2(xi+2) o對xi求導,當xi=1時 9/2 = 4.5 ''' x.grad x = torch.randn(3) x = Variable(x,requires_grad=True) y = x*2 # y.data.norm() 其實就是對y張量L2范數,先對y中每一項取平方,之后累加,最后取根號 print(torch.sqrt(torch.sum(torch.pow(y,2)))) i = 0 while y.data.norm() < 1000:y = y*2i += 1 print("i= ",i) print("y= ",y) gradients = torch.FloatTensor([0.1,1.0,0.0001]) print("gradients= ",gradients) y.backward(gradients) x.gradpytorch 與神經網絡
一個典型的神經網絡的訓練過程
定義一個有學習參數的神經網絡
對一個輸入的數據集進行迭代:
對輸入進行處理
計算代價值
將梯度傳播回神經網絡的參數
更新網絡中的權重:weight = weight + learning_rate * gradient
實戰:訓練一個圖片分類器
''' 目標:訓練一個圖片分類器 步驟: 1)使用torchvision讀取并預處理CIFAR10數據集 2)定義一個卷積神經網絡 3)定義一個代價函數 4)在神經網絡中訓練 訓練數據集 5)使用測試集數據測試神經網絡 '''step1 : 導入數據 如果下載一直出現問題,那么就先下載下來,放在data文件夾中,就不需要再下載了
import torch import torchvision import torchvision.transforms as transforms import datasets# torchvision數據集的輸出是在[0,1]范圍內的PILImage圖片 # 使用歸一化方法將其轉換為tensor,數據范圍[-1,1]transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]) trainset = torchvision.datasets.CIFAR10('./data',train=True,download=True,transform=transform) trainloader = torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True,num_workers=2)testset = torchvision.datasets.CIFAR10('./data',train=False,download=True,transform=transform) testloader = torch.utils.data.DataLoader(testset,batch_size = 4,shuffle=False,num_workers=2)classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')step2 : 隨便找幾張圖片show一下
# 從中隨便找幾張圖片 function is show image import matplotlib.pyplot as plt import numpy as np%matplotlib inline def imshow(img):img = img/2 + 0.5npimg = img.numpy()plt.imshow(np.transpose(npimg,(1,2,0)))dataiter = iter(trainloader) images,labels = dataiter.next()imshow(torchvision.utils.make_grid(images))print(" ".join('%5s'%classes[labels[j]] for j in range(4)))
step3 : 定義一個卷積神經網絡
必須重寫forward函數,不需要寫backward函數,會自動生成
通過forward函數將各個層連接起來。
step4 : 定義代價函數和優化器
step5 : 訓練網絡
# 訓練網絡 import torch.nn.functional as F from torch.autograd import Variable ''' 訓練兩次running_loss 記錄每次的loss對于訓練集trainloader中的每一個數據data1)獲取輸入inputs,labels 并將其變為變量Variable2)將網絡中參數梯度清零 optimizer.zero_grad()3)獲取輸出outputs = net(inputs)4)計算損失loss 傳入預測y值outputs 和真實標簽labels5)loss.backwrad() loss反向傳播6) optimizer.step()更新所有參數的梯度 ''' for epoch in range(2):running_loss = 0.0for i,data in enumerate(trainloader,0):# get inputsinputs, labels = datainputs,labels = Variable(inputs),Variable(labels)# zero the parameter gradientsoptimizer.zero_grad()# forward + backward + optimizeoutputs = net(inputs)loss = criterion(outputs,labels)loss.backward()optimizer.step() # print statisticsrunning_loss += loss.item()if i %2000 == 1999:print('[%d,%5d] loss: %.3f'%(epoch+1,i+1, running_loss / 2000))running_loss = 0.0 print('Finished Training')# 看一下在整個網絡上的表現 class_correct = list(0. for i in range(10)) class_total = list(0. for i in range(10)) for data in testloader:images, labels = dataoutputs = net(Variable(images))_, predicted = torch.max(outputs.data, 1)c = (predicted == labels).squeeze()for i in range(4): 、label = labels[i]class_correct[label] += c[i]class_total[label] += 1for i in range(10):print('Accuracy of %5s : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))深度學習中的優化方法 - momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
總結
以上是生活随笔為你收集整理的Pytorch学习-Task1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: traci学习
- 下一篇: Pytorch学习- 小型知识点汇总 u