【问题标题】:When I train a VGG with tensorflow 2.0, why my accuracy do not increase and only stay about 25%当我用 tensorflow 2.0 训练 VGG 时,为什么我的准确率没有提高,只保持在 25% 左右
【发布时间】:2021-09-10 04:25:57
【问题描述】:
def get_model():
    gmodel=Sequential([

        Conv2D(64, (3, 3), activation='relu', input_shape=(256,256,3)),
        Conv2D(64,(3,3),activation='relu'),
        MaxPooling2D((1,1),strides=2,padding='same'),
        Conv2D(128, (3, 3), activation='relu'),
        Conv2D(128, (3, 3), activation='relu'),
        MaxPooling2D((1,1), strides=2, padding='same'),
        Conv2D(256, (3, 3), activation='relu'),
        Conv2D(256, (3, 3), activation='relu'),
        MaxPooling2D((1,1), strides=2, padding='same'),
        Conv2D(512, (3, 3), activation='relu'),
        Conv2D(512, (3, 3), activation='relu'),
        MaxPooling2D((1,1), strides=2, padding='same'),
        Conv2D(512, (3, 3), activation='relu'),
        Conv2D(512, (3, 3), activation='relu'),
        MaxPooling2D((1,1), strides=2, padding='same'),
        Flatten(),
        Dense(4, activation='softmax')

])


    return gmodel
model=get_model()
model.compile(
optimizer=tf.keras.optimizers.Adam(0.0001),
loss="sparse_categorical_crossentropy",
metrics=['accuracy']
)
history=model.fit(train,epochs=5)

我想使用 VGG 模型将图片分类为 4 类,但准确率始终在 25% 左右。我检查了图片和标签,它们都是正确的,我也尝试了其他一些模型和优化器,但准确性也没有太大的提高。我该怎么办。我的 GPU 是 2070,tensorflow 是 2.0,python 是 3.6

【问题讨论】:

    标签: machine-learning deep-learning computer-vision tensorflow2.0 vgg-net


    【解决方案1】:

    更好地诊断问题的一种方法是尝试了解模型选择的最佳选择,以及第二、第三和第四选择,以及与每个选择相关的概率。为此,我建议添加一个额外的损失函数,告诉您第二个选择的正确频率。这也可能为您提供有关是否出现问题的更多信息。

    这是我使用过的一些代码:

        optimizer = tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE, epsilon=1e-08, clipnorm=1.0)
        loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
        metric_top_sparse = tf.keras.metrics.SparseTopKCategoricalAccuracy(k=1, name="sparse_top_1_acc", dtype=None)
        metric_top2_sparse = tf.keras.metrics.SparseTopKCategoricalAccuracy(k=2, name="sparse_top_2_acc", dtype=None)
    

    【讨论】:

    • 当我使用第二个和第三个损失时,它表明 TypeError: call() 需要 2 个位置参数,但给出了 3 个
    • 你可以把它们放在度量函数中而不是在损失函数中查看它们。见如下:model.compile(optimizer=optimizer, loss=loss, metrics=[metric_top_sparse, metric_top2_sparse])
    【解决方案2】:

    在图像分类问题中没有获得良好准确性的最常见原因是数据量较少。因此,您必须使用预训练的 VGG-16 模型来获得良好的准确性。像这样:

    from tensorflow.keras.applications.vgg16 import VGG16
    from tensorflow.keras import layers
    
    vgg = VGG16(input_shape = (256, 256, 3), include_top = False, weights = "imagenet")
    
    for layer in vgg.layers:
      layer.trainable = False
    
    x = layers.Flatten()(vgg.output)
    x = layers.Dense(1024, activation = 'relu')(x)
    x = layers.Dense(4, activation = 'softmax')(x)
    
    model = Model(vgg.input, x)
    
    model.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics=['acc'])
    history = model.fit(train, epochs = 10, verbose=1)
    

    请根据需要更改上述代码的超参数,尤其是输入形状。另请注意,这些预训练模型需要互联网连接才能下载权重。

    【讨论】:

    • 当我训练这个模型时,准确率在下降。我认为可能是我的代码的某些部分有错误,但我不确定
    • 你在分类什么图片?请给我完整的代码。
    • 如何给你代码和图片。对不起,我是菜鸟
    • 如何在 stackoverflow 中为您提供数据集和完整代码。对不起,我是菜鸟用户
    【解决方案3】:

    池化层

    MaxPooling2D((1,1),strides=2,padding='same')
    

    导致信息丢失。池化窗口小于步幅。这基本上是通过丢弃每个备用像素上的信息来工作的。所以,这可能是模型没有学习的原因。 只需将池化层更改为:

    MaxPooling2D((2, 2), strides=2, padding='SAME')
    

    可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2019-08-31
      • 2020-10-25
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      相关资源
      最近更新 更多