卷积常用于特征提取
实验过程中注意认真体会“特征提取”,弄清楚为什么卷积能够提取特征。
一、概念
用自己的语言描述“卷积、卷积核、特征图、特征选择、步长、填充、感受野”。
二、探究不同卷积核的作用
卷积神经网络工作原理的直观理解_superdont的博客-CSDN博客
1. 图1分别使用卷积核,输出特征图
2. 图2分别使用卷积核,输出特征图
3. 图3分别使用卷积核,, ,输出特征图
4. 实现灰度图的边缘检测、锐化、模糊。
5. 总结不同卷积核的特征和作用。
参考代码
import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
file_path = 'deer.jpg'
im = Image.open(file_path).convert('L') # 读入一张灰度图的图片
im = np.array(im, dtype='float32') # 将其转换为一个矩阵
print(im.shape[0], im.shape[1])
plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
plt.title('原图')
plt.show()
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积
sobel_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
edge1 = conv1(Variable(im)) # 作用在图片上
x = edge1.data.squeeze().numpy()
print(x.shape) # 输出大小
plt.imshow(x, cmap='gray')
plt.show()
总结:
本次作业的心得体会,重点谈谈卷积能够提取特征的原理。
参考链接
参考:Image Kernels explained visually (setosa.io)
【2021-2022 春学期】人工智能-作业4:CNN - 卷积_HBU_David的博客-CSDN博客
6.2. 图像卷积 — 动手学深度学习 2.0.0-beta1 documentation (d2l.ai)
【精选】【NNDL作业】图像锐化后,为什么“蒙上了一层灰色”?_在matlab图像处理过程中,double型图像灰度值出现负数的原因-CSDN博客