神经网络与深度学习作业5-卷积

 作业1:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def cov2(img,kernel,strde):
    inw,inh = img.shape
    w,h=kernel.shape
    outw = int((inw -w )/strde + 1)
    outh = int((inh -h )/strde + 1)
    arr = np.zeros((outw, outh))
    for g in range(outw):
        for t in range(outh):
            s= 0
            for i in range(w):
                for j in range(h):
                    s+=img[i+g*strde][j+t*strde]*kernel[i][j]
                  # s = img[i][j] * f[i][j]
            arr[g][t]=s
    return arr
img = []
for i in range(7):
    temp = [0,0,0,255,255,255]
    img.append(temp)
img = np.array(img)
print("原图",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图1使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图1使用[1,-1]转置的卷积核\n",test_pic)
print("------------------------------------")
img = []
for i in range(7):
    temp = [0,0,0,255,255,255]
    img.append(temp)
for i in range(7):
    temp = [255,255,255,0,0,0]
    img.append(temp)
img = np.array(img)
print("原图\n",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图2使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图2使用[1,-1]转置的卷积核\n",test_pic)
img = np.array([[0,0,0,0,0,0,0,0,0],
       [0,255,0,0,0,0,0,255,0],
       [0,0,255,0,0,0,255,0,0],
       [0,0,0,255,0,255,0,0,0],
       [0,0,0,0,255,0,0,0,0],
       [0,0,0,255,0,255,0,0,0],
       [0,0,255,0,0,0,255,0,0],
      [0,255,0,0,0,0,0,255,0],
      [0,0,0,0,0,0,0,0,0]])
print("原图\n",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]转置的卷积核\n",test_pic)
kernel = np.array([[1,-1],[-1,1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]转置的卷积核\n",test_pic)
# test_im = Image.fromarray(test_pic)
# test_im.show()

运行结果:

 作业2:

卷积:首先看一下一维卷积在数学上的定义:

一维卷积没什么好说的,通俗来讲即先反转再平移再相乘再累加。

二维卷积其实就是两个矩阵之间的卷积操作,其中一个可以看作“卷积核”,然后对应位置相乘再相加得到一个1*1的矩阵,其实二维卷积可以看作是对特征的提取,当某个矩阵在另一个矩阵中能找到相似的位置时,卷积后的矩阵出现的值就更加明显,因此感觉二维卷积就是一个矩阵在找与自己相像的“好朋友”。

二维卷积特征提取示意,这里是他的博客:https://blog.csdn.net/kingroc/article/details/88192878

三维卷积我找到了一张图,这是他的博客:三维卷积,很形象:

 3D 卷积中,3D 卷积核可以在所有三个方向(图像的高度、宽度、通道)上移动。在每个位置,逐元素的乘法和加法都会提供一个数值。因为过滤器是滑过一个 3D 空间,所以输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。

卷积核:在我的理解中,卷积中体现用于一个矩阵在另一个矩阵中提取特征的矩阵叫做卷积核。仍然拿二维卷积举例子:

 多通道多卷积核的卷积其实就是对于每一个通道分别用一个卷积核进行卷积,然后再将结果按照通道拼接成一幅彩色图,博客地址:机器学习28:多卷积核处理多通道特征图机制

 特征图:一张彩色图片,通常我们认为有R,G,B三个通道,每个通道通过卷积核进行运算就会产生一个个的特征图,也就是说当图像像素值经过卷积核后的到的东西就是特征图。通常,经过多少个卷积核过滤就会产生多少个特征图,也就是下图中的“豆腐皮儿”层数,同时也是该层的深度。网络越深意味着这一层的特征图数目就越多,随着网络的加深,特征图的长宽尺寸缩小,本卷积层的每个特征图提取的特征就越具代表性,所以通常后一层卷积层需要增加特征图的数量,也就是说用更多的卷积核进行卷积操作,才能充分地提取前一层的特征。

特征选择:从已有的M个特征中选取N个特征,从原始特征中选择出一些最有效特征,有点类似于数据预处理。

步长:即卷积核进行一次卷积后,横向移动的步长和纵向移动的步长。

填充:我认为是为了满足边缘特征不被丢失,对边缘进行填充,从而将边缘特征进行提取,对边缘特征更加重视。

感受野:即最后特征图的某个点对应原图的范围,即为感受野。两个堆叠的conv3x3感受野可以等于一个conv5x5,可以大幅度提高计算效率。

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

①不同数值的卷积核对于图像卷积的影响,试着用下边网站试一下:https://setosa.io/ev/image-kernels/

 

 ②不同大小的卷积核的影响:

大卷积核

  • 优点:感受域范围大
  • 举例:AlexNet、LeNet等网络都使用了比较大的卷积核,如5×5、11×11
  • 缺点:参数量多:计算量大

小卷积核

  • 优点:参数量少;计算量小;整合三个非线性激活层代替单一非线性激活层,增加模型判别能力
  • 举例:VGG之后
  • 缺点:感受域不足;深度堆叠卷积(也就是堆叠非线性激活),容易出现不可控的因素

 ③不同形状的卷积核的影响:

如果我们将一个3*3的卷积核变成一个1*3的卷积核和一个3*1的卷积核,那么会有:

3*3卷积计算量:9×9 = 81次乘法

1*3卷积和3*1卷积的累加计算量:3×15+3×9 = 72次乘法

可以看出的是,1*3的卷积核和3*1的卷积核的运算是比3*3的运算速度快的。

三、编程实现

1. 实现灰度图边缘检测、锐化、模糊。(必做)

边缘检测:

锐化:

 模糊:

①均值模糊:

②高斯模糊:

③运动模糊:

2. 调整卷积核参数,测试并总结。(必做)

图像锐化和模糊已给出不同算子下的模糊效果,下面我们修改边缘检测卷积核的参数,看一下边缘检测修改参数后的效果:

 使用peer.jpeg进行测试:

 

修改算子:

修改卷积核步长:

 

3. 使用不同尺寸图片,测试并总结。(必做)

 锐化:

模糊(均值模糊):

  

4. 探索更多类型卷积核。(选做)

上述已经实现不同的卷积核算子下的图形显示。

总结:

本次作业的心得体会,重点谈谈卷积能够提取特征的原理。

心得体会:本次实验感觉深入体会到了卷积的结构,包括一维卷积、二维卷积和多维卷积,然后了解到了卷积核的作用,如何实现图像的边缘检测和锐化和模糊,还有填充的作用,步长的限制......,总之感觉卷积对于特征的提取的功能是很强大的,至于为啥卷积能够提取特征,之前在课上看的就是一个提取眼睛特征的信息,其实卷积核就相当于是一个眼睛,如果他能匹配到该眼睛,他对应的特征图上该点的值就会很大,所以能够进行特征提取,用下边这个老鼠的例子来分析就是,卷积核就像是老鼠的耳朵,然后当卷积核的矩阵滑动到老鼠的耳朵的时候,即特征图的值就会很大,意为匹配度很高,这就浅显的解释了为啥卷积能够提取特征。

 参考文献:

NNDL 作业5:卷积

Python中的图像处理(第十一章)Python图像锐化及边缘检测(1)

pytorch之卷积模块、池化、激活函数(可视化)

理解CNN中的特征图feature map

卷积核的类型及其作用

实验四 图像频域平滑与锐化(Python实现)

几种图像锐化算子的比较

python 图像模糊处理实现

卷积神经网络(4)卷积核参数分析

为什么卷积能够提取图像的特征?看完此文应该能够给你一个答案;

图像卷积

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
《零基础入门深度学习(4) - 卷积神经网络 - 作业部落 cmd markdown 编辑阅读器.pdf》是一个教程文档,主要介绍了卷积神经网络的基本概念和应用。该文档以Cmd Markdown编辑器为工具,提供了深度学习卷积神经网络的相关知识和操作实例。 该文档的内容分为几个部分,首先介绍了深度学习的基本原理和相关术语,包括神经网络、梯度下降、误差反向传播等。接着详细讲解了卷积神经网络的原理和结构,包括卷积层、池化层和全连接层等。 文档中还介绍了卷积神经网络的常见应用,如图像分类、目标检测和语音识别等,并给出了相应的应用示例和代码实现。同时,还介绍了一些常用的卷积神经网络模型,如LeNet、AlexNet和VGGNet等,详细解释了它们的结构和特点。 在使用Cmd Markdown编辑阅读器进行学习时,可以通过该工具进行代码编写和调试,同时还可以使用Markdown语法进行文档编写和展示。该文档提供了一些代码实例和实战练习,可以帮助初学者更好地理解和应用卷积神经网络。 总的来说,《零基础入门深度学习(4) - 卷积神经网络 - 作业部落 cmd markdown 编辑阅读器.pdf》是一个简明扼要的教程文档,通过使用Cmd Markdown编辑器进行学习,可以掌握卷积神经网络的基本原理和应用,并进行相应的实践练习。这对于零基础的入门学习者来说是一份很好的资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鬼缠身、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值