转置卷积(Convolution Transposed又叫反卷积、解卷积)

根据我上一个博文:使用矩阵乘法实现卷积“博文“”的基础上分享一下对于转置卷积的心得。

博文参考:

转置卷积(Transposed Convolution)_太阳花的小绿豆的博客-优快云博客_转置卷积


1.使用矩阵乘法实现卷积运算

1) 分别对输入矩阵和卷积核进行展平、补充零展平拼接操作得到新的矩阵。(我上一个博客“使用矩阵乘法实现卷积“有讲解)

 2) 进行矩阵运算,然后Reshape形状得到卷积后的结果

2 .对上述的卷积运算进行逆向过程的操作,从而实现转置卷积的从输出的2X2形状上采样到3X3

1)下面这里采用矩阵的转置来实现上采样

 2)与上面的正向卷积输出的结果进行逆过程的上采样

3)下面这种方法的计算效果和上面2)这种方法是一致的

 

3.转置卷积输出尺寸大小计算


代码实现

import numpy as np

# ----------------Convolution Transposed -----------------------
# 数据预处理
def Data_rashape(image: np, kernel:np):
    # 将输入矩阵进行横向展平处理
    image_ = np.reshape(image,-1)

    # 用于存储卷积核填零展平拼接后的矩阵
    dd_ = None
    # 填充零这里使用的是,直接替换全零矩阵的值实现
    '''
        首先需要计算卷积后的到的矩阵大小(w,h)
        通过模仿滑动窗口的样子,依次填充卷积核,最后将它们拼接起来就是一个卷积核矩阵
    :return
        输入矩阵展平之后的矩阵和卷积核填充0后的矩阵
    '''
    for i in range(image.shape[0]-kernel.shape[0]+1):
        for j in range(image.shape[1]-kernel.shape[1]+1):
            dd = np.zeros(image.shape)  # 根据输入矩阵的大小,来建立全零矩阵
            dd[i:i + kernel.shape[0], j:j + kernel.shape[1]]=kernel # 全零矩阵对应位置被卷积核替换
            if i==0 and j==0:   # 第一个卷积核记录为起点
                dd_ = dd.reshape(-1)[None,:]
            else:
                # 从第二个卷积核开始,进行按行的堆叠
                dd_ = np.concatenate((dd_, dd.reshape(-1)[None,:]),axis=0)
    print("kernels形状:",dd_.T.shape)
    print("image_的形状:",image_.T.shape)
    # 这里通过转置转换为想要的形状
    return dd_.T , image_.T


if __name__ == '__main__':
    Image = np.array([[1,2,3],
                    [4,5,6],
                    [7,8,9]])
    kernel = np.array([[1,2],
                 [3,4]])
    # 输入矩阵展平之后的矩阵和卷积核填充0后的矩阵
    C, I = Data_rashape(Image,kernel)
    O = I @ C
    result1 = O.reshape(Image.shape[0]-kernel.shape[0]+1,Image.shape[1]-kernel.shape[1]+1)# 按照最后的卷积的大小,进行还原
    print("result1:\n",result1)

    print("==================卷积的逆向过程======================")
    print(O.shape,C.shape)
    I_ = O @ C.T
    result2 = I_.reshape(Image.shape)# 按照最后的卷积的大小,进行还原
    print("result2:\n",result2)

结果展示:


总结

1.转置卷积, 有名字可以理解,它是通过矩阵的转置来实现的上采样效果。

2.转置矩阵是卷积的逆向过程,计算出来的结果和原输入矩阵不相同。

3.上面总结,由于需要大量的图文,所以用的是在ppt弄完后截出来的图,如果不知的地方,欢迎大家私聊我!!!,随便点个赞👍吧

### CSS选择器 `nth-child` `last-child` 的组合使用 当尝试将 `nth-child(n)` 与 `last-child` 结合起来作为复合选择器时,重要的是理解这两个伪类如何工作以及它们之间的关系。 #### 使用场景分析 对于样式规则允许嵌套并以标识符开头的情况[^1],考虑如下HTML结构: ```html <ul> <li>Item 1</li> <li class="special">Special Item</li> </ul> ``` 如果希望仅针对列表中的第二个项目且该项目同时也是最后一个子元素应用特殊样式,则可以这样写CSS: ```css li:nth-child(2):last-child { color: red; } ``` 这段代码意味着只有在满足两个条件的情况下才会生效:一是该元素是其父级下的第n个孩子;二是它也是同一个父级下最后的孩子。因此,在上述例子中,“Special Item”将会被渲染成红色字体颜色。 然而需要注意一些潜在的问题局限性: - 如果存在多个同类型的兄弟节点超过指定的数量(`n`),那么即使某个特定位置上的元素确实位于末端也不会匹配到此规则。 - 当页面动态加载更多内容或通过JavaScript操作DOM树改变顺序/数量时,原本符合条件的选择可能会失效或者不再唯一适用。 #### 实际案例展示 为了更直观地说明这一点,下面给出一个具体的实例来观察效果差异: 假设有一个无序列表包含三个列表项(`<li>`): ```html <ul id="example"> <li>First item</li> <li>Middle item</li> <li>Last item</li> </ul> ``` 现在定义两组不同的CSS规则分别测试单一使用`:last-child` 及联合使用 `:nth-child()` : ```css /* 单独使用 :last-child */ #example li:last-child{ background-color:green; /* 应用于所有情况下的最后一项 */ } /* 联合使用 nth-child() last-child */ #example li:nth-child(2):last-child{ font-weight:bold; /* 仅应用于既是第二项又是最后一项的情形 */ } ``` 在这种情况下,由于有三项,所以第一个规则会使得第三个 `<li>` 显示绿色背景色,而第二个规则不会有任何影响因为不存在既处于索引为二又恰好是最右边的那个元素。 #### 常见误区澄清 有时开发者可能误解了这些伪类的功能范围,认为只要设置了一个较高的数值给 `nth-child()` 就能确保只选中最右侧的一个元素,但实际上这取决于实际存在的子元素总数目。另外还需注意浏览器兼容性解析优先级等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值