神经网络与深度学习作业6

一、概念
用自己的语言描述“卷积、卷积核、特征图、特征选择、步长、填充、感受野”。

二、探究不同卷积核的作用

可任意选择图片。

锐化后效果不好,图像发灰,可参考链接:【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里给的,我对卷积核尝试更改了一下,对上面的图像没有太大的区别,可能是像素点太多,处理效果要放大看.对下面狗就有影响了.

如果出现大面积黑斑,说明像素值过大,出现太白了就是太小.大了在卷积核或最后除或减去一些,小了同理.

模糊和锐化:图像锐化用于增强图像边缘,导致高频分量增强,会使图像清晰;图像模糊也叫平滑用于消除图像噪声,如名它也容易引起边缘的模糊.卷积核只锐化有些是负数而已.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值