动手学PyTorch(李沐)12 ---- 卷积层多通道

卷积层里的多输入和多输出的通道

多输入通道

灰度图只有一个通道

多通道输入的计算

c–>channel h–>high w–>width

多输出通道

​ 多输出通道:每一个输出通道在识别不同的模式,即特征识别

​ 多输入通道:将多个识别出来的模式放到下一层进行组合输入,得到一个组合的模式识别

对几个通道进行加权和得到新的输出,多个卷积核分别与输入进行加权和得到多个输出

不识别空间信息是因为1×1卷积层只看了对应的像素点,没有看周围的信息

co是输出的通道数

卷积层的计算量很大,但存储代价很小

QA:

  1. 网络越深,padding越大,不会影响精度,但是会影响模型性能
  2. 不同通道的卷积核是不一样的,不同通道的卷积核大小是一样的
  3. 核的参数是学习出来的
  4. 卷积层之间是不共享参数的,因为我们希望每一个通道都去学习对应的有效信息

代码

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X,K):
  """二维互相关,输入矩阵X, 核矩阵K"""
  h,w = K.shape
  Y = torch.zeros((X.shape[0] - h + 1,X.shape[1] - w + 1))
  for i in range(Y.shape[0]):
    for j in range(Y.shape[1]):
      Y[i,j] = (X[i:i+h,j:j+w]*K).sum()

  print(Y)
  return Y


def corr2d_multi_in(X,K):
  # zip对最外层的输入通道做遍历
  return sum(d2l.corr2d(x,k) for x,k in zip(X,K))

X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
corr2d_multi_in(X, K)

在这里插入图片描述
计算多个通道的输出的互相关函数

def corr2d_multi_in_out(X,K):
  # 把计算结果叠起来
  return torch.stack([corr2d_multi_in(X,k) for k in K],0)

K = torch.stack((K,K+1,K+2),0)
K.shape

在这里插入图片描述

corr2d_multi_in_out(X,K)

在这里插入图片描述
1×1卷积

def corr2d_multi_in_out_1x1(X,K):
  # 输入通道数和长宽
  c_i, h, w = X.shape
  # 输出通道数
  c_o = K.shape[0]
  # X变形为输入通道数,并将二维张量拉成一维
  X = X.reshape((c_i, h * w))
  K = K.reshape((c_o, c_i))
  # 全连接层中的矩阵乘法
  Y = torch.matmul(K, X)
  return Y.reshape((c_o, h, w))


X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))

Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值