numpy手写CNN卷积

第一步:先写一个只有待卷积矩阵data和卷积核k的方法,默认步长step==1,不设置padding

import numpy as np
def convolution(data, k):
    x, y = k.shape
    n, m = data.shape
    result = []
    for i in range(n - x + 1):
        line = []
        for j in range(m - y + 1):
            a = data[i:i + x, j:j + y]
            line.append(np.sum(np.multiply(k, a)))
        result.append(line)
    return np.array(result)

第二步:补充padding功能,默认设置上下左右一层

def convolution(data, k, padding):
    x, y = k.shape
    n, m = data.shape
    result = []
    if padding:
        data_0 = np.pad(data, ((1, 1), (1, 1)), 'constant', constant_values=(0, 0))
        print(data_0)
        for i in range(n):
            line = []
            for j in range(m):
                a = data_0[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    else:
        for i in range(n - x + 1):
            line = []
            for j in range(m - y + 1):
                a = data[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    return np.array(result)

第三步:补充步长step功能

def convolution(data, k, step, padding):
    x, y = k.shape
    n, m = data.shape
    result = []
    if padding:
        data_0 = np.pad(data, ((1, 1), (1, 1)), 'constant', constant_values=(0, 0))
        print(data_0)
        for i in range(n//step):
            line = []
            for j in range(m//step):
                a = data_0[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    else:
        for i in range((n - x)//step + 1):
            line = []
            for j in range((m - y)//step + 1):
                a = data[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    return np.array(result)

第四步:将padding设置为自适应,不用硬编码

def convolution(data, k, step, padding):

    x, y = k.shape
    n, m = data.shape
    result = []
    if padding:
        padding_h = (x - 1) // 2
    	padding_v = (y - 1) // 2
        data_0 = np.pad(data, ((padding_h, padding_h), (padding_v, padding_v)), 'constant',
                        constant_values=(0, 0))
        print(data_0)
        for i in range((n - x + 2 * padding_h) // step + 1):
            line = []
            for j in range((m - y + 2 * padding_v) // step + 1):
                a = data_0[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    else:
        for i in range((n - x) // step + 1):
            line = []
            for j in range((m - y) // step + 1):
                a = data[i:i + x, j:j + y]
                line.append(np.sum(np.multiply(k, a)))
            result.append(line)
    return np.array(result)

这写主要针对二维图像的卷积,后续有空继续更新。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI小笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值