【问题标题】:Constant Validation Accuracy with a high loss in machine learning机器学习损失高的恒定验证精度
【发布时间】:2019-03-07 00:38:19
【问题描述】:

我目前正在尝试使用具有 2 个类的 Inception V3 创建图像分类模型。我有 1428 张图像,它们的比例约为 70/30。当我运行我的模型时,我得到了相当高的损失以及恒定的验证准确度。什么可能导致这个恒定值?

data = np.array(data, dtype="float")/255.0
labels = np.array(labels,dtype ="uint8")

(trainX, testX, trainY, testY) = train_test_split(
                            data,labels, 
                            test_size=0.2, 
                            random_state=42) 

img_width, img_height = 320, 320 #InceptionV3 size

train_samples =  1145 
validation_samples = 287
epochs = 20

batch_size = 32

base_model = keras.applications.InceptionV3(
        weights ='imagenet',
        include_top=False, 
        input_shape = (img_width,img_height,3))

model_top = keras.models.Sequential()
model_top.add(keras.layers.GlobalAveragePooling2D(input_shape=base_model.output_shape[1:], data_format=None)),
model_top.add(keras.layers.Dense(350,activation='relu'))
model_top.add(keras.layers.Dropout(0.2))
model_top.add(keras.layers.Dense(1,activation = 'sigmoid'))
model = keras.models.Model(inputs = base_model.input, outputs = model_top(base_model.output))


for layer in model.layers[:30]:
  layer.trainable = False

model.compile(optimizer = keras.optimizers.Adam(
                    lr=0.00001,
                    beta_1=0.9,
                    beta_2=0.999,
                    epsilon=1e-08),
                    loss='binary_crossentropy',
                    metrics=['accuracy'])

#Image Processing and Augmentation 
train_datagen = keras.preprocessing.image.ImageDataGenerator(
          zoom_range = 0.05,
          #width_shift_range = 0.05, 
          height_shift_range = 0.05,
          horizontal_flip = True,
          vertical_flip = True,
          fill_mode ='nearest') 

val_datagen = keras.preprocessing.image.ImageDataGenerator()


train_generator = train_datagen.flow(
        trainX, 
        trainY,
        batch_size=batch_size,
        shuffle=True)

validation_generator = val_datagen.flow(
                testX,
                testY,
                batch_size=batch_size)

history = model.fit_generator(
    train_generator, 
    steps_per_epoch = train_samples//batch_size,
    epochs = epochs, 
    validation_data = validation_generator, 
    validation_steps = validation_samples//batch_size,
    callbacks = [ModelCheckpoint])

这是我运行模型时的日志:

Epoch 1/20
35/35 [==============================]35/35[==============================] - 52s 1s/step - loss: 0.6347 - acc: 0.6830 - val_loss: 0.6237 - val_acc: 0.6875

Epoch 2/20
35/35 [==============================]35/35 [==============================] - 14s 411ms/step - loss: 0.6364 - acc: 0.6756 - val_loss: 0.6265 - val_acc: 0.6875

Epoch 3/20
35/35 [==============================]35/35 [==============================] - 14s 411ms/step - loss: 0.6420 - acc: 0.6743 - val_loss: 0.6254 - val_acc: 0.6875

Epoch 4/20
35/35 [==============================]35/35 [==============================] - 14s 414ms/step - loss: 0.6365 - acc: 0.6851 - val_loss: 0.6289 - val_acc: 0.6875

Epoch 5/20
35/35 [==============================]35/35 [==============================] - 14s 411ms/step - loss: 0.6359 - acc: 0.6727 - val_loss: 0.6244 - val_acc: 0.6875

Epoch 6/20
35/35 [==============================]35/35 [==============================] - 15s 415ms/step - loss: 0.6342 - acc: 0.6862 - val_loss: 0.6243 - val_acc: 0.6875

【问题讨论】:

  • 如果您还没有对图像进行标准化,则将rescale=1/255. 传递给ImageDataGenerator 实例,看看是否有帮助。
  • 尝试从 Keras 添加 ReduceLearningRate 回调
  • 我已经按照以下方式规范了我的数据,这是否正确?数据 = np.array(data, dtype="float")/255.0
  • 我不确定,但也许this answer 可以帮助你。此外,当您在 cmets 部分回复特定用户时,请在评论开头使用@their_username 通知他们。我没有收到您的回复通知。是的,你做的归一化是正确的。
  • 要注意的关键是您的 val_loss 正在减少。所以你的网络正在慢慢学习,但还不足以调整它的任何预测,这就是准确性没有改变的原因。尝试提高你的学习率,也许像其他人建议的那样l=0.001

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

您的准确率为 68.25%。鉴于您的类被分成大约 70/30,很可能您的模型每次都只是预测相同的事情,而忽略了输入。这将给出您所看到的准确性。您的模型尚未从您的数据中学习。

正如诺瓦克所说,你的学习率似乎很低,所以不妨先尝试增加它,看看是否有帮助。

【讨论】:

    【解决方案2】:

    我认为你的学习率太低,epoch 太少。试试lr = 0.001epochs = 100

    【讨论】:

    • 这对我来说似乎也是最好的第一种方法。首先尝试不同的学习率。 lr=0.00001 的学习率可能太小,导致损失下降非常缓慢(您所说的“恒定”)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2019-11-10
    • 2019-01-12
    • 2017-05-17
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多