【问题标题】:Traning and Validation accuracy very low on Stanford Dogs Dataset斯坦福狗数据集上的训练和验证准确度非常低
【发布时间】:2020-10-24 03:28:22
【问题描述】:

使用 Stanford Dogs Dataset 时我的训练和验证非常低:https://www.kaggle.com/jessicali9530/stanford-dogs-dataset#:~:text=Over%2020%2C000%20images%20of%20120%20dog%20breeds&text=The%20Stanford%20Dogs%20dataset%20contains,of%20fine%2Dgrained%20image%20categorization.

我可以知道哪里出了问题以及如何提高我的验证准确性吗?谢谢

这是我的代码:

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import tensorflow_hub as hub

image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, rotation_range=40,
                                                                  width_shift_range=0.2, height_shift_range=0.2,
                                                                  shear_range=0.2, zoom_range=0.2, horizontal_flip=True,
                                                                  fill_mode="nearest", validation_split=0.1)
BATCH_SIZE = 32
STEPS_PER_EPOCH = np.ceil((20580*0.8)/BATCH_SIZE)

train_generator = image_generator.flow_from_directory(
        r"\119698_791828_bundle_archive\images\Images",
        target_size=(224, 224),
        batch_size=BATCH_SIZE,
        shuffle=True,
        class_mode='categorical',
        subset='training')

validation_generator = image_generator.flow_from_directory(
        r"\119698_791828_bundle_archive\images\Images",
        target_size=(224, 224),
        batch_size=BATCH_SIZE,
        shuffle=True,
        class_mode='categorical',
        subset='validation')

model = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer(input_shape=(224, 224, 3)),
    tf.keras.layers.Conv2D(16, (3, 3), activation="relu"),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Conv2D(32, (3, 3), activation="relu"),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Conv2D(64, (3, 3), activation="relu"),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(120, activation='softmax')
])

model.compile(optimizer="rmsprop",
              loss="categorical_crossentropy",
              metrics=['acc'])

model.fit(train_generator, validation_data=validation_generator, steps_per_epoch=STEPS_PER_EPOCH, epochs=15)

输出:

WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
Train for 515.0 steps, validate for 63 steps
Epoch 1/15
515/515 [==============================] - 502s 975ms/step - loss: 4.7840 - acc: 0.0166 - val_loss: 4.9392 - val_acc: 0.0154
Epoch 2/15
515/515 [==============================] - 268s 521ms/step - loss: 4.4950 - acc: 0.0354 - val_loss: 4.4074 - val_acc: 0.0423
Epoch 3/15
515/515 [==============================] - 314s 610ms/step - loss: 4.3337 - acc: 0.0550 - val_loss: 4.3654 - val_acc: 0.0562
Epoch 4/15
515/515 [==============================] - 266s 516ms/step - loss: 4.2299 - acc: 0.0658 - val_loss: 4.2559 - val_acc: 0.0627
Epoch 5/15
515/515 [==============================] - 231s 448ms/step - loss: 4.1500 - acc: 0.0743 - val_loss: 4.2295 - val_acc: 0.0732
Epoch 6/15
515/515 [==============================] - 232s 451ms/step - loss: 4.1103 - acc: 0.0815 - val_loss: 4.1339 - val_acc: 0.0881
Epoch 7/15
515/515 [==============================] - 229s 444ms/step - loss: 4.0634 - acc: 0.0860 - val_loss: 4.1033 - val_acc: 0.0841
Epoch 8/15
515/515 [==============================] - 233s 453ms/step - loss: 4.0332 - acc: 0.0914 - val_loss: 4.0654 - val_acc: 0.0986
Epoch 9/15
515/515 [==============================] - 237s 460ms/step - loss: 3.9903 - acc: 0.0911 - val_loss: 4.1224 - val_acc: 0.0876
Epoch 10/15
515/515 [==============================] - 249s 483ms/step - loss: 3.9787 - acc: 0.0985 - val_loss: 4.0670 - val_acc: 0.1050
Epoch 11/15
515/515 [==============================] - 250s 486ms/step - loss: 3.9668 - acc: 0.1014 - val_loss: 4.1024 - val_acc: 0.0836
Epoch 12/15
515/515 [==============================] - 453s 879ms/step - loss: 3.9535 - acc: 0.0999 - val_loss: 3.9681 - val_acc: 0.1025
Epoch 13/15
515/515 [==============================] - 375s 729ms/step - loss: 3.9728 - acc: 0.1033 - val_loss: 4.0681 - val_acc: 0.0996
Epoch 14/15
515/515 [==============================] - 530s 1s/step - loss: 3.9487 - acc: 0.1024 - val_loss: 3.9612 - val_acc: 0.1025
Epoch 15/15
515/515 [==============================] - 382s 741ms/step - loss: 3.9396 - acc: 0.1058 - val_loss: 3.9932 - val_acc: 0.1045

这是模型摘要:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None, 222, 222, 16)      448       
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 111, 111, 16)      0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 109, 109, 32)      4640      
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 54, 54, 32)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 52, 52, 64)        18496     
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 26, 26, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 43264)             0         
_________________________________________________________________
dense_4 (Dense)              (None, 1024)              44303360  
_________________________________________________________________
dropout_2 (Dropout)          (None, 1024)              0         
_________________________________________________________________
dense_5 (Dense)              (None, 120)               123000    
=================================================================
Total params: 44,449,944
Trainable params: 44,449,944
Non-trainable params: 0

另外,如何在训练模型时删除警告?谢谢大家。

编辑:我已经将模型训练了 15 个 epoch,但损失仍然几乎没有变化

WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
Train for 515.0 steps, validate for 63 steps
Epoch 1/15
515/515 [==============================] - 553s 1s/step - loss: 3.9552 - acc: 0.1045 - val_loss: 3.9564 - val_acc: 0.1075
Epoch 2/15
515/515 [==============================] - 266s 516ms/step - loss: 3.9427 - acc: 0.1017 - val_loss: 4.0370 - val_acc: 0.0921
Epoch 3/15
515/515 [==============================] - 266s 517ms/step - loss: 3.9321 - acc: 0.1054 - val_loss: 3.9974 - val_acc: 0.0921
Epoch 4/15
515/515 [==============================] - 289s 560ms/step - loss: 3.9282 - acc: 0.1077 - val_loss: 4.0145 - val_acc: 0.0961
Epoch 5/15
515/515 [==============================] - 334s 648ms/step - loss: 3.9279 - acc: 0.1049 - val_loss: 4.1821 - val_acc: 0.0811
Epoch 6/15
515/515 [==============================] - 387s 752ms/step - loss: 3.9530 - acc: 0.1079 - val_loss: 4.0147 - val_acc: 0.0971
Epoch 7/15
515/515 [==============================] - 408s 792ms/step - loss: 3.9587 - acc: 0.1035 - val_loss: 4.0351 - val_acc: 0.0966
Epoch 8/15
515/515 [==============================] - 246s 477ms/step - loss: 3.9525 - acc: 0.0999 - val_loss: 3.9847 - val_acc: 0.0946
Epoch 9/15
515/515 [==============================] - 254s 494ms/step - loss: 3.9628 - acc: 0.1030 - val_loss: 4.0428 - val_acc: 0.1025
Epoch 10/15
515/515 [==============================] - 237s 460ms/step - loss: 3.9671 - acc: 0.1047 - val_loss: 4.2874 - val_acc: 0.0951
Epoch 11/15
515/515 [==============================] - 228s 444ms/step - loss: 3.9597 - acc: 0.1032 - val_loss: 4.4911 - val_acc: 0.0971
Epoch 12/15
515/515 [==============================] - 248s 481ms/step - loss: 3.9674 - acc: 0.1052 - val_loss: 4.0222 - val_acc: 0.0966
Epoch 13/15
515/515 [==============================] - 255s 496ms/step - loss: 3.9799 - acc: 0.0986 - val_loss: 4.1341 - val_acc: 0.0836
Epoch 14/15
515/515 [==============================] - 255s 495ms/step - loss: 3.9978 - acc: 0.0968 - val_loss: 4.2690 - val_acc: 0.0762
Epoch 15/15
515/515 [==============================] - 254s 493ms/step - loss: 3.9963 - acc: 0.0990 - val_loss: 4.1857 - val_acc: 0.0772

【问题讨论】:

  • 我希望您完全熟悉 flow_from_directory 方法,或者您应该再次查看 keras 文档中的方法,特别是该方法所需的顺序或目录
  • 我的 flow_from_directory 方法有什么问题?
  • 你只训练了 15 个 epoch,而且 loss 还在减少,你需要训练模型足够的 epoch,让 loss 达到它的最小值(收敛),看起来绝对没有意义损失收敛之前的准确度。
  • @Dr.Snoopy 嗨,感谢您花时间帮助我解决问题。我已经对该模型进行了 15 个以上的训练,但损失似乎几乎没有变化。我可以做些什么来帮助改进模型?谢谢:)
  • 也有可能是模型对数据来说太简单了,Dogs 数据集需要非常细粒度的分类,一个简单的模型将无法做到这样的事情,多尝试更深层次的模型,例如 ResNet 或 VGG 网络。

标签: python tensorflow keras deep-learning tensorflow2.0


【解决方案1】:

我相信你的模型不够复杂。我会强烈建议使用MobileNet模型传输学习。您的型号有4400万个参数,因此是计算密集的。 MobileNet模型只有400万个参数,因此它更快。使用MobileNet的文档是[这里。] [1]我还建议使用可调的学习率。 Keras回调Reducelronplateau提供了一种简单的方法来做到这一点。文档是[这里。] [2]将其设置为监视验证损耗,并将学习率降低为0.8如果无法减少。最后我建议使用keras回调modelcheckpoint。文档是[这里。] [3]设置它以监控验证丢失并保存具有最低损耗的模型。然后使用该模型对测试集进行预测。最后我建议使用adamax。文档是[这里。] [4]。使用004的初始学习率。下面的代码显示了使用MobileNet的安装程序。

size=len(classes)
    mobile = tf.keras.applications.mobilenet.MobileNet( include_top=False,
                                                           input_shape=(image_size,image_size,3),
                                                           pooling='avg', weights='imagenet',
                                                           alpha=1, depth_multiplier=1)
    x=mobile.layers[-1].output
    x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x)
    predictions=Dense (len(classes), activation='softmax')(x)
    model = Model(inputs=mobile.input, outputs=predictions)    
    for layer in model.layers:
        layer.trainable=True
    model.compile(Adamax(lr=lr_rate), loss='categorical_crossentropy', metrics=['accuracy'])



  [1]: https://keras.io/api/applications/mobilenet/
  [2]: https://keras.io/api/callbacks/reduce_lr_on_plateau/
  [3]: https://keras.io/api/callbacks/model_checkpoint/
  [4]: https://keras.io/api/optimizers/adamax/

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多