根据stride 生成锚点阵(从↖开始扩张→↓) - (绿色)
根据 k核尺寸(蓝色)&img图片尺寸(橙色) 画框(黑色),丢弃的点阵 - 红色
裁剪(黑色)
得到裁剪的锚点阵 - (绿色)
用卷积核锚点对图片采样后处理(绿块做锚点,贴上蓝色卷积核)
?处理 最简单的乘&求和
而且这样看,你可以发现卷积(非卷积层)本质是什么东西
在锚点上应用卷积核,保留位置求和
可学的空间池化(*Weight+sumpool)(不计padding的影响)
注意此非卷积层:
卷积在外还有一层通道全连接,通道深度
注意这种可视化方法:
可以扩展到任意的尺寸卷积核,图片,并不需要为奇数
如果是纯粹奇数,锚点阵可以视作中心扩张
from PIL import Image
import numpy as np
from einops import rearrange
s = 1
k = 3
im = Image.open(r"0001.png")
im = np.asarray(im)
h,w,c = im.shape
# x-w y-h
# 无求和kk=k,(乘&求和)注意kk=1
im1 = np.zeros((h//s,w//s,kk,kk,c))
# 根据stride 生成锚点阵
# s=1仅是平面,s>1为散点
# 锚点(x,y)
for y in range(0,h,s):
for x in range(0,w,s):
# 根据 k 核尺寸& h w 图片尺寸 画框裁剪 移除点阵,仅做大于裁剪
if x <= (w-k) and y <= (h-k):
# 按照用卷积核锚点对图片采样
imyx = im[y:y+k, x:x+k]
# 后续处理
# (乘&求和)imyx = np.sum(imyx*kernel, axis=(0,1), keepdims=True)
# 独立了锚点(x,y)维度的赋值
im1[y//s,x//s] = imyx
im2 = rearrange(im1,'y x ky kx c -> (y ky) (x kx) c')
s1k3 = Image.fromarray(np.uint8(im2))
s1k1.save('s1k3.png')
前面两步数据处理,可以很好的并行优化,后面一步是程序计算
=============
仅输入角度看的扩展版
越白重叠越少
im1 = np.ones(im.shape)*255
for y in range(0,h,s):
for x in range(0,w,s):
if x <= (w-k) and y <= (h-k):
im1[y:y+k, x:x+k] -= 10
k,s = 7,2
这个纯卷积
还真看不出啥
得实现一下卷积层,迁点权重过来
而且大核太handcraft,神经网络根本不用大核
别直接输出uint8,截断导致衍涉图纹(?)
===================
这个方法还非常好翻转
那个点阵就是必须储存起来给反向计算的
得到的gradmap他是不知道怎么逆向回input的尺寸
首先翻转O=W*X
然后按照锚点阵去还原输入
是不是很好,回放(?)
就像一个视频你能很好的逆着播放一样
我现在被这启发了,如果人类的编程词法语法,不仅仅是条件语句
都能有能储存起来的翻转格式,一切语句接可导
这怕是要卷爆
不再仅仅是数学可导,编程(基于条件的算法)都可导
可怕可怕
话是这么说,似乎很多语句都不可能有翻转形式
人类是在用语法糖,那些编程句式均不是元算子
========