当前位置: 首页 > 知识库问答 >
问题:

更改Keras层输出形状

公良飞尘
2023-03-14

我正在开发一个程序,该程序用一个无方向的Conv2D层(跨距=1)替换跨距的Conv2D层(跨距=2),然后在激活层之后添加一个AveragePooling2D层(跨距=2)。换句话说,AveragePooling2D层将减少输出维度,而不是让Conv2D层减少输出维度。

我使用本文中描述的方法将Conv2D层替换为非结构化版本,并在激活后插入averagepoolig2d层。替换Conv2D层效果很好。问题是,激活层的新输出将具有与以前不同的形状。这篇文章解释说,“多重”输出形状是因为现在有两个输出节点连接到激活层,一个是跨步卷积中的旧形状,另一个是无边卷积中的新形状。

下面是说明问题的代码:

# Origninal model with strided convolution
inp = tf.keras.layers.Input((32,32,3))
x = tf.keras.layers.Conv2D(filters=1,kernel_size=3,strides=2, padding='same')(inp)
x = tf.nn.relu(x)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(units=10, activation='linear')(x)
outp = x
model = tf.keras.models.Model(inp,outp)

# Clone original model in order to modify the clone
model_clone = tf.keras.models.clone_model(model)

# Customize the cloned model - this function is where the convolution
# is replaced and the average pooling layer is added
model_custom = MyCustomFunction(model_clone)

原始模型概述:

Model: "model_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 32, 32, 3)]       0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 16, 16, 1)         28        
_________________________________________________________________
tf.nn.relu_1 (TFOpLambda)    (None, 16, 16, 1)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 1)                 0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                20        
=================================================================
Total params: 48
Trainable params: 48
Non-trainable params: 0
_________________________________________________________________

model\u自定义摘要:

Model: "model_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 32, 32, 3)]       0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 32, 32, 1)         28        
_________________________________________________________________
tf.nn.relu_2 (TFOpLambda)    multiple                  0         
_________________________________________________________________
average_pooling2d (AveragePo (None, 16, 16, 1)         0         
_________________________________________________________________
global_average_pooling2d_2 ( (None, 1)                 0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                20        
=================================================================
Total params: 48
Trainable params: 48
Non-trainable params: 0
_________________________________________________________________

当我尝试训练新model_custom时,我收到这个错误:

InvalidArgumentError:  logits and labels must have the same first dimension, got logits shape [32768,1] and labels shape [32]

我认为这是因为它仍在查看激活层的旧输出形状(None,16,16,1),而不是新的输出形状(None,32,32,1)。

以下是我用于培训的代码,仅供参考:

model_custom.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model_custom.fit(train_images, train_labels, epochs=2,
                    validation_data=(test_images, test_labels))

当我将相同的代码应用于原始模型时,它可以正常工作。

任何帮助将不胜感激!

共有1个答案

宇文俊风
2023-03-14

否,错误InvalidArgumentError:logits和labels必须具有相同的第一个维度,got logits shape[32768,1]和labels shape[32]与模型架构无关,而是因为批次大小维度。请参阅此。

您输入了形状[32768,1]的模型数据,而您应用的损失需要[32]的形状,以单独进行热编码。

 类似资料:
  • 我不明白为什么通道维度不包含在Keras中con2D层的输出维度中。 我有以下型号 我的问题末尾给出了模型摘要。输入层获取宽度为128、高度为128的RGB图像。第一个conv2D层告诉我输出维度是(None、61、61、24)。我使用的内核大小是(8,8),跨步是(2,2),没有填充。值61=下限((128-8 2 x 0)/2 1)和24(内核/过滤器的数量)是有意义的。但为什么维度中不包括不

  • 在模型中添加LSTM层之前,我不确定是否需要添加密集输入层。例如,使用以下模型: LSTM层是否为输入层,密集层是否为输出层(即无隐藏层)?或者Keras是否创建了一个输入层,这意味着LSTM层将是一个隐藏层?

  • 我在Keras建立了一个卷积神经网络。 根据CS231讲座,卷积操作为每个过滤器创建一个特征映射(即激活映射),然后将其堆叠在一起。在我的例子中,卷积层有一个300维的输入。因此,我预计会进行以下计算: 每个过滤器的窗口大小为5。因此,每个滤波器产生300-5 1=296个卷积 但是,实际输出形状看起来不同: 偏移值的形状很有意义,因为每个过滤器都有一个偏移值。然而,我不了解重量的形状。显然,第一

  • 问题内容: 我拥有的代码(我无法更改)将Resnet与input_tensor一起使用。 研究源代码,ResNet50函数使用创建一个新的keras输入层,然后创建模型的其余部分。这是我要用自己的模型复制的行为。我从h5文件加载我的模型。 由于此模型已经具有输入层,因此我想用定义的新输入层替换它。 如何替换输入层? 问题答案: 使用以下方法保存模型时: 它将保存以下内容: 模型的体系结构,允许创建

  • 我有一个关于tf的问题。图层。conv3d。如果我理解正确,它需要输入形状 (批次x深度x高度x宽度x通道) 其中通道应该只有一个;给定一个过滤器(深度x高度x宽度),它创建#个过滤器相同形状的不同过滤器以创建#个过滤器输出通道并将它们与输入卷积以获得形状的输出 (批次x out\u深度x out\u高度x out\u宽度x num\u过滤器) 首先,我现在是对的吗?问题是:在我看来,这一层不符合

  • 本文向大家介绍keras 获取某层输出 获取复用层的多次输出实例,包括了keras 获取某层输出 获取复用层的多次输出实例的使用技巧和注意事项,需要的朋友参考一下 官方文档很全面,搜索功能也很好。但是如果你想单独实现某个功能,根本无从搜寻。于是我写了这个笔记。从功能出发。 两个tensor经过一个layer实例会产生两个输出。 这个代码有错误,因为最后一行没有指定lstm这个layer实例的那个输