迴圈神經網路進行分類

2022-08-20 15:33:12 字數 3302 閱讀 8017

"""

rnn網路相對於lstm網路很難收斂

"""import

torch

from torch import

nnfrom torch.autograd import

variable

import

torchvision.datasets as dsets

import

torchvision.transforms as transforms

import

matplotlib.pyplot as plt

#超引數

epoch = 1batch_size = 64time_step = 28 #

的高度input_size = 28 #

的寬度lr = 0.01download_mnist =true

#訓練資料集

train_data =dsets.mnist(

root='

./mnist/',

train=true,

transform=transforms.totensor(),

download=download_mnist,

)print(train_data.train_data.size()) #

(60000, 28, 28)

print(train_data.train_labels.size()) #

(60000)

#列印出第一張

plt.imshow(train_data.train_data[0].numpy(), cmap='

gray')

plt.title('%i

' %train_data.train_labels[0])

plt.show()

#將訓練資料集劃分為多批

train_loader = torch.utils.data.dataloader(dataset=train_data, batch_size=batch_size, shuffle=true)

#測試資料集

test_data = dsets.mnist(root='

./mnist/

', train=false, transform=transforms.totensor())

test_x = variable(test_data.test_data, volatile=true).type(torch.floattensor)[:2000]/255.

test_y = test_data.test_labels.numpy().squeeze()[:2000]

class

rnn(nn.module):

def__init__

(self):

super(rnn, self).

__init__

() self.rnn =nn.lstm(

input_size=input_size, #

每乙個時間步長需要輸入的元素個數

hidden_size=64, #

隱藏層單元數

num_layers=1, #

rnn層數

batch_first=true, #

通常輸入資料的維度為(batch, time_step, input_size)

#batch_first確保batch是第一維

) self.out = nn.linear(64, 10)

defforward(self, x):

#x shape (batch, time_step, input_size)

#r_out shape (batch, time_step, output_size)

#h_n shape (n_layers, batch, hidden_size)

#h_c shape (n_layers, batch, hidden_size)

r_out, (h_n, h_c) = self.rnn(x, none) #

none代表零初始化隱層狀態

#其中r_out代表了每乙個時刻對應的輸出

out = self.out(r_out[:, -1, :]) #

選擇最後乙個步長對應的輸出

return

outrnn =rnn()

print

(rnn)

optimizer = torch.optim.adam(rnn.parameters(), lr=lr) #

優化所有網路引數

loss_func = nn.crossentropyloss() #

計算損失值

#訓練和測試

for epoch in

range(epoch):

for step, (x, y) in

enumerate(train_loader):

b_x = variable(x.view(-1, 28, 28))

b_y =variable(y)

output =rnn(b_x)

loss =loss_func(output, b_y)

optimizer.zero_grad()

loss.backward()

optimizer.step()

if step % 50 ==0:

test_output =rnn(test_x)

pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()

accuracy = sum(pred_y == test_y) /float(test_y.size)

print('

epoch:

', epoch, '

| train loss: %.4f

' % loss.data[0], '

| test accuracy: %.2f

' %accuracy)

#列印測試資料的前10個進行**

test_output = rnn(test_x[:10].view(-1, 28, 28))

pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()

print(pred_y, '

prediction number')

print(test_y[:10], '

real number

')

RNN 迴圈神經網路 分類 pytorch

import torch from torch import nn import torchvision.datasets as dsets import torchvision.transforms as transforms import matplotlib.pyplot as plt imp...

迴圈神經網路

原文 迴圈神經網路也可以畫成下面這個樣子 對於語言模型來說,很多時候光看前面的詞是不夠的,比如下面這句話 我的手機壞了,我打算 一部新手機。可以想象,如果我們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?還是大哭一場?這些都是無法確定的。但如果我們也看到了橫線後面的詞是 一部新手機 那...

迴圈神經網路

原文 迴圈神經網路也可以畫成下面這個樣子 對於語言模型來說,很多時候光看前面的詞是不夠的,比如下面這句話 我的手機壞了,我打算 一部新手機。可以想象,如果我們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?還是大哭一場?這些都是無法確定的。但如果我們也看到了橫線後面的詞是 一部新手機 那...