记录研究生封校生活的学习day3(第二篇):CNN卷积神经网络(含代码)

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

今天是十月更文计划第三天,第五篇

卷积神经网络的学习

卷积神经网络的特点:

局部连接,共享权重

卷积神经网络(CNN)与普通神经网络(NN)具有显著的区别:

image.png

卷积神经网络hwc,h与w表示长与宽,c表示通道数。

卷积神经网络的基础构成:

输入层->卷积层->池化层->全连接层

image.png

简单的来说:

卷积层用于提取特征

池化层用于压缩特征

1.卷积层

卷积层通过卷积操作提取图像局部的特征,它是卷积神经网络的第一层。

卷积操作是数学分析中的一种操作,由于图像是二维的,因此卷积中的滤波器(也被称作卷积核)也通常是二维的。对于给定的输入。

过滤器也被称为权重矩阵

image.png

每经过一次卷积,得到小的矩阵称为特征图,比如最右边的小矩形。

代码如下:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import torch.optim as optim

digits=datasets.load_digits()
X=digits.data
y=digits.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=4,test_size=0.1)

x=np.array(X_train,dtype=np.float32)
y=np.array(y_train,dtype=np.float32)
class FD(Dataset):
    def __init__(self,x,y):
        self.x = x
        self.y=y
    def __len__(self):
        return len(self.x)
    def __getitem__(self, idx):
        return x[idx],y[idx]
dataset=FD(x,y)

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 3)
        self.conv2 = nn.Conv2d(6, 16, 3)
        self.fc1 = nn.Linear(256, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return F.softmax(x,dim=1)

    def num_flat_features(self, x):
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net=Net()
optimizer = optim.SGD(net.parameters(), lr=0.01)
dl=DataLoader(dataset=dataset,batch_size=30,shuffle=False)
criterion = nn.NLLLoss()
#
for epoch in range(500):
    for i_batch, sample_batched in enumerate(dl):
        input = sample_batched[0]
        input = input.view(-1,1,8,8)
        target = sample_batched[1]
        optimizer.zero_grad()
        output = net(input)
        loss = criterion(output, target.long())
        loss.backward()
        optimizer.step()
        print("i_batch:", i_batch, "loss:", loss)
        print('-' * 100)
    print(epoch,'*'*100)
#
#
x_t=np.array(X_test,dtype=np.float32)
y_t=np.array(y_test,dtype=np.float32)
print(len(x_t))
with torch.no_grad():
    xt = torch.Tensor(x_t)
    xt = xt.view(-1, 1, 8, 8)
    y_pred=net(xt)
    y_ul = torch.max(y_pred.data, dim = 1) 
    print('+'*100)
    print(y_ul.indices)

print('+'*100)
print(y_t)
pred = np.array(y_ul.indices)
print(accuracy_score(y_t, pred))