学习Pytorch的目的就是用LSTM来对舆情的数据进行处理,之后那个项目全部做好会发布出来。LSTM也是很经典的网络了,一种RNN网络,在这里也不做赘述了。
某型的一些说明:
hidden layer dimension is 100 number of hidden layer is 1
这一块的话与上一篇逻辑斯蒂回归使用的是相同的数据集MNIST。
第一部分:构造模型
# Import Libraries
import torch
import torch.nn as nn
from torch.autograd import Variable
class LSTMModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
super(LSTMModel, self).__init__()
# Hidden dimensions
self.hidden_dim = hidden_dim
# Number of hidden layers
self.layer_dim = layer_dim
# LSTM
self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) # batch_first=True (batch_dim, seq_dim, feature_dim)
# Readout layer
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
# Initialize hidden state with zeros
h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()
# Initialize cell state
c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()
# 28 time steps
# We need to detach as we are doing truncated backpropagation through time (BPTT)
# If we don't, we'll backprop all the way to the start even after going through another batch
out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
# Index hidden state of last time step
# out.size() --> 100, 28, 100
# out[:, -1, :] --> 100, 100 --> just want last time step hidden states!
out = self.fc(out[:, -1, :])
# out.size() --> 100, 10
return out
input_dim = 28
hidden_dim = 100
layer_dim = 1
output_dim = 10
model = LSTMModel(input_dim, hidden_dim, layer_dim, output_dim)
error = nn.CrossEntropyLoss()
learning_rate = 0.1
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
第二部分:训练模型
# Number of steps to unroll
seq_dim = 28
loss_list = []
iteration_list = []
accuracy_list = []
count = 0
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# Load images as a torch tensor with gradient accumulation abilities
images = images.view(-1, seq_dim, input_dim).requires_grad_()
# Clear gradients w.r.t. parameters
optimizer.zero_grad()
# Forward pass to get output/logits
# outputs.size 100, 10
outputs = model(images)
# Calculate Loss: softmax --> cross entropy loss
loss = error(outputs, labels)
# Getting gradients
loss.backward()
# Updating parameters
optimizer.step()
count += 1
if count % 500 == 0:
# Calculate Accuracy
correct = 0
total = 0
for images, labels in test_loader:
images = images.view(-1, seq_dim, input_dim)
# Forward pass only to get logits/output
outputs = model(images)
# Get predictions from the maximum value
_, predicted = torch.max(outputs.data, 1)
# Total number of labels
total += labels.size(0)
# Total correct predictions
correct += (predicted == labels).sum()
accuracy = 100 * correct / total
loss_list.append(loss.data.item())
iteration_list.append(count)
accuracy_list.append(accuracy)
# Print Loss
print('Iteration: {}. Loss: {}. Accuracy: {}'.format(count, loss.data.item(), accuracy))
结果:
Iteration: 500. Loss: 2.2601425647735596. Accuracy: 19 Iteration: 1000. Loss: 0.9044000506401062. Accuracy: 71 Iteration: 1500. Loss: 0.33562779426574707. Accuracy: 88 Iteration: 2000. Loss: 0.29831066727638245. Accuracy: 92 Iteration: 2500. Loss: 0.20772598683834076. Accuracy: 94 Iteration: 3000. Loss: 0.13703776895999908. Accuracy: 95 Iteration: 3500. Loss: 0.1824885755777359. Accuracy: 95 Iteration: 4000. Loss: 0.021043945103883743. Accuracy: 96 Iteration: 4500. Loss: 0.13939177989959717. Accuracy: 96 Iteration: 5000. Loss: 0.032742198556661606. Accuracy: 96 Iteration: 5500. Loss: 0.1308797001838684. Accuracy: 96
第三部分:可视化展示
# visualization loss
plt.plot(iteration_list,loss_list)
plt.xlabel("Number of iteration")
plt.ylabel("Loss")
plt.title("LSTM: Loss vs Number of iteration")
plt.show()
# visualization accuracy
plt.plot(iteration_list,accuracy_list,color = "red")
plt.xlabel("Number of iteration")
plt.ylabel("Accuracy")
plt.title("LSTM: Accuracy vs Number of iteration")
plt.savefig('graph.png')
plt.show()
结果:
