【问题标题】:Math Operator or tf.function - Which one should be used?数学运算符或 tf.function - 应该使用哪一个?
【发布时间】:2020-07-03 03:47:58
【问题描述】:

我正在尝试实现一个模型,就像我给出的这段代码

input_tensor = Input(shape=(256, 256, 3))
base_model = VGG16(input_tensor=input_tensor,weights='imagenet',pooling=None, include_top=False)

x = base_model.output

x = GlobalAveragePooling2D()(x)

x = tf.math.reduce_max(x,axis=0,keepdims=True)

x = Dense(512,activation='relu')(x)

output_1 = Dense(3, activation='sigmoid')(x)

sagittal_model_abn = Model(inputs=base_model.input, outputs=output_1)

for layer in base_model.layers:
    layer.trainable = True

在这段代码中,我使用tf.math.reduce_max 对批处理中的样本取最大值。

如果此tf.math.reduce_max 的输入形状为 (16,6,6,512),则输出为 (1,6,6,512)

对帧进行最大池化是所需的操作。我使用的 16 帧具有相同的标签,即 16 帧构成批次的单个样本。

axis=0 上的最大池化,即在帧上,是我的模型需要做的事情。

这使得批量大小有效地为 1。但由于我无法将 5D 张量提供给模型,所以我将批量大小保持为 1 并将 4D 张量提供给模型,因为我使用的是 2D CNN。

现在,数据集是一个多标签数据集。所以我在最后一层使用 sigmoid 激活和二元交叉熵损失。

但是出现的问题是,对于所有样本,模​​型的所有预测在每次迭代中都在 0.49-0.51 的范围内。

[0.50119835 0.5004604  0.49988952]
[0.501212   0.5004502  0.49987414]
[0.50122344 0.5004629  0.49987343]

这表明模型没有学习任何东西。

这是因为我使用了tf.math.reduce_max 运算符吗?是否应该使用@tf.function 进行同样的操作来解决这个问题?

我正在使用初始 LR 为 0.00001 的 Adam 优化器。

学习率很小,因为我正在微调预训练的 VGG 网络。

【问题讨论】:

    标签: python tensorflow keras deep-learning neural-network


    【解决方案1】:

    这可能是因为您正在使用 tf.math.reduce_max()。正如您所提到的,此方法转换形状为 (16, 6, 6, 512) => (1, 6, 6, 512) 的张量。 由于这个形状的第一个暗淡是 BatchSize (batchsize, imgShape1, imgshape2, numOfFilters)

    您的模型的小总结如下:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
    _________________________________________________________________
    block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
    _________________________________________________________________
    
    -------
    -------
    _________________________________________________________________
    block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
    _________________________________________________________________
    block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
    _________________________________________________________________
    tf_op_layer_Max (TensorFlowO [(1, 7, 7, 512)]          0         
    _________________________________________________________________
    global_average_pooling2d (Gl (1, 512)                  0         
    _________________________________________________________________
    dense (Dense)                (1, 512)                  262656    
    _________________________________________________________________
    dense_1 (Dense)              (1, 3)                    1539      
    =================================================================
    Total params: 14,978,883
    Trainable params: 14,978,883
    Non-trainable params: 0
    _________________________________________________________________
    

    现在您知道,一批 16 个(在您的情况下)意味着有 16 个不同的图像对应于不同的类,并且在您应用 方法之后,这批 16 个图像压缩到一个图像。现在,您如何使用一个标签对 16 个不同的图像进行分类。你的完整模型应该保持 batch_size 暗淡

    dense_1 (Dense)              (None, 3)           *****
    

    而不是

    dense_1 (Dense)              (1, 3)               ****
    

    您可以将 reduce_max 方法应用于其他暗淡(axis=1 或 2 或 3),但不建议用于批量暗淡。

    希望你能明白。

    【讨论】:

    • 其实我想做那个操作。我的目标是对帧进行最大池化。这 16 个帧属于同一类,而我的实际 batch_size 是 1。因为,我无法提供 5D 张量,所以我采用 batch_size = 1 并提供 4D 张量,并在帧上进行最大池化是此处所需的操作
    • 如果你的实际 batch_size 是 1,那么做 reduce_max 的意义何在,它会给出相同的输出。
    • 在batch的每个样本中,有16帧。我想对帧进行最大池化。 16帧构成一个样本
    • 抱歉没有先说清楚。请阅读我的问题。我已经编辑了问题以使事情更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多