深度神经网络 —— 使用RNN循环神经网络进行手写数字识别分类
代码:
import torch
import torchvision
from torchvision import datasets, transforms
#from torch.autograd import Variable
import matplotlib.pyplot as plt
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize(mean=[0.5],std=[0.5])])
dataset_train = datasets.MNIST(root = "./data",
transform = transform,
train = True,
download = True)
dataset_test = datasets.MNIST(root = "./data",
transform = transform,
train = False)
train_load = torch.utils.data.DataLoader(dataset = dataset_train,
batch_size = 64,
shuffle = True)
test_load = torch.utils.data.DataLoader(dataset = dataset_test,
batch_size = 64,
shuffle = True)
images, label = next(iter(train_load))
images_example = torchvision.utils.make_grid(images)
images_example = images_example.numpy().transpose(1,2,0)
mean = [0.5,0.5,0.5]
std = [0.5,0.5,0.5]
images_example = images_example*std + mean
# plt.imshow(images_example)
# plt.show()
plt.imsave("images_example.png", images_example)
class RNN(torch.nn.Module):
def __init__(self):
super(RNN, self).__init__()
self.rnn = torch.nn.RNN(input_size = 28,
hidden_size = 128,
num_layers = 1,
batch_first = True)
self.output = torch.nn.Linear(128,10)
def forward(self, input):
output,_ = self.rnn(input, None)
output = self.output(output[:,-1,:])
return output
if torch.cuda.is_available():
device = torch.device("cuda:0")
else:
device = torch.device("cpu")
model = RNN().to(device)
optimizer = torch.optim.Adam(model.parameters())
loss_f = torch.nn.CrossEntropyLoss()
epoch_n =10
for epoch in range(epoch_n):
running_loss = 0.0
running_correct = 0
testing_correct = 0
print("Epoch {}/{}".format(epoch, epoch_n))
print("-"*10)
for data in train_load:
X_train,y_train = data
X_train = X_train.view(-1,28,28)
#X_train,y_train = Variable(X_train),Variable(y_train)
X_train,y_train = X_train.to(device),y_train.to(device)
y_pred = model(X_train)
loss = loss_f(y_pred, y_train)
_,pred = torch.max(y_pred.data,1)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss +=loss.data
running_correct += torch.sum(pred == y_train.data)
for data in test_load:
X_test, y_test = data
X_test = X_test.view(-1,28,28)
#X_test, y_test = Variable(X_test), Variable(y_test)
X_test,y_test = X_test.to(device),y_test.to(device)
outputs = model(X_test)
_, pred = torch.max(outputs.data, 1)
testing_correct += torch.sum(pred == y_test.data)
print("Loss is:{:.4f}, Train Accuracy is:{:.4f}%, Test Accuracy is:{:.4f}".format(running_loss/len(dataset_train),100*running_correct/len(dataset_train),100*testing_correct/len(dataset_test)))

本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-10-26 10:49 Angry_Panda 阅读(3) 评论(0) 收藏 举报
浙公网安备 33010602011771号