10分鐘快速入門PyTorch (2)

上一節介紹了簡單的線性回歸,如何在pytorch裡面用最小二乘來擬合一些離散的點,這一節我們將開始簡單的logistic回歸,介紹圖像分類問題,使用的數據是手寫字體數據集MNIST。

n

logistic回歸

n

logistic回歸簡單來說和線性回歸是一樣的,要做的運算同樣是 y = w * x + b,logistic回歸簡單的是做二分類問題,使用sigmoid函數將所有的正數和負數都變成0-1之間的數,這樣就可以用這個數來確定到底屬於哪一類,可以簡單的認為概率大於0.5即為第二類,小於0.5為第一類。

y = frac{1}{1+e^{-x}}

nn

這就是sigmoid的圖形

而我們這裡要做的是多分類問題,對於每一個數據,我們輸出的維數是分類的總數,比如10分類,我們輸出的就是一個10維的向量,然後我們使用另外一個激活函數,softmax

這就是softmax函數作用的機制,其實簡單的理解就是確定這10個數每個數對應的概率有多大,因為這10個數有正有負,所以通過指數函數將他們全部變成正數,然後求和,然後這10個數每個數都除以這個和,這樣就得到了每個類別的概率。

n

Code

n

data

n

首先導入torch裡面專門做圖形處理的一個庫,torchvision,根據官方安裝指南,你在安裝pytorch的時候torchvision也會安裝。

n

我們需要使用的是torchvision.transforms和torchvision.datasets以及torch.utils.data.DataLoader

n

首先DataLoader是導入圖片的操作,裡面有一些參數,比如batch_size和shuffle等,默認load進去的圖片類型是PIL.Image.open的類型,如果你不知道PIL,簡單來說就是一種讀取圖片的庫

n

torchvision.transforms裡面的操作是對導入的圖片做處理,比如可以隨機取(50, 50)這樣的窗框大小,或者隨機翻轉,或者去中間的(50, 50)的窗框大小部分等等,但是裡面必須要用的是transforms.ToTensor(),這可以將PIL的圖片類型轉換成tensor,這樣pytorch才可以對其做處理

n

torchvision.datasets裡面有很多數據類型,裡面有官網處理好的數據,比如我們要使用的MNIST數據集,可以通過torchvision.datasets.MNIST()來得到,還有一個常使用的是torchvision.datasets.ImageFolder(),這個可以讓我們按文件夾來取圖片,和keras裡面的flow_from_directory()類似,具體的可以去看看官方文檔的介紹。

n

# 定義超參數nbatch_size = 32nlearning_rate = 1e-3nnum_epoches = 100nn# 下載訓練集 MNIST 手寫數字訓練集ntrain_dataset = datasets.MNIST(root=./data, train=True,n transform=transforms.ToTensor(),n download=True)nntest_dataset = datasets.MNIST(root=./data, train=False,n transform=transforms.ToTensor())nntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)n

n

以上就是我們對圖片數據的讀取操作

n

model

n

之前講過模型定義的框架,廢話不多說,直接上代碼

n

class Logstic_Regression(nn.Module):n def __init__(self, in_dim, n_class):n super(Logstic_Regression, self).__init__()n self.logstic = nn.Linear(in_dim, n_class)nn def forward(self, x):n out = self.logstic(x)n return outnnmodel = Logstic_Regression(28*28, 10) # 圖片大小是28x28n

n

我們需要向這個模型傳入參數,第一個參數定義為數據的維度,第二維數是我們分類的數目。

n

接著我們可以在gpu上跑模型,怎麼做呢?

首先可以判斷一下你是否能在gpu上跑

n

torh.cuda.is_available()n

n

如果返回True就說明有gpu支持

n

接著你只需要一個簡單的命令就可以了

n

model = model.cuda()n

n

或者

n

model.cuda()n

n

都可以

n

然後需要定義loss和optimizer

n

criterion = nn.CrossEntropyLoss()noptimizer = optim.SGD(model.parameters(), lr=learning_rate)n

n

這裡我們使用的loss是交叉熵,是一種處理分類問題的loss,optimizer我們還是使用隨機梯度下降

n

train

n

接著就可以開始訓練了

n

for epoch in range(num_epoches):n print(epoch {}.format(epoch+1))n print(**10)n running_loss = 0.0n running_acc = 0.0n for i, data in enumerate(train_loader, 1):n img, label = datan img = img.view(img.size(0), -1) # 將圖片展開成 28x28n if use_gpu:n img = Variable(img).cuda()n label = Variable(label).cuda()n else:n img = Variable(img)n label = Variable(label)n # 向前傳播n out = model(img)n loss = criterion(out, label)n running_loss += loss.data[0] * label.size(0)n _, pred = torch.max(out, 1)n num_correct = (pred == label).sum()n running_acc += num_correct.data[0]n # 向後傳播n optimizer.zero_grad()n loss.backward()n optimizer.step()n

n

注意我們如果將模型放到了gpu上,相應的我們的Variable也要放到gpu上,也很簡單

n

img = Variable(img).cuda()nlabel = Variable(label).cuda()n

n

然後可以測試模型,過程與訓練類似,只是注意要將模型改成測試模式

n

model.eval()n

n

這是跑完100 epoch的結果

具體的結果多久列印一次,如何列印可以自己在for循環裡面去設計

n

這一部分我們就講解了如何用logistic回歸去做一個簡單的圖片分類問題,知道了如何在gpu上跑模型,下一節我們將介紹如何寫簡單的卷積神經網路,不了解卷積網路的同學可以先去我的專欄看看之前卷積網路的介紹。

n

本文代碼已經上傳到了github上

n

歡迎查看我的知乎專欄,深度煉丹

n

歡迎訪問我的博客


推薦閱讀:

機器學習實戰 logistic回歸那章,程序5-1 倒數2-4行代碼,理解困難,求指點?
Logistic regression是否能在大量有歧義的樣本中很好的學習到其概率分布?

TAG:PyTorch | Logistic回归 | 深度学习DeepLearning |