【2021-2022 春学期】人工智能-作业6:CNN实现XO识别
生活随笔
收集整理的這篇文章主要介紹了
【2021-2022 春学期】人工智能-作业6:CNN实现XO识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、數據集
- 二、構建模型
- 三、訓練模型
- 四、測試訓練好的模型
- 五、計算模型準確率
- 六、查看訓練好模型的特征圖
- 七、查看卷積核
- 八、源碼
- 1.訓練模型源碼
- 2.測試模型源碼
一、數據集
二、構建模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3)self.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3)self.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200)self.fc2 = nn.Linear(1200, 64)self.fc3 = nn.Linear(64, 2)def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return x三、訓練模型
model = Net()criterion = torch.nn.CrossEntropyLoss() # 損失函數 交叉熵損失函數 optimizer = optim.SGD(model.parameters(), lr=0.1) # 優化函數:隨機梯度下降epochs = 10 for epoch in range(epochs):running_loss = 0.0for i, data in enumerate(data_loader):images, label = dataout = model(images)loss = criterion(out, label)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()if (i + 1) % 10 == 0:print('[%d %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))running_loss = 0.0print('finished train')# 保存模型 torch.save(model, 'model_name.pth')四、測試訓練好的模型
model_load = torch.load('model_name.pth') # 讀取一張圖片 images[0],測試 print("labels[0] truth:\t", labels[0]) x = images[0] x = x.reshape([1, x.shape[0], x.shape[1], x.shape[2]]) predicted = torch.max(model_load(x), 1) print("labels[0] predict:\t", predicted.indices)img = images[0].data.squeeze().numpy() # 將輸出轉換為圖片的格式 plt.imshow(img, cmap='gray') plt.show()五、計算模型準確率
model_load = torch.load('model_name.pth')correct = 0 total = 0 with torch.no_grad(): # 進行評測的時候網絡不更新梯度for data in data_loader_test: # 讀取測試集images, labels = dataoutputs = model_load(images)_, predicted = torch.max(outputs.data, 1) # 取出 最大值的索引 作為 分類結果total += labels.size(0) # labels 的長度correct += (predicted == labels).sum().item() # 預測正確的數目 print('Accuracy of the network on the test images: %f %%' % (100. * correct / total))六、查看訓練好模型的特征圖
import torch import matplotlib.pyplot as plt import numpy as np from PIL import Image from torchvision import transforms, datasets import torch.nn as nn from torch.utils.data import DataLoader# 定義圖像預處理過程(要與網絡模型訓練過程中的預處理過程一致)transforms = transforms.Compose([transforms.ToTensor(), # 把圖片進行歸一化,并把數據轉換成Tensor類型transforms.Grayscale(1) # 把圖片 轉為灰度圖 ]) path = r'train_data' data_train = datasets.ImageFolder(path, transform=transforms) data_loader = DataLoader(data_train, batch_size=64, shuffle=True) for i, data in enumerate(data_loader):images, labels = dataprint(images.shape)print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):outputs = []x = self.conv1(x)outputs.append(x)x = self.relu(x)outputs.append(x)x = self.maxpool(x)outputs.append(x)x = self.conv2(x)x = self.relu(x)x = self.maxpool(x)x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return outputs# create model model1 = Net()# load model weights加載預訓練權重 # model_weight_path ="./AlexNet.pth" # model_weight_path = "model_name.pth" # model1.load_state_dict(torch.load(model_weight_path))# 讀取模型 model1 = torch.load('model_name.pth') # 打印出模型的結構 print(model1)x = images[0] x = x.reshape([1, x.shape[0], x.shape[1], x.shape[2]])# forward正向傳播過程 out_put = model1(x)for feature_map in out_put:# [N, C, H, W] -> [C, H, W] 維度變換im = np.squeeze(feature_map.detach().numpy())# [C, H, W] -> [H, W, C]im = np.transpose(im, [1, 2, 0])print(im.shape)# show 9 feature mapsplt.figure()for i in range(9):ax = plt.subplot(3, 3, i + 1) # 參數意義:3:圖片繪制行數,5:繪制圖片列數,i+1:圖的索引# [H, W, C]# 特征矩陣每一個channel對應的是一個二維的特征矩陣,就像灰度圖像一樣,channel=1# plt.imshow(im[:, :, i])plt.imshow(im[:, :, i], cmap='gray')plt.show()卷積后:
激活后:
池化后:
七、查看卷積核
import torch import matplotlib.pyplot as plt import numpy as np from PIL import Image from torchvision import transforms, datasets import torch.nn as nn from torch.utils.data import DataLoaderplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 #有中文出現的情況,需要u'內容 # 定義圖像預處理過程(要與網絡模型訓練過程中的預處理過程一致) transforms = transforms.Compose([transforms.ToTensor(), # 把圖片進行歸一化,并把數據轉換成Tensor類型transforms.Grayscale(1) # 把圖片 轉為灰度圖 ]) path = r'train_data' data_train = datasets.ImageFolder(path, transform=transforms) data_loader = DataLoader(data_train, batch_size=64, shuffle=True) for i, data in enumerate(data_loader):images, labels = data# print(images.shape)# print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):outputs = []x = self.maxpool(self.relu(self.conv1(x)))# outputs.append(x)x = self.maxpool(self.relu(self.conv2(x)))outputs.append(x)x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return outputs# create model model1 = Net()# load model weights加載預訓練權重 # model_weight_path ="./AlexNet.pth" # model_weight_path = "model_name.pth" # model1.load_state_dict(torch.load(model_weight_path))# 讀取模型 model1 = torch.load('model_name.pth')x = images[0]# forward正向傳播過程 out_put = model1(x)weights_keys = model1.state_dict().keys() for key in weights_keys:print("key :", key)# 卷積核通道排列順序 [kernel_number, kernel_channel, kernel_height, kernel_width]if key == "conv1.weight":weight_t = model1.state_dict()[key].numpy()print("weight_t.shape", weight_t.shape)k = weight_t[:, 0, :, :] # 獲取第一個卷積核的信息參數# show 9 kernel ,1 channelplt.figure()for i in range(9):ax = plt.subplot(3, 3, i + 1) # 參數意義:3:圖片繪制行數,5:繪制圖片列數,i+1:圖的索引plt.imshow(k[i, :, :], cmap='gray')title_name = 'kernel' + str(i) + ',channel1'plt.title(title_name)plt.show()if key == "conv2.weight":weight_t = model1.state_dict()[key].numpy()print("weight_t.shape", weight_t.shape)k = weight_t[:, :, :, :] # 獲取第一個卷積核的信息參數print(k.shape)print(k)plt.figure()for c in range(9):channel = k[:, c, :, :]for i in range(5):ax = plt.subplot(2, 3, i + 1) # 參數意義:3:圖片繪制行數,5:繪制圖片列數,i+1:圖的索引plt.imshow(channel[i, :, :], cmap='gray')title_name = 'kernel' + str(i) + ',channel' + str(c)plt.title(title_name)plt.show()
|
等等…不一一展示
八、源碼
1.訓練模型源碼
import torch from torchvision import transforms, datasets import torch.nn as nn from torch.utils.data import DataLoader import matplotlib.pyplot as plt import torch.optim as optimtransforms = transforms.Compose([transforms.ToTensor(), # 把圖片進行歸一化,并把數據轉換成Tensor類型transforms.Grayscale(1) # 把圖片 轉為灰度圖 ])path = r'train_data' path_test = r'test_data'data_train = datasets.ImageFolder(path, transform=transforms) data_test = datasets.ImageFolder(path_test, transform=transforms)print("size of train_data:", len(data_train)) print("size of test_data:", len(data_test))data_loader = DataLoader(data_train, batch_size=64, shuffle=True) data_loader_test = DataLoader(data_test, batch_size=64, shuffle=True)for i, data in enumerate(data_loader):images, labels = dataprint(images.shape)print(labels.shape)breakfor i, data in enumerate(data_loader_test):images, labels = dataprint(images.shape)print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return xmodel = Net() print(model) criterion = torch.nn.CrossEntropyLoss() # 損失函數 交叉熵損失函數 optimizer = optim.SGD(model.parameters(), lr=0.1) # 優化函數:隨機梯度下降epochs = 10 for epoch in range(epochs):running_loss = 0.0for i, data in enumerate(data_loader):images, label = dataout = model(images)loss = criterion(out, label)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()if (i + 1) % 10 == 0:print('[%d %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))running_loss = 0.0print('finished train')torch.save(model, 'model_name.pth')2.測試模型源碼
import torch from torchvision import transforms, datasets import torch.nn as nn from torch.utils.data import DataLoader import matplotlib.pyplot as plt import torch.optim as optimtransforms = transforms.Compose([transforms.ToTensor(), # 把圖片進行歸一化,并把數據轉換成Tensor類型transforms.Grayscale(1) # 把圖片 轉為灰度圖 ])path = r'train_data' path_test = r'test_data'data_train = datasets.ImageFolder(path, transform=transforms) data_test = datasets.ImageFolder(path_test, transform=transforms)print("size of train_data:", len(data_train)) print("size of test_data:", len(data_test))data_loader = DataLoader(data_train, batch_size=64, shuffle=True) data_loader_test = DataLoader(data_test, batch_size=64, shuffle=True)for i, data in enumerate(data_loader):images, labels = dataprint(images.shape)print(labels.shape)breakfor i, data in enumerate(data_loader_test):images, labels = dataprint(images.shape)print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return xmodel_load = Net() # 讀取模型 model_load = torch.load('model_name.pth') # 讀取一張圖片 images[0],測試 print("labels[0] truth:\t", labels[0]) x = images[0] x = x.reshape([1, x.shape[0], x.shape[1], x.shape[2]]) predicted = torch.max(model_load(x), 1) print("labels[0] predict:\t", predicted.indices)img = images[0].data.squeeze().numpy() # 將輸出轉換為圖片的格式 plt.imshow(img, cmap='gray') plt.show()總結
以上是生活随笔為你收集整理的【2021-2022 春学期】人工智能-作业6:CNN实现XO识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英伟达单季营收72亿美元:市值达9393
- 下一篇: PyTorch学习记录——PyTorch