卷积神经网络可视化——Image Kernel

前言

深度学习领域,解决图像分类问题,最常用的就是卷积神经网络(Convolutional Neural Network)简称 CNN。之所以称之卷积神经网络,是因为,隐藏层中使用了卷积层,来处理二维(灰度)或三维(RGB)的图像数据。每个卷积层由多个过滤器(Filter)组成,每个过滤器对应一个小矩阵(行列数通常为2或者3),矩阵沿着图像的行列,按一定步长,依次乘积,求和,得到一副新的图像数据,这个过程就是对图像求卷积的过程。


在卷积神经网络的应用中,对图像求卷积得到一副新的图像(如果步长大于1,新图像会缩小),通常用于提取图像的特征,每个过滤器也被称为一个特征映射。但是,图像卷积不只是用在深度神经网络提取特征,在深度学习应用之前,图像卷积已被大量应用在图像处理领域。如我们熟悉的 PhotoShop 等图像处理软件中的,模糊,锐化,浮雕,轮廓线,以及边沿检测,也是通过图像卷积实现的。不同的是,深度学习的卷积矩阵数值是由模型训练出来的,没有规律,而图像处理中,矩阵的数值是有规律的,并且形状通常为 3行3列。我们也称这个矩阵为 Image Kernel (事实上,在 Keras 中卷积层参数也使用 kernel 表示过滤器尺寸)。

本文标题叫《卷积神经网络可视化》,事实上,也是为了说明,虽然神经网络的参数就像黑盒子,无法解释,但是卷积层的输出是可以可视化呈现的。本文从图像处理角度,来解释用于图像卷积的不同 Image Kernel 的可视化输出结果。

1. 导入库

from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline

2. 实现 Image Kernel 运算

2.1 助手函数

指定图像路径,使用 PIL.Image 读取彩色图像或者灰度图像。

def read_img(imgpath, gray=True):
    img = Image.open(imgpath)
    if gray:
        img = img.convert("L")
    return img

指定图像宽度,按比例缩放图像。

def resize_width(img, width):
    w, h = img.size
    height = int(width * h / w)
    return img.resize((width, height))

以图像最短边长,从中间截取正方形图像。

def crop_center(img):
    w, h = img.size
    c_x, c_y = w/2, h/2
    offset = min(w, h) / 2
    crop_box = (c_x-offset, c_y-offset, c_x+offset, c_y+offset)
    return img.crop(crop_box)

2.2 指定 kernel 对图像处理

img 为 Image 对象;kernel 为进行卷积运算的矩阵;strides 为卷积运算单次平移步长;mean 为 False 时,求和,为 True 时,求平均值。

def apply_img_kernel(img, kernel, strides=1, mean=False):
    img = np.asarray(img)

    h, w = img.shape[:2]
    k_h, k_w = kernel.shape[:2]
    x_range = range(0, w - k_w + 1, strides)
    y_range = range
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值