10分鐘快速入門PyTorch (2)
上一節介紹了簡單的線性回歸,如何在pytorch裡面用最小二乘來擬合一些離散的點,這一節我們將開始簡單的logistic回歸,介紹圖像分類問題,使用的數據是手寫字體數據集MNIST。
nlogistic回歸
n
logistic回歸簡單來說和線性回歸是一樣的,要做的運算同樣是 y = w * x + b,logistic回歸簡單的是做二分類問題,使用sigmoid函數將所有的正數和負數都變成0-1之間的數,這樣就可以用這個數來確定到底屬於哪一類,可以簡單的認為概率大於0.5即為第二類,小於0.5為第一類。
nn
這就是sigmoid的圖形
而我們這裡要做的是多分類問題,對於每一個數據,我們輸出的維數是分類的總數,比如10分類,我們輸出的就是一個10維的向量,然後我們使用另外一個激活函數,softmax
這就是softmax函數作用的機制,其實簡單的理解就是確定這10個數每個數對應的概率有多大,因為這10個數有正有負,所以通過指數函數將他們全部變成正數,然後求和,然後這10個數每個數都除以這個和,這樣就得到了每個類別的概率。
nCode
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,簡單來說就是一種讀取圖片的庫
ntorchvision.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
以上就是我們對圖片數據的讀取操作
nmodel
n
之前講過模型定義的框架,廢話不多說,直接上代碼
nclass 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上跑
ntorh.cuda.is_available()n
n
如果返回True就說明有gpu支持
n接著你只需要一個簡單的命令就可以了
nmodel = model.cuda()n
n
或者
n
model.cuda()n
n
都可以
n然後需要定義loss和optimizer
ncriterion = nn.CrossEntropyLoss()noptimizer = optim.SGD(model.parameters(), lr=learning_rate)n
n
這裡我們使用的loss是交叉熵,是一種處理分類問題的loss,optimizer我們還是使用隨機梯度下降
ntrain
n
接著就可以開始訓練了
nfor 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上,也很簡單
nimg = Variable(img).cuda()nlabel = Variable(label).cuda()n
n
然後可以測試模型,過程與訓練類似,只是注意要將模型改成測試模式
nmodel.eval()n
n
這是跑完100 epoch的結果
具體的結果多久列印一次,如何列印可以自己在for循環裡面去設計
n這一部分我們就講解了如何用logistic回歸去做一個簡單的圖片分類問題,知道了如何在gpu上跑模型,下一節我們將介紹如何寫簡單的卷積神經網路,不了解卷積網路的同學可以先去我的專欄看看之前卷積網路的介紹。
n本文代碼已經上傳到了github上
n歡迎查看我的知乎專欄,深度煉丹
n歡迎訪問我的博客
推薦閱讀:
※機器學習實戰 logistic回歸那章,程序5-1 倒數2-4行代碼,理解困難,求指點?
※Logistic regression是否能在大量有歧義的樣本中很好的學習到其概率分布?
TAG:PyTorch | Logistic回归 | 深度学习DeepLearning |