Попытка использовать переносное обучение с Re sNet не удалась в Tensorflow2 - PullRequest
0 голосов
/ 10 июля 2020

Я обучаю модель сегментации, используя обучение передачи с помощью Tensorflow 2 и Keras.

У меня есть изображения (1 канал в оттенках серого) и маски (двоичные). Я должен иметь возможность воспроизвести маску для данного изображения.

И изображения, и маски имеют формы (256, 256).

Вот тепловая карта типичной маски при преобразовании в numpy массив, чтобы дать вам представление:

введите описание изображения здесь

Я использую генераторы данных Keras с увеличением данных.

Мой код следующий:

train_datagen = ImageDataGenerator(preprocessing_function = tensorflow.keras.applications.resnet_v2.preprocess_input,
        rescale=1./255,
        shear_range=0.1,
        zoom_range=0.1,
        horizontal_flip= True)
        
val_datagen = ImageDataGenerator(rescale=1./255)


test_datagen = ImageDataGenerator(rescale=1./255)

train_image_generator = train_datagen.flow_from_dataframe(
dataframe = train_examples_df,
x_col = 'images',
batch_size = 2,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)

train_mask_generator = train_datagen.flow_from_dataframe(
dataframe = val_examples_df,
x_col = 'masks',
batch_size = 2,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)

val_image_generator = val_datagen.flow_from_dataframe(
dataframe = train_examples_df,
x_col = 'images',
batch_size = 2,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)


val_mask_generator = val_datagen.flow_from_dataframe(
dataframe = val_examples_df,
x_col = 'masks',
batch_size = 2,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)


test_image_generator = test_datagen.flow_from_dataframe(
dataframe = test_examples_df,
x_col = 'images',
batch_size = 1,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)


test_mask_generator = test_datagen.flow_from_dataframe(
dataframe = test_examples_df,
x_col = 'masks',
batch_size = 1,
target_size=(256,256),
class_mode = None,
    shuffle = False
#class_mode='categorical'
)

train_gen = zip(train_image_generator, train_mask_generator)

val_gen = zip(val_image_generator, val_mask_generator)

test_gen = zip(test_image_generator, test_mask_generator)

Затем мой код для определения модели, компиляции это, и обучение его выглядит следующим образом:

base_model = InceptionResNetV2(include_top= False, input_shape = (256, 256, 3))

x = base_model.output

x = GlobalMaxPooling2D()(x)

x = Dense(256**2, activation = 'relu')(x)

preds = Reshape((256, 256, 1))(x)

model = Model(inputs = base_model.input, outputs = preds)

model.compile(optimizer = 'Adam', loss= 'binary_crossentropy', metrics = ['accuracy'])

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

NO_OF_TRAINING_IMAGES = len(os.listdir('data\\train_frames'))
NO_OF_VAL_IMAGES = len(os.listdir('data\\val_frames'))

NO_OF_EPOCHS = 10

BATCH_SIZE = 2

results = model.fit_generator(train_gen, epochs=NO_OF_EPOCHS, 
                          steps_per_epoch = (NO_OF_TRAINING_IMAGES//BATCH_SIZE),
                          validation_data=val_gen, 
                          validation_steps=(NO_OF_VAL_IMAGES//BATCH_SIZE))

В результате получается следующий результат:

Train for 276 steps, validate for 79 steps
Epoch 1/10
276/276 [==============================] - 241s 874ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0036 - val_accuracy: 0.9852
Epoch 2/10
276/276 [==============================] - 236s 856ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0034 - val_accuracy: 0.9852
Epoch 3/10
276/276 [==============================] - 238s 861ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0033 - val_accuracy: 0.9852
Epoch 4/10
276/276 [==============================] - 247s 894ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0033 - val_accuracy: 0.9852
Epoch 5/10
276/276 [==============================] - 255s 924ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0032 - val_accuracy: 0.9852
Epoch 6/10
276/276 [==============================] - 249s 904ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0031 - val_accuracy: 0.9852
Epoch 7/10
276/276 [==============================] - 252s 912ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0031 - val_accuracy: 0.9852
Epoch 8/10
276/276 [==============================] - 243s 882ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852
Epoch 9/10
276/276 [==============================] - 251s 908ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852
Epoch 10/10
276/276 [==============================] - 242s 878ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852

Эта модель оказывается неспособной воспроизвести шаблон.

Более того , Я не могу понять потери и точность, которые он сообщает в наборе поезда. Потеря отрицательная? Точность 0?

...