Статическая точность валидации и увеличение потерь валидации Keras Resnet50 Transfer Learning - PullRequest
0 голосов
/ 29 сентября 2019

В настоящее время я пытаюсь использовать трансферное обучение для обучения cnn в наборе данных cifar10 с использованием замороженной модели renset50 с весами из imagenet.

Используя этот код:

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-й эпохе и почему статическая точность проверки является статической??

Любая помощь будет потрясающей!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...