验证准确性静态和验证损失增加Keras Resnet50转移学习

时间:2019-09-29 02:47:50

标签: python keras deep-learning resnet transfer-learning

我目前正在尝试使用转移学习,使用冻结的renset50模型(具有来自imagenet的权重)在cifar10数据集上训练cnn。

使用此代码:

import keras
from keras import optimizers
import numpy as np
from keras.optimizers import SGD
from keras.datasets import cifar10
from keras.applications.resnet50 import ResNet50
from keras.layers import GlobalAveragePooling2D, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from skimage.transform import resize
from IPython import embed

NUM_CLASSES = 10
BATCH_SIZE = 256
NUM_EPOCHS = 15

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, NUM_CLASSES)
y_test = keras.utils.to_categorical(y_test, NUM_CLASSES)

# Normalize the data
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

base_model = ResNet50(include_top=False, weights='imagenet')

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

# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(64, activation='relu')(x)
x = Dropout(0.5)(x)
# and a logistic layer -- 10 classes for CIFAR10
x = Dense(64, activation='relu')(x)
predictions = Dense(NUM_CLASSES, activation='softmax')(x)

# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)

# Let's train the model using RMSprop
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=BATCH_SIZE, epochs=NUM_EPOCHS, validation_data=(x_test, y_test), shuffle=False)

这是训练输出:

Train on 50000 samples, validate on 10000 samples
Epoch 1/15
50000/50000 [==============================] - 162s 3ms/step - loss: 0.3966 - acc: 0.8868 - val_loss: 0.3543 - val_acc: 0.9000
Epoch 2/15
50000/50000 [==============================] - 151s 3ms/step - loss: 0.3520 - acc: 0.8959 - val_loss: 0.3429 - val_acc: 0.9000
Epoch 3/15
50000/50000 [==============================] - 152s 3ms/step - loss: 0.3393 - acc: 0.8979 - val_loss: 0.3385 - val_acc: 0.9000
Epoch 4/15
50000/50000 [==============================] - 151s 3ms/step - loss: 0.3334 - acc: 0.8987 - val_loss: 0.3365 - val_acc: 0.9000
Epoch 5/15
50000/50000 [==============================] - 152s 3ms/step - loss: 0.3286 - acc: 0.8991 - val_loss: 0.3356 - val_acc: 0.9000
Epoch 6/15
50000/50000 [==============================] - 151s 3ms/step - loss: 0.3251 - acc: 0.8994 - val_loss: 0.3349 - val_acc: 0.9000
Epoch 7/15
50000/50000 [==============================] - 150s 3ms/step - loss: 0.3223 - acc: 0.8994 - val_loss: 0.3345 - val_acc: 0.9000
Epoch 8/15
50000/50000 [==============================] - 152s 3ms/step - loss: 0.3194 - acc: 0.8995 - val_loss: 0.3341 - val_acc: 0.9000
Epoch 9/15
50000/50000 [==============================] - 151s 3ms/step - loss: 0.3175 - acc: 0.8996 - val_loss: 0.3338 - val_acc: 0.9000
Epoch 10/15
50000/50000 [==============================] - 153s 3ms/step - loss: 0.3151 - acc: 0.8997 - val_loss: 0.3337 - val_acc: 0.9000
50000/50000 [==============================] - 153s 3ms/step - loss: 0.3132 - acc: 0.8997 - val_loss: 0.3337 - val_acc: 0.9000
Epoch 12/15
50000/50000 [==============================] - 153s 3ms/step - loss: 0.3107 - acc: 0.8998 - val_loss: 0.3339 - val_acc: 0.9000
Epoch 13/15
50000/50000 [==============================] - 157s 3ms/step - loss: 0.3089 - acc: 0.8998 - val_loss: 0.3341 - val_acc: 0.9000
Epoch 14/15
50000/50000 [==============================] - 155s 3ms/step - loss: 0.3070 - acc: 0.8998 - val_loss: 0.3342 - val_acc: 0.9000
Epoch 15/15
50000/50000 [==============================] - 154s 3ms/step - loss: 0.3056 - acc: 0.8998 - val_loss: 0.3346 - val_acc: 0.9000

损耗在减少,准确性在提高。但是,直到第13个时期,验证损失才开始减少,验证准确性完全没有改变!

在第13个时期可能导致验证损失逆转的原因是什么,为什么验证准确性是静态的?

任何帮助都会很棒!

0 个答案:

没有答案