2

(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现

 9 months ago
source link: https://blog.51cto.com/u_16207976/6982610
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

以前对多通道和多通道输入输出的卷积操作不理解,今天自己在草稿纸上画图推理了一遍,终于弄懂了。希望能帮助到大家。

多通道可视化

一通道的2x2矩阵

torch.Size([2,2]) 相当于 torch.Size([1,2,2]),是一通道的2x2矩阵

(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现_多通道

二通道的 2x2矩阵

torch.Size([2,2,2])代表二通道的 2x2矩阵 ,第一个2表示通道

(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现_多通道_02

三通道的2x2x2矩阵

torch.Size([3,2,2,2])

(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现_卷积_03

多输入通道代码,输出通道为1的卷积操作代码

import torch
from d2l import torch as d2l
'''
    多输入通道,输出单通道
    for x,k in zip(X,K)是取出每个通道的图像矩阵 和 对应的卷积核。
    对每个通道对应的的像素矩阵和卷积核进行计算最后相加合到一起
'''
def corr2d_multi_in(X,K):
    return sum(d2l.corr2d(x,k) for x,k in zip(X,K))

X = torch.tensor([[[0, 1, 2],
                   [3, 4, 5],
                   [6, 7, 8]],
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])
K = torch.tensor([[[0, 1],
                   [2, 3]],
                  [[1, 2],
                   [3, 4]]])
print(result)
print(result.shape)

输出结果:

tensor([[ 56.,  72.],
        [104., 120.]])
torch.Size([2, 2])

结果可视化

(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现_2d_04

多输入和多输出通道的卷积操作代码

'''多输入和多输出通道'''
def corr2d_multi_in_out(X,K):
    # 注意,没有遍历X,此时的X是大写
    return torch.stack([corr2d_multi_in(X,k) for k in K],0)

K = torch.tensor([[[0, 1],
                   [2, 3]],
                  [[1, 2],
                   [3, 4]]])
K = torch.stack((K,K+1,K+2),0)
K.shape

torch.Size([3, 2, 2, 2])

result = corr2d_multi_in_out(X,K)
print(result)
print(result.shape)
tensor([[[ 56.,  72.],
         [104., 120.]],

        [[ 76., 100.],
         [148., 172.]],

        [[ 96., 128.],
         [192., 224.]]])
torch.Size([3, 2, 2])
(通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现_2d_05

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK