10分鐘快速入門PyTorch (6)

在上一節中,我們解釋了最基本的RNN,LSTM以及在pytorch裡面如何使用LSTM,而之前我們知道如何通過CNN做MNIST數據集的圖片分類,所以這一節我們將使用LSTM做圖片分類。

n

對於LSTM,我們要處理的數據是一個序列數據,對於圖片而言,我們如何將其轉換成序列數據呢?圖片的大小是28x28,所以我們可以將其看成長度為28的序列,序列中的每個數據的維度是28,這樣我們就可以將其變成一個序列數據了。

n

Code

n

model

n

class Rnn(nn.Module):n def __init__(self, in_dim, hidden_dim, n_layer, n_class):n super(Rnn, self).__init__()n self.n_layer = n_layern self.hidden_dim = hidden_dimn self.lstm = nn.LSTM(in_dim, hidden_dim, n_layer,n batch_first=True)n self.classifier = nn.Linear(hidden_dim, n_class)nn def forward(self, x):n # h0 = Variable(torch.zeros(self.n_layer, x.size(1),n # self.hidden_dim)).cuda()n # c0 = Variable(torch.zeros(self.n_layer, x.size(1),n # self.hidden_dim)).cuda()n out, _ = self.lstm(x)n out = out[:, -1, :]n out = self.classifier(out)n return outnnmodel = Rnn(28, 128, 2, 10) # 圖片大小是28x28nuse_gpu = torch.cuda.is_available() # 判斷是否有GPU加速nif use_gpu:n model = model.cuda()n# 定義loss和optimizerncriterion = nn.CrossEntropyLoss()noptimizer = optim.Adam(model.parameters(), lr=learning_rate)n

n

這裡我們定義了一個LSTM模型,我們需要傳入的參數是輸入數據的維數28,LSTM輸出的維數128,LSTM網路層數2層以及輸出的類數10。

n

在網路定義裡面首先需要定義LSTM,而長度為28的序列傳入LSTM之後輸出的也是長度為28,而輸入的維數是28,輸出的維數由我們定義為128,最後我們只取輸出的最後一個部分傳入分類器求出分類概率。

n

out = out[:, -1, :]通過這種方式,out中的三個維度分別表示batch_size,序列長度和數據維度,所以中間的序列長度取-1,表示取序列中的最後一個數據,這個數據維度為128,再通過分類器,輸出10個結果表示每種結果的概率。

n

另外上面注釋掉的部分就是初始的h_0和c_0,這裡可以自己定義,如果不定義,默認傳入0,也可以根據自己的要求傳入自己定義的h_0和c_0。

n

Train

n

訓練過程的batch_size設置為100,learning_rate設置為0.01,訓練20次,最後得到的結果如下

可以發現對於簡單的圖像分類RNN也能得到一個較好的結果,雖然CNN更多的用在圖像領域而RNN更多的用在自然語言處理中。RNN和CNN互相之間的比較以及各自的優缺點可以去網上查一查。

n

所以下一節我們將介紹一下RNN在自然語言中的應用。

n

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

n

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

n

歡迎訪問我的博客

推薦閱讀:

TAG:PyTorch | 深度学习DeepLearning | 机器学习 |