Tensorflow 理解高维致密层的输出

Tensorflow 理解高维致密层的输出,tensorflow,keras,neural-network,deep-learning,keras-layer,Tensorflow,Keras,Neural Network,Deep Learning,Keras Layer,我在理解紧跟着扁平层的密集层的输出形状方面没有问题。输出形状符合我的理解,即(批量、单位) 输出为: _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= c

我在理解紧跟着扁平层的密集层的输出形状方面没有问题。输出形状符合我的理解,即(批量、单位)

输出为:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 3, 4, 8)           40        
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 2, 3, 1)           33        
_________________________________________________________________
flatten_1 (Flatten)          (None, 6)                 0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 35        
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 6         
=================================================================
Total params: 114
Trainable params: 114
Non-trainable params: 0
_________________________________________________________________
但是我很难理解多维输入密集层的输出形状

nn= keras.Sequential()
nn.add(keras.layers.Conv2D(8,kernel_size=(2,2),input_shape=(4,5,1)))
nn.add(keras.layers.Conv2D(1,kernel_size=(2,2)))
#nn.add(keras.layers.Flatten())
nn.add(keras.layers.Dense(5))
nn.add(keras.layers.Dense(1))

nn.summary()
输出为

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 3, 4, 8)           40        
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 2, 3, 1)           33        
_________________________________________________________________
dense_1 (Dense)              (None, 2, 3, 5)           10        
_________________________________________________________________
dense_2 (Dense)              (None, 2, 3, 1)           6         
=================================================================
Total params: 89
Trainable params: 89
我无法对
densed_1
densed_2
层的输出形状作出直观判断。最终输出不应该是标量或(批次、单位)吗? 下面类似的问题试图解释直觉,但我不能完全理解这个概念。 同样:

也就是说,640x959网格中的每个输出“像素”(i,j)被计算为来自上一层的点(i,j)处的8个不同卷积通道的密集组合


可能会有一些图片解释会很有用。

这很棘手,但它确实符合Keras在致密层上的文档

输出形状

nD
带形状的张量:
(批量大小,…,单位)
。例如,对于具有形状
(批次大小,输入尺寸)
的2D输入,输出将具有形状
(批次大小,单位)

注意这不是最清楚的,但是他们用
表示,输入形状的最终尺寸将被密集连接的数量所忽略。基本上,对于最终维度的每个项,创建到即将到来的密集层中每个请求的密集节点的连接

在你的情况下,你有一个2 x 3 x 1的东西。因此,有一个“东西”(2x3东西)连接到5个密集层节点中的每一个,hense 2x3 x5。在这种特殊情况下,你可以把它想象成CNN层的频道。5个输出“节点”中的每一个都有不同的2 x 3输出表

在纯二维情况下
(批量大小,单位)
。。。然后,由最终维度
units
迭代的每个项本身就是一个标量值,因此最终得到的值正好是所请求的密集节点数的大小

但在更高维度的情况下,您在输入的最终维度上迭代的每个项目本身仍然是一个更高维度的东西,因此输出是这些高维度东西的k个不同的“克隆”,其中k是请求的密集层大小,通过“克隆”我们的意思是单个密集连接的输出与输入的最终维度中的项具有相同的形状

然后,密集性意味着输出的每个特定元素都与相应输入集的每个元素有一个连接。但是要小心。密集层通过在输出的每个项目和输入的每个项目之间具有“一”连接来定义。因此,即使你的输出中有5个“2x3东西”,它们每个都只有一个单独的权重与它们关联,关于它们如何连接到作为输入的2x3东西。Keras也默认使用偏差向量(而非偏差张量),因此,如果致密层的维度为
k
,且前一层的最终维度为
n
,则应期望
(n+1)k
可训练参数。这些将始终与numpy-like广播一起使用,以使权重和偏移向量的较小维度形状符合输入张量的实际形状


如果您想要强制实施即将到来的密集层的确切大小,则通常使用第一个示例中的“展平”。当需要不同的“(n-1)D”组连接到每个密集节点时,可以使用多维密集层。这对于高维输入来说可能非常罕见,因为您通常需要CNN类型的操作,但我可以想象,在某些情况下,模型预测像素值,或者如果您生成完整的nD输出,比如从编码器-解码器网络的解码器部分,您可能需要一个密集的单元格数组,该数组与某些预期结构化输出类型(如图像或视频)的维度相匹配。

很抱歉,我稍后将删除coment,您的问题无法解决。但你们有任何文档说明为什么人们使用多维密集层吗?在实现本文的判别模型时,找不到我思考这个问题的文章。另一个用例可能是在您试图预测像素是否属于特定类别时对图像进行语义分割。比如,如果你必须给包含汽车的图像区域上色。然后你想知道图像每个像素的概率分布。为了更好地理解,接受答案的评论部分也值得一读。那么可训练的参数呢?在这两种情况下,致密层不应该相同吗?对于
density_2
层,它们是怎样的6?这就像你把大小为5的向量作为
densed_2
层的输入。你将如何将6个参数(5个权重1个偏差)与“2 x 3的东西”联系起来?我认为可训练的参数也有意义。在密集连接中,只有一个权重与连接到每个输出项的每个输入项相关联。只有1项输入(2 x 3)和5项输出(5项不同的2 x 3)。这意味着5个重量。此外,还有5个附加权重的偏差向量。在所有情况下,这些权重都通过广播处理,使其与形状一起工作。在最后一层中,您有5个输入和1个输出(5个权重)加上大小为1的偏差向量作为输出,因此有6个权重。我想我现在已经得到了它。这就像我们有一个2x3的矩阵,我们将它的每个元素乘以一个标量值(1个权重)。对于5个大小为2x3的矩阵,我们将5个标量(5个weigts)值乘以相应的矩阵。我说的对吗?是的,加上偏置向量的加法。基本上,
Dense
乐于将最终输入维度之前的所有内容视为
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 3, 4, 8)           40        
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 2, 3, 1)           33        
_________________________________________________________________
dense_1 (Dense)              (None, 2, 3, 5)           10        
_________________________________________________________________
dense_2 (Dense)              (None, 2, 3, 1)           6         
=================================================================
Total params: 89
Trainable params: 89