实验3 手写字体识别【机器学习】
生活随笔
收集整理的這篇文章主要介紹了
实验3 手写字体识别【机器学习】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
推薦
python實現手寫數字識別(小白入門)
原文MNIST Handwritten Digit Recognition in PyTorch
翻譯用PyTorch實現MNIST手寫數字識別(非常詳細)
mnist.gz/mnist.csv數據集下載
mnist 數據集 下載 訓練 測試 pytorch
pytorch及torchvision下載不超過可看
清華鏡像源下載pytorch及torchvision
配置環境miniconda+pycharm【機器學習】
的第四步 創建 虛擬環境
anaconda常用指令,更新查看添加下載源等
和第五步使用虛擬環境 7擴展 在虛擬環境中安裝必要的包
注意
sklearn.externals.joblib導入問題
from sklearn.externals import joblib改為import joblib
代碼 python實現手寫數字識別(小白入門)
項目結構
1.py
需要下載joblib包
import numpy as np from sklearn.linear_model import LogisticRegression import os import joblib#數據預處理 trainData = np.loadtxt(open('digits_training.csv', 'r'), delimiter=",",skiprows=1)#裝載數據 MTrain, NTrain = np.shape(trainData) #行列數 print("訓練集:",MTrain,NTrain) xTrain = trainData[:,1:NTrain] xTrain_col_avg = np.mean(xTrain, axis=0) #對各列求均值 xTrain =(xTrain- xTrain_col_avg)/255 #歸一化 yTrain = trainData[:,0]'''=================================''' #訓練模型 model = LogisticRegression(solver='lbfgs', multi_class='multinomial', max_iter=500) model.fit(xTrain, yTrain) print("訓練完畢")'''=================================''' #測試模型 testData = np.loadtxt(open('digits_testing.csv', 'r'), delimiter=",",skiprows=1) MTest,NTest = np.shape(testData) print("測試集:",MTest,NTest) xTest = testData[:,1:NTest] xTest = (xTest-xTrain_col_avg) /255 # 使用訓練數據的列均值進行處理 yTest = testData[:,0] yPredict = model.predict(xTest) errors = np.count_nonzero(yTest - yPredict) #返回非零項個數 print("預測完畢。錯誤:", errors, "條") print("測試數據正確率:", (MTest - errors) / MTest)'''=================================''' #保存模型# 創建文件目錄 dirs = 'testModel' if not os.path.exists(dirs):os.makedirs(dirs) joblib.dump(model, dirs+'/model.pkl') print("模型已保存")結果1
2.py
需要下載cv2包
在test下放置幾張數字圖片
結果2
代碼 用PyTorch實現MNIST手寫數字識別(非常詳細)
pytorch.c
import torch import torchvision from torch.utils.data import DataLoader import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import matplotlib.pyplot as pltn_epochs = 3 batch_size_train = 64 batch_size_test = 1000 learning_rate = 0.01 momentum = 0.5 log_interval = 10 random_seed = 1 torch.manual_seed(random_seed)train_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('./data/', train=True, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size_train, shuffle=True) test_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('./data/', train=False, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size_test, shuffle=True)examples = enumerate(test_loader) batch_idx, (example_data, example_targets) = next(examples) # print(example_targets) # print(example_data.shape)fig = plt.figure() for i in range(6):plt.subplot(2, 3, i + 1)plt.tight_layout()plt.imshow(example_data[i][0], cmap='gray', interpolation='none')plt.title("Ground Truth: {}".format(example_targets[i]))plt.xticks([])plt.yticks([]) plt.show()class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=5)self.conv2 = nn.Conv2d(10, 20, kernel_size=5)self.conv2_drop = nn.Dropout2d()self.fc1 = nn.Linear(320, 50)self.fc2 = nn.Linear(50, 10)def forward(self, x):x = F.relu(F.max_pool2d(self.conv1(x), 2))x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))x = x.view(-1, 320)x = F.relu(self.fc1(x))x = F.dropout(x, training=self.training)x = self.fc2(x)return F.log_softmax(x, dim=1)network = Net() optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum)train_losses = [] train_counter = [] test_losses = [] test_counter = [i * len(train_loader.dataset) for i in range(n_epochs + 1)]def train(epoch):network.train()for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = network(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()if batch_idx % log_interval == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data),len(train_loader.dataset),100. * batch_idx / len(train_loader),loss.item()))train_losses.append(loss.item())train_counter.append((batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset)))torch.save(network.state_dict(), './model.pth')torch.save(optimizer.state_dict(), './optimizer.pth')def test():network.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:output = network(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.data.max(1, keepdim=True)[1]correct += pred.eq(target.data.view_as(pred)).sum()test_loss /= len(test_loader.dataset)test_losses.append(test_loss)print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))train(1)test() # 不加這個,后面畫圖就會報錯:x and y must be the same size for epoch in range(1, n_epochs + 1):train(epoch)test()fig = plt.figure() plt.plot(train_counter, train_losses, color='blue') plt.scatter(test_counter, test_losses, color='red') plt.legend(['Train Loss', 'Test Loss'], loc='upper right') plt.xlabel('number of training examples seen') plt.ylabel('negative log likelihood loss')examples = enumerate(test_loader) batch_idx, (example_data, example_targets) = next(examples) with torch.no_grad():output = network(example_data) fig = plt.figure() for i in range(6):plt.subplot(2, 3, i + 1)plt.tight_layout()plt.imshow(example_data[i][0], cmap='gray', interpolation='none')plt.title("Prediction: {}".format(output.data.max(1, keepdim=True)[1][i].item()))plt.xticks([])plt.yticks([]) plt.show()# ----------------------------------------------------------- #continued_network = Net() continued_optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum)network_state_dict = torch.load('model.pth') continued_network.load_state_dict(network_state_dict) optimizer_state_dict = torch.load('optimizer.pth') continued_optimizer.load_state_dict(optimizer_state_dict)# 注意不要注釋前面的“for epoch in range(1, n_epochs + 1):”部分, # 不然報錯:x and y must be the same size # 為什么是“4”開始呢,因為n_epochs=3,上面用了[1, n_epochs + 1) for i in range(4, 9):test_counter.append(i * len(train_loader.dataset))train(i)test()fig = plt.figure() plt.plot(train_counter, train_losses, color='blue') plt.scatter(test_counter, test_losses, color='red') plt.legend(['Train Loss', 'Test Loss'], loc='upper right') plt.xlabel('number of training examples seen') plt.ylabel('negative log likelihood loss') plt.show()運行結果
運行之后項目結構
代碼 自己
import torch import torchvision from torch.utils.data import DataLoader import torch.nn as nn import torch.nn.functional as F import torch.optim as optim # import matplotlib.pyplot as pltnum_epochs = 6 batch_size = 100 learning_rate = 0.1 momentum = 0.5 log_interval = 10 random_seed = 1 torch.manual_seed(random_seed) input_size=28*28 num_classes=10train_dataset= torchvision.datasets.MNIST('./data/', train=True, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))])) test_dataset=torchvision.datasets.MNIST('./data/', train=False, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))]))train_loader = torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset,batch_size=batch_size, shuffle=False)class NeuralNet(nn.Module):def __init__(self,input_size,hidden_size,num_classes):super(NeuralNet, self).__init__()self.fc1=nn.Linear(input_size,hidden_size[0])self.fc2=nn.Linear(hidden_size[0],hidden_size[1])self.fc3=nn.Linear(hidden_size[1],num_classes)self.relu = nn.ReLU()def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.relu(out)out = self.fc3(out)return outmodel = NeuralNet(input_size, [256, 64], num_classes)criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate)for epoch in range(num_epochs):for i,(images,labels) in enumerate(train_loader):images=images.reshape(-1,28*28)outputs=model(images)labels_onehot = F.one_hot(labels)loss=criterion(outputs,labels_onehot.float())optimizer.zero_grad()loss.backward()optimizer.step()if i % 600 == 0:print("Epoch :{} \t Loss:{:.6f}".format(epoch, loss.item()))torch.save(model,'model_total.ckpt') # torch.save(net.state_dict(),'model_para.ckpt')#-------------------------------------------------------------------model=torch.load('model_total.ckpt') ''' net=NeuralNet(input_size,[500,100],num_classes) net.load_state_dict(torch.load('model_para.ckpt')) '''def acc(labels,outputs):_,predicted=torch.max(outputs.data,1)num=len(labels)right=(predicted==labels).sum().item()return num,rightwith torch.no_grad():correct,total=0,0for images,labels in test_loader:images=images.reshape(-1,28*28)outputs=model(images)num,right=acc(labels,outputs)correct=correct+righttotal=total+numprint('Accuracy of the network on the 10000 test images:{}%'.format(100*correct/total))結果
Epoch :0 Loss:2.294961 Epoch :1 Loss:0.086749 Epoch :2 Loss:0.101823 Epoch :3 Loss:0.045709 Epoch :4 Loss:0.053201 Epoch :5 Loss:0.032638 Accuracy of the network on the 10000 test images:98.0%總結
以上是生活随笔為你收集整理的实验3 手写字体识别【机器学习】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南邮 OJ 1446 嘉娃的难题
- 下一篇: 创建显IP图片