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