深度学习入门-卷积层的实现

本文详细介绍了im2col函数在卷积神经网络(CNN)中如何展开输入数据进行高效的矩阵运算,包括其原理、卷积层和池化层的实现步骤,并展示了如何构建一个简单的CNN网络结构。通过实例展示了计算输出尺寸的方法和关键代码片段。
摘要由CSDN通过智能技术生成

im2col函数

实现原理

https://blog.csdn.net/dwyane12138/article/details/78449898

im2col(input_data, filiter_h, filter_w, stride=1, pad=0)
input_data 由(数据量,通道,高,长)的4维数组构成的输入数据
filter_h 滤波器的高
filter_w 滤波器的长
stride 步幅
pad 填充

卷积层的实现:

将卷积层命为Convolution的类

from util import im2col
import numpy as np
class Convolution:
    def __init__(self, W, b, stride=1, pad=0):
        self.W = W
        self.b = b
        self.stride = stride
        self.pad = pad
    def forward(self, x):
        FN, C, FH, FW = self.W.shape #滤波器
        N, C, H, W = x.shape #数据
        #先计算输出矩阵的height和width
        out_h = int(1 + (H + 2*self.pad - FH) / self.stride)       
        out_w = int(1 + (W + 2*self.pad - FW) / self.stride)

        col = im2col(x, FH, FW,self.stride, self.pad) #展开输入数据
        col_W = self.W.reshape(FN, -1).T #reshape将滤波器展开为2维数组,-1是自动计算-1维度上的元素个数,即将滤波器一个个按列展开(FH*FW*C,FN)
        out = np.dot(col, col_W) + self.b #计算展开后的矩阵的乘积

        out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
        #tranpose会更改多维数组的轴的顺序(0,1,2,3)改成(0,3,1,2)
        return out

(N条数据,C个通道,OH高,OW宽)

输出大小:
其中填充为P,步幅为S
OH=(H+2P-FH)/S +1 输出矩阵的高
OW=(W+2P-FW)/S +1 输出矩阵的宽

除不尽的时候需要采取报错等对策

过程:
在这里插入图片描述

池化层的实现:

from util import im2col
import numpy as np
class Pooling:
    def __init__(self, pool_h, pool_w, stride=1, pad=0):
        self.pool_h = pool_h
        self.pool_w = pool_w
        self.stride = stride
        self.pad = pad
    def forward(self, x):
        N, C, H, W = x.shape
        out_h = int(1 + (H - self.pool_h) / self.stride)
        out_w = int(1 + (W - self.pool_w) / self.stride)
        #展开
        col = im2col(x, self.pool_h, self.pool_w, self.stride,self.pad)
        col = col.reshape(-1, self.pool_h*self.pool_w)
        #求各行的最大值
        out = np.max(col, axis = 1)
        #转换
        out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)

        return out

CNN的实现:
网络构成是Convolution - ReLU - Pooling - Affine - ReLU - Affine - Softmax,将其命为SimpleConvNet的类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qtayu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值