多输入通道和多输出通道 讨论区

http://zh.diveintodeeplearning.org/chapter_convolutional-neural-networks/channels.html

卷积核的每个元素是怎么确定的的。比如输入的图片通道只有一个的话,需要输出的通道为6,卷积核的shape[0]应该是6。就是这6个卷积核是不同的(表述不太准确,意思大家懂得),否则输出的值是一样的,也没有什么意义。但是这6个卷积核是怎么确定的,有没有人帮下忙,感谢!

1赞

在1*1的卷积核中, 文档里是这么说的:

输出中的每个元素来自输入中对应位置的元素在不同通道之间的按权重累加。
假设我们将通道维当做是特征维,而高宽中的元素则当成数据点。那么1×1卷积层则等价于一个全连接层。

按照不同权重累加是不是就相当于是dense层+weight decay? 求解答…
(编辑…)
想通了, conv转到dense的输入输出不一样, 一个是4D一个是2D, 如果直接全连接的话矩阵会特别大

所以1*1的卷积核本质上和之前说到的多通道卷积核是不一样的。
之前说到的比如说有m个通道,现在有n个新的卷积核去卷积之前的m,那么对于每一个新的卷积核,卷积的结果都是之前的m个卷积结果的等权相加。但是1*1卷积默认是对不同的channel有不同的权,对于每一个pixel类似于对于不同的通道做全连接,但全连接的weight不一样。

1赞

我也没想明白,为什么有K,K+1,K+2。 最后那个Y1 等于 Y2 到底想说明什么? 不明觉厉!! 同求。感谢!
【编辑】
K+1,K+2为说明每个通道的 kernel 各不相同,是随意选择的(因为这些参数最终是模型学习得到的)。 Y1 是全连接。Y2 是1×1卷积层的效果。

1赞

有看了几遍课程,我认为:你的这个6 应该说根据业务需求和经验吧,相当于全连接的最后一层,可以作为分类。比如数字分类mnist shape[0] 就取 10 。

6个通道对应6个特征, 具体输出多少个通道多少个特征由设计网络的人员摸索和决定
每个通道对应的卷积核会有随机初始化的参数作为起点, 所以导致他们的输出值不一样,
会在求导和学习的过程中逐步分化的
我对相关背景了解很少, 只是听说还有预训练的过程吧, 对有些数据集, 根据统计分析数据挖掘, 可能会有初步可用的参数集吧

卷积核中的每个元素是随机的,我在网上搜的也是这样,但是为什么随机的元素怎么能够达到这种效果,难道卷积核中的元素也是通过训练得到最终结果的吗

练习 例⼦中 Y1 和 Y2 结果完全⼀致吗?原因是什么?
试验下来结果完全一样啊

这个问题已经搞明白了,之前的教程里没有说明,后来有了说明。
之前没有深刻的理解卷积核是什么东西,理解如下:
卷积核就相当于线性回归里的参数权重w。线性回归训练w,这里是训练卷积核,或者说是卷积核里的每一个元素

  1. 乘法 C_O * C_i * ( k_h * k_w * (h - K_h + p_h + s_h) / s_h * (w - k_w + p_w + s_w) / s_w )
    加法 C_O * C_i * ( (h - K_h + p_h + s_h) / s_h * (w - k_w + p_w + s_w) / s_w )

多通道输出是对输入通道设置了多个不同的核数组,每个核数组的形状和K是相同的,计算方法也是相同的。多个通道输出实际上是将单通道输出的步骤重复了几次,K是单通道输出时候的核函数,K+1和K+2为了体现相同的运算过程又人为给定了两个形状相同的核数组进行计算,并输出计算结果。

第一个课后问题:
首先可以知道输出的shape为:

Co*(

((h+Ph-Kh)/s+1)*

((w+Pw-Kw)/s+1))

设上述简写为CoHoWo

那么共做乘法:

Co * Ci * Ho * Wo * Kh * Kw次

共做加法:

(Ci-1)(Ho * Wo-1)(Kh * Kw-1)次

在这个教程里卷积核里有四个参数,分别是(输出通道,输入通道,高, 宽),如果输出通道是6的话,虽然这六个卷积核的尺寸都是一样的,但可以通过改变里面的参数从而提取不同的特征,就像教程前面的提到的(1,,-1)可以提取竖向边缘特征那样,也就是说主要还是看卷积核中自己设置的参数的:grinning:

本章内容部分有点抽象,做了这么一个图

3赞

nd.add_n(*[d2l.corr2d(x, k) for x, k in zip(X, K)])
这个计算实在看不懂,哪个大牛请给解释下,zip(X, K)返回什么样的元组?for x, k in zip()是穷举的意思吗?那[d2l.corr2d(x, k) for x, k in zip(X, K)]整体又是什么呢?还有*表示位置参数是什么意思?位置参数不是在函数定义的时候才用到吗?def func(*param),调用的时候为啥也用呢?

for x, k in zip(X, K)

这个是在loop第0维,也就是X、K的输入通道那一维,加上方括号[]后得到一个列表,而*是将这个列表再解包成单独的参数项传给nd.add_n。你看看nd.add_n的文档就能发现它可以接受不定数量的参数

请问用什么软件做的呀?

加法次数应该是:(Ci-1)(Co*Ho * Wo)(Kh * Kw-1)次吧

如何将三维的Tensor转化为可以神经网络训练的四维数据?