日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【2021-2022 春学期】人工智能-作业6:CNN实现XO识别

發布時間:2024/5/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。