import torch from torch.autograd import Variable import matplotlib.pyplot as plt from sklearn import datasets from torch import nn from sklearn.model_selection import train_test_split digits = datasets.load_digits() X = digits.images y = digits.target X_train = X[:1700, :, :] Y_train = y[:1700] X_test = X[1700:, :, :] y_test = y[1700:] X_train = torch.Tensor(X_train).unsqueeze(0).unsqueeze(0).view(-1, 1, 8, 8) Y_train = torch.Tensor(Y_train).long() X_test = torch.Tensor(X_test).unsqueeze(0).unsqueeze(0).view(-1, 1, 8, 8) y_test = torch.Tensor(y_test).long() class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(1, 25, kernel_size=(2, 2)), nn.BatchNorm2d(25), nn.ReLU(inplace=True) ) self.layer2 = nn.Sequential( nn.MaxPool2d(kernel_size=(1, 1), stride=2) ) self.layer3 = nn.Sequential( nn.Conv2d(25, 50, kernel_size=(1, 1)), nn.BatchNorm2d(50), nn.ReLU(inplace=True) ) self.layer4 = nn.Sequential( nn.MaxPool2d(kernel_size=2, stride=2) ) self.fc = nn.Sequential( nn.Linear(200, 1024), nn.ReLU(inplace=True), nn.Linear(1024, 128), nn.ReLU(inplace=True), nn.Linear(128, 10) ) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = x.view(x.size(0), -1) x = self.fc(x) return x model = CNN() print(model) loss_func = torch.nn.CrossEntropyLoss() opt = torch.optim.Adam(model.parameters(), lr=0.001) loss_count = [] for epoch in range(1): for i in range(500): batch_x = Variable(X_train) # torch.Size([128, 1, 28, 28]) batch_y = Variable(Y_train).view(-1) # torch.Size([128]) out = model(batch_x) # torch.Size([128,10]) # 获取损失 loss = loss_func(out, batch_y) # 使用优化器优化损失 opt.zero_grad() # 清空上一步残余更新参数值 loss.backward() # 误差反向传播,计算参数更新值 opt.step() # 将参数更新值施加到net的parmeters上 loss_count.append(loss) print('{}:\t'.format(i), loss.item()) torch.save(model, r'C:\Users\Administrator\PycharmProjects\data\cnn') plt.figure('PyTorch_CNN_Loss') plt.plot(loss_count, label='Loss') plt.legend() plt.show() model = torch.load(r'C:\Users\Administrator\PycharmProjects\data\cnn') accuracy_sum = [] test_x = Variable(X_test) test_y = Variable(y_test) out = model(test_x) accuracy = torch.max(out, 1)[1].numpy() == test_y.numpy() accuracy_sum.append(accuracy.mean()) print('accuracy:\t', accuracy.mean()) print('总准确率:\t', sum(accuracy_sum)/len(accuracy_sum)) # 精确率图 print('总准确率:\t', sum(accuracy_sum)/len(accuracy_sum)) plt.figure('Accuracy') plt.plot(accuracy_sum, 'o', label='accuracy') plt.title('Pytorch_CNN_Accuracy') plt.legend() plt.show()
基于pytorch的CNN识别sklearn自带手写体数据,准确率贼高
最新推荐文章于 2023-04-26 09:27:14 发布