10分鐘快速入門PyTorch (3)

前面兩節講了最基本的機器學習演算法,線性回歸和logistic回歸,這一節將介紹傳統機器學習裡面最後一個演算法-神經網路,這也是深度學習的基石,所謂的深度學習,也可以理解為很深層的神經網路。說起這裡,有一個小段子,神經網路曾經被打入了冷宮,因為SVM派的崛起,SVM不了解的同學可以去google一下,中文叫支持向量機,因為其有著完備的數學解釋,並且之前神經網路運算複雜等問題,導致神經網路停步不前,這個時候任何以神經網路為題目的論文都發不出去,反向傳播演算法的鼻祖hinton為了解決這個問題,於是就想到了用深度學習為題目。

段子說完,接下來開始我們的簡單神經網路。

Neural Network

其實簡單的神經網路說起來很簡單,先放圖為敬

通過圖片就能很簡答的看出來,其實每一層網路所做的就是 y=W×X+b,只不過W的維數由X和輸出維書決定,比如X是10維向量,想要輸出的維數,也就是中間層的神經元個數為20,那麼W的維數就是20x10,b的維數就是20x1,這樣輸出的y的維數就為20。

中間層的維數可以自己設計,而最後一層輸出的維數就是你的分類數目,比如我們等會兒要做的MNIST數據集是10個數字的分類,那麼最後輸出層的神經元就為10。

Code

有了前面兩節的經驗,這一節的代碼就很簡單了,數據的導入和之前一樣

定義模型

class Neuralnetwork(nn.Module): def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim): super(Neuralnetwork, self).__init__() self.layer1 = nn.Linear(in_dim, n_hidden_1) self.layer2 = nn.Linear(n_hidden_1, n_hidden_2) self.layer3 = nn.Linear(n_hidden_2, out_dim) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) return xmodel = Neuralnetwork(28*28, 300, 100, 10)if torch.cuda.is_available(): model = model.cuda()criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=learning_rate)

上面定義了三層神經網路,輸入是28x28,因為圖片大小是28x28,中間兩個隱藏層大小分別是300和100,最後是個10分類問題,所以輸出層為10.

訓練過程與之前完全一樣,我就不再重複了,可以直接去github參看完整的代碼

這是50次之後的輸出結果,可以和上一節logistic回歸比較一下

可以發現準確率大大提高,其實logistic回歸可以看成簡單的一層網路,從這裡我們就可以看出為什麼多層網路比單層網路的效果要好,這也是為什麼深度學習要叫深度的原因。

下一節我們將正式進入到深度學習,第一個模型將是計算機視覺領域的王牌模型,卷積神經網路。

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

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

歡迎訪問我的博客

推薦閱讀:

TAG:神经网络 | 深度学习DeepLearning | PyTorch |