持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
今天是十月更文计划第三天,第五篇
卷积神经网络的学习
卷积神经网络的特点:
局部连接,共享权重
卷积神经网络(CNN)与普通神经网络(NN)具有显著的区别:
卷积神经网络hwc,h与w表示长与宽,c表示通道数。
卷积神经网络的基础构成:
输入层->卷积层->池化层->全连接层
简单的来说:
卷积层用于提取特征
池化层用于压缩特征
1.卷积层
卷积层通过卷积操作提取图像局部的特征,它是卷积神经网络的第一层。
卷积操作是数学分析中的一种操作,由于图像是二维的,因此卷积中的滤波器(也被称作卷积核)也通常是二维的。对于给定的输入。
过滤器也被称为权重矩阵
每经过一次卷积,得到小的矩阵称为特征图,比如最右边的小矩形。
代码如下:
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))