Pytorch基础入门
Pytorch介紹
Torch是一個開源的機器學習的框架,早在2002年就發布了Torch的初版, Torch的編程語言為C和Lua。如今的Torch7依舊是熱門的深度學習框架之一。
PyTorch是在2017年1月由Facebook推出的。它是經典機器學習庫Torch框架的一個端口,主要編程語言為python.
Torch: 2002年發布,早期的機器學習框架。
Theano: 2008年開發,第一個影響力較大的python深度學習框架。
CNTK:2016年1月由微軟公司開源,在語音領域效果比較突出。
TensorFlow:2015年11月Google開源,目前最熱門深度學習框架之一。
Keras: 以Theano/Tensorflow/CNTK作為底層,最容易使用的深度學習框架。
Caffe/Caffe2:2013年開源的C++深度學習框架,曾經計算機視覺領域的王者。
MXNet: 2015年發布,AWS云計算的官方深度學習平臺。
Paddle: 2016年8月開源的百度深度學習框架。
PyTorch: 2017年開源,Torch的python版本,目前最有潛力,最熱門的深度學 習框架之一。
Pytorch安裝
https://pytorch.org/打開Pytorch官網進行下載,
根據自己電腦選擇相應的選項,最后把下方的指令輸入CMD中執行即可。
MNIST數據集介紹
數據集被分成兩部分: 60000行的訓練數據集( mnist.train)和10000行的測試數據集( mnist.test)
一張圖片包含28* 28個像素,我們把這一個數組展開成一個向量,長度是28* 28=784。如果把數據用矩陣表示,可以把MNIST訓練數據變成一個形狀為 [60000, 784] 的矩陣,第一個維度數字用來索引圖片,第二個維度數字用來索引每張圖片中的像素點。圖片里的某個像素的強度值介于0-1之間。
One-hot編碼
MNIST數據集的標簽是介于0-9的數字,我們要把標簽轉化為“one-hotvectors” 。一個one-hot向量除了某一位數字是1以外,其余維度數字都是0,比如標簽0將表示為([1,0,0,0,0,0,0,0,0,0]),標簽3將表示為
([0,0,0,1,0,0,0,0,0,0])
Softmax函數介紹
在多分類問題中,我們通常會使用softmax函數作為網絡輸出層的激活函數,softmax函數可以對輸出值進行歸一化操作,把所有輸出值都轉化為概率,所有概率值加起來等于1, softmax的公式為:
損失函數
均方誤差(二次代價函數)
激活函數的梯度f’(z)越大, w的大小調整得越快,訓練收斂得就越快。激活函數的梯度f’(z)越小, w的大小調整得越慢,訓練收斂得就越慢。
按理來說,如果損失函數越大,應該進行的求導越快,而二次代價函數做不到,引出交叉熵函數。
交叉熵
過擬合
防止過擬合
增大數據集
增大數據集方法:
Early stopping
在訓練模型的時候,我們往往會設置一個比較大的迭代次數。 Earlystopping便是一種提前結束訓練的策略用來防止過擬合。
一般的做法是記錄到目前為止最好的validation accuracy,當連續10個Epoch沒有達到最佳accuracy時,則可以認為accuracy不再提高了。此時便可以停止迭代了( Early Stopping)。
Dropout
在訓練數據集的時候,隨機的屏蔽掉一些神經元,以提高數據的魯棒性
正則化項
優化器
Adadelta
Adagrad
Adam 一般使用Adam
Adamax
AdamW
ASGD
LBFGS
RMSprop
Rprop
SGD
SparseAdam
卷積神經網絡CNN
卷積神經網絡是近年發展起來,并廣泛應用于圖像處理, NLP等領域的一種多層神經網絡。
局部感受野
權值共享
卷積計算
池化
Padding
SAME PADDING:
給平面外部補0
卷積窗口采樣后得到一個跟原來大小相同的平面
VALID PADDING:
不會超出平面外部
卷積窗口采樣后得到一個比原來平面小的平面
貓狗分類案例
訓練模型
import torch import torch.nn as nn import torch.optim as optim from torch.autograd import Variable from torchvision import datasets, transforms, models from torch.utils.data import DataLoader from torchvision.models import VGG16_Weights# 數據預處理 transform = transforms.Compose([transforms.RandomResizedCrop(224), # 對圖形進行切割后,在形成固定大小transforms.RandomRotation(20), # 隨機角度進行旋轉transforms.RandomHorizontalFlip(p=0.5), # 隨機水平移動transforms.ToTensor() # 轉成pytorch使用的tensor數據集形式 ])# 讀取數據 root = 'image' train_dataset = datasets.ImageFolder(root + '/train', transform) test_dataset = datasets.ImageFolder(root + '/test', transform)# 導入數據 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, shuffle=True)# classes = train_dataset.classes classes_index = train_dataset.class_to_idxbatch_size = 64 LR = 0.0001 model = models.vgg16(weights=VGG16_Weights.DEFAULT) # model = model.cuda()# 只訓練全連接層 for param in model.parameters():param.requires_grad = False # 構建新的全連接層 model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(100, 2)) # 定義損失函數 mse_loss = nn.CrossEntropyLoss() # 定義優化器 optimizer = optim.SGD(model.parameters(), LR, momentum=0.9)def train():model.train()for i, data in enumerate(train_loader):# 獲得一個批次的數據和標簽inputs, labels = data# inputs = Variable(inputs.cuda())# labels = Variable(labels.cuda())# 獲得模型預測結果(64,10)out = model(inputs)# to onehot,把數據標簽變成獨熱編碼# (64)-(64,1)loss = mse_loss(out, labels)# 梯度清0optimizer.zero_grad()# 計算梯度loss.backward()# 修改權值optimizer.step()def test():model.eval()correct = 0for i, data in enumerate(test_loader):# 獲得一個批次的數據和標簽inputs, labels = data# inputs = Variable(inputs.cuda())# labels = Variable(labels.cuda())# 獲得模型預測結果(64,10)out = model(inputs)# 獲得最大值,以及最大值所在的位置_, predicted = torch.max(out, 1)# 預測正確的數量correct += (predicted == labels).sum()print("Test acc:{0}".format(correct.item() / len(test_dataset)))correct = 0for i, data in enumerate(train_loader):# 獲得一個批次的數據和標簽inputs, labels = data# inputs = Variable(inputs.cuda())# labels = Variable(labels.cuda())# 獲得模型預測結果(64,10)out = model(inputs)# 獲得最大值,以及最大值所在的位置_, predicted = torch.max(out, 1)# 預測正確的數量correct += (predicted == labels).sum()print("Train acc:{0}".format(correct.item() / len(train_dataset)))for epoch in range(2):print('epoch:', epoch)train()test() torch.save(model.state_dict(), 'cat_dog_cnn.pth')測試模型
import numpy as np import torch import torch.nn as nn import torch.optim as optim from PIL import Image from torch.autograd import Variable from torchvision import datasets, transforms, models from torch.utils.data import DataLoader from torchvision.models import VGG16_Weightsmodel = models.vgg16(weights=VGG16_Weights.DEFAULT) # 構建新的全連接層 model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(100, 2))model.load_state_dict(torch.load('cat_dog_cnn.pth'))model.eval()label = np.array(['cat', 'dog'])# 數據預處理 transform = transforms.Compose([transforms.Resize(224),transforms.ToTensor() ])def predict(image_path):# 打開圖片img = Image.open(image_path)# 數據處理,再增加一個維度img = transform(img).unsqueeze(0)# img = img.convert("RGB")# 預測得到結果outputs = model(img)# 獲得最大值所在位置_, predicted = torch.max(outputs, 1)# 轉化為類別名稱print(label[predicted.item()])predict('image/test/cat/cat.1120.jpg')轉載自bilibili覃秉豐
總結
以上是生活随笔為你收集整理的Pytorch基础入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东华大学 oj87——弟弟的作业
- 下一篇: Lin总线概述及入门