import torch
import torchvision
from torchvision import datasets,transforms
from torch.autograd import Variable
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
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",train=False,transform=transform,download=True)
train_load = DataLoader(dataset=dataset_train,batch_size=64,shuffle=True)
test_load = DataLoader(dataset=dataset_test,batch_size=64,shuffle=False)
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]
std = [0.5]
images_example = images_example * std + mean
plt.imshow(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
model = RNN()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.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
running_correct = 0
testing_correct = 0
print("Epoch {}/{}".format(epoch+1,epoch_n))
print("-"*10)
for i,(train,label) in enumerate(train_load):
train = train.to(device)
label = label.to(device)
x_train = train.view(-1,28,28)
x_train,label = Variable(x_train),Variable(label)
y_pred = model(x_train)
loss = loss_f(y_pred,label)
_,pred = torch.max(y_pred.data,1)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss
running_correct += torch.sum(pred==label)
for i,(test,test_label) in enumerate(test_load):
test = test.to(device)
test_label = test_label.to(device)
test = test.view(-1,28,28)
test,test_label = Variable(test),Variable(test_label)
outputs = model(test)
_,pred = torch.max(outputs.data,1)
testing_correct += torch.sum(pred==test_label)
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)))
Implementierung handschriftlicher Ziffernerkennung mithilfe des RNN-Netzwerks
Guess you like
Origin blog.csdn.net/qq_43607118/article/details/129539301
Recommended
Ranking