一、概念
用自己的语言描述“卷积、卷积核、特征图、特征选择、步长、填充、感受野”。
二、探究不同卷积核的作用
可任意选择图片。
锐化后效果不好,图像发灰,可参考链接:【NNDL作业】图像锐化后,为什么“蒙上了一层灰色”?_图像锐化结果一定是灰色的吗-优快云博客
总结:
本次作业的心得体会,重点谈谈卷积能够提取特征的原理。
一、概念
1.卷积
卷积核(也称为滤波器)在输入数据上进行滑动,每次计算与卷积核重叠部分的点乘和。是对数据特征的提取.真正的卷积是将卷积核翻转180°再对位相乘相加,我们平常说的卷积其实是互相关.但由于卷积核是否进行翻转与其特征抽取能力无关,卷积核是通过学习得到的,卷积和互相关再能力上等价,因此在深度学习里常用“卷积”来代替互相关.
2.卷积核
卷积核就是一个权重矩阵。卷积和矩形都行不一定是方的.
3.特征图
图像与卷积核加权累加得到卷积后的特征图。特征图展示了图像中经过卷积核提取的特征,比如某种边缘或特定的形状.
4.特征选择
特征选择是指在多个特征中选择最重要的特征,以简化模型并提高性能.在深度学习中,我们使用卷积核来选择和强调输入数据中的特定特征,忽略不重要的细节.
5.步长
步长是卷积核在图像上滑动的步幅.分为宽度和高度,可以不同,不提默认相同.从左到右,从上到下.
6.填充
填充是指在原始图像的边缘添加额外的像素(通常是零),以防止在卷积操作中信息丢失.填充可以帮助保持特征图的大小.
7.感受野
特征图上的一个点对应输入图上的区域.感受野越大,神经元所关注的输入信息就越多。在卷积神经网络中,随着层数的增加,感受野也会逐渐增大,使得更深层的神经元能够综合更广泛的特征信息。
二、探究不同卷积核的作用
作业1
代码
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
def convolve_and_plot(matrix, kernel):
# 获取卷积核的尺寸
kernel_height, kernel_width = kernel.shape
output_height = matrix.shape[0] - kernel_height + 1
output_width = matrix.shape[1] - kernel_width + 1
# 初始化卷积后的矩阵
convolved_matrix = np.zeros((output_height, output_width))
# 手动进行卷积操作
for i in range(output_height):
for j in range(output_width):
# 逐元素卷积
region = matrix[i:i + kernel_height, j:j + kernel_width]
convolved_matrix[i, j] = np.sum(region * kernel)
# 输出卷积前后的矩阵
print("卷积前的矩阵:")
print(matrix)
print("卷积后的矩阵:")
print(convolved_matrix)
# 显示原始矩阵和卷积后的矩阵
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# 显示原始矩阵
axes[0].imshow(matrix, cmap='gray', interpolation='nearest', extent=[0, matrix.shape[1], 0, matrix.shape[0]], vmin=0, vmax=255)
axes[0].set_title('卷积前的图')
axes[0].axis('on')
axes[0].set_xticks(np.arange(0, matrix.shape[1], 1))
axes[0].set_yticks(np.arange(0, matrix.shape[0], 1))
axes[0].grid(color='white', linestyle='-', linewidth=1)
# 显示卷积后的矩阵
axes[1].imshow(convolved_matrix, cmap='gray', interpolation='nearest',extent=[0, convolved_matrix.shape[1], 0, convolved_matrix.shape[0]], vmin=0, vmax=255)
axes[1].set_title('卷积后的图')
axes[1].axis('on')
axes[1].set_xticks(np.arange(0, convolved_matrix.shape[1] + 1, 1))
axes[1].set_yticks(np.arange(0, convolved_matrix.shape[0] + 1, 1))
axes[1].grid(color='white', linestyle='-', linewidth=1)
plt.show()
# 生成卷积矩阵
matrix1 = np.zeros((8, 8))
matrix1[:, 4:] = 255
matrix2 = np.zeros((8, 8))
matrix2[0:4, 4:] = 255
matrix2[4:, 0:4] = 255
matrix3 = np.zeros((9, 9))
for i in range(1, 8):
matrix3[i, i] = 255
matrix3[i, 8 - i] = 255
# 定义卷积核
kernel1 = np.array([[-1, 1]])
kernel2 = kernel1.T
kernel3 = np.array([[1, -1],
[-1, 1]])
# 调用函数进行卷积和绘图
convolve_and_plot(matrix1, kernel1)
convolve_and_plot(matrix1, kernel2)
convolve_and_plot(matrix2, kernel1)
convolve_and_plot(matrix2, kernel2)
convolve_and_plot(matrix3, kernel1)
convolve_and_plot(matrix3, kernel2)
convolve_and_plot(matrix3, kernel3)
1.对图1使用卷积核(-1,1)进行卷积
2.对图1使用卷积核(-1,1).T进行卷积
3.对图2用卷积核(-1,1)进行卷积
4.对图2用卷积核(-1,1).T进行卷积
5.对图3卷积
(1)对图3用卷积核[-1, 1]进行卷积
(2)对图3用卷积核[-1, 1].T进行卷积
(3)对图3用卷积核[[1, -1][-1, 1]]进行卷积
作业2
代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import convolve
from PIL import Image
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
def load_image(image_path):
# 加载图像并转换为灰度图像
image = Image.open(image_path).convert('L')
return np.array(image)
def apply_convolution(image, kernel):
# 对每个通道应用卷积核
convolved = np.zeros_like(image)
for c in range(image.shape[2]): # 遍历每个通道
convolved[:, :, c] = convolve(image[:, :, c], kernel, mode='reflect')
return convolved
def display_images(original, convolved_images, titles):
# 显示原始图像和卷积后的图像
num_images = len(convolved_images) + 1
rows = int(np.ceil(num_images / 2))
plt.figure(figsize=(12, 8))
# 显示原始图像
plt.subplot(rows, 2, 1)
plt.imshow(original, cmap='gray')
plt.title("原图灰度")
plt.axis('off')
# 显示卷积后的图像
for i, convolved in enumerate(convolved_images):
plt.subplot(rows, 2, i + 2)
plt.imshow(convolved, cmap='gray')
plt.title(titles[i])
plt.axis('off')
plt.tight_layout()
plt.show()
# 读取图像
# image_path = 'img.png'
# image_path = 'img_1.png'
image_path = '屏幕截图.png'
original_image = load_image(image_path)
# 定义卷积核
kernels = [
# np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]), # 边缘检测
np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]]), # 边缘检测
# # (1 / 2) *np.array([[0, -2, 0], [-2, 6, -2], [0, -2, 0]]), # 锐化
# (1 / 6) * np.array([[1, -1, 1], [0, 6, 0], [1, -1, 1]]), # 锐化
# # (1 / 16) * np.array([[1, 2, 1], [2, 8, 2], [1, 2, 1]]) # 模糊
np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]), # 锐化
(1 / 16) * np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]]) # 模糊
# (1 / 9) * np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) # 模糊
]
convolved_images = [convolve(original_image, kernel) for kernel in kernels]
titles = ['边缘检测', '锐化', '模糊']
# 显示结果
display_images(original_image, convolved_images, titles)
总结:本次作业的心得体会,重点谈谈卷积能够提取特征的原理。
卷积核相当与一个权重矩阵,将原始图象数据与它对应的权重相乘相加,就将这些参与运算的原始数据根据权重的不同提取出来了,这就是卷积了.卷积核不同特征提取也不相同.
卷积核本来用的都是老师PPT里给的,我对卷积核尝试更改了一下,对上面的图像没有太大的区别,可能是像素点太多,处理效果要放大看.对下面狗就有影响了.
如果出现大面积黑斑,说明像素值过大,出现太白了就是太小.大了在卷积核或最后除或减去一些,小了同理.
模糊和锐化:图像锐化用于增强图像边缘,导致高频分量增强,会使图像清晰;图像模糊也叫平滑用于消除图像噪声,如名它也容易引起边缘的模糊.卷积核只锐化有些是负数而已.