Как добавить пул слой на модель керас? - PullRequest
0 голосов
/ 06 ноября 2019

Я загружаю нейронную сеть с помощью tenorflow и colab notbook от Google. Я удалил полностью связанный слой выходного слоя и добавил еще один полностью связанный только с одним нейроном, и я заморозил другой слой. Я использую tf.keras.application.MobileNetV2, и я использую mledu-datasets/cats_and_dogs. Я хочу тренировать только этот добавленный выходной слой, но я получаю «ошибку». Я предполагаю, что мне нужно добавить слой Pooling используя

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

model = tf.keras.applications.mobilenet_v2.MobileNetV2(input_shape=(IMG_HEIGHT, IMG_WIDTH ,3), alpha=1.0, include_top=False, weights='imagenet', input_tensor=None , pooling='max', classes=2)
model.summary()
penultimate_layer = model.layers[-2]  # layer that you want to connect your new FC layer to 
new_top_layer = tf.keras.layers.Dense(1)(penultimate_layer.output) # create new FC layer and connect it to the rest of the model
new_model = tf.keras.models.Model(model.input, new_top_layer)  # define your new model


ultima_layer = new_model.layers[-1]
new_new_top_layer = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)


new_new_model = tf.keras.models.Model(new_model.input, new_new_top_layer)

Наконец, чтобы заморозить веса всех слоев до того, как последний только что сделал:

for layer in new_model.layers[:-2]:
    layer.trainable = False
new_model.layers[-1].trainable = True

Для обучения:

new_model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])


history = new_model.fit_generator(
    train_data_gen,
    steps_per_epoch = total_train // batch_size,
    epochs = epochs,
    validation_data = val_data_gen,
    validation_steps = total_val // batch_size
)

Я получаю следующую ошибку

AttributeError                            Traceback (most recent call last)

<ipython-input-18-05a947aac1cd> in <module>()
      8 ultima_layer = new_model.layers[-1]
      9 new_new_top_layer = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
---> 10 new_new_model = tf.keras.models.Model(new_model.input, new_new_top_layer)
     11 
     12 # tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

5 frames

/tensorflow-2.0.0/python3.6/tensorflow_core/python/keras/engine/base_layer_utils.py in _create_keras_history_helper(tensors, processed_ops, created_layers)
    208     if getattr(tensor, '_keras_history', None) is not None:
    209       continue
--> 210     op = tensor.op  # The Op that created this Tensor.
    211     if op not in processed_ops:
    212       # Recursively set `_keras_history`.

AttributeError: 'AveragePooling2D' object has no attribute 'op'

Спасибо

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Это может помочь. Я добавил PoolingLayer перед составлением новой модели, подобной этой, и не получил ошибку, которую вы видите. Надеюсь, это поможет:

new_top_layer = tf.keras.layers.Dense(1)(penultimate_layer.output) # create new FC layer and connect it to the rest of the model
new_new_top_layer = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)(new_top_layer)
new_model = tf.keras.models.Model(inputs=model.input, outputs=new_new_top_layer)  # define your new model
0 голосов
/ 06 ноября 2019

Вы можете передать аргумент pooling='avg' при создании экземпляра MobileNetV2, чтобы получить глобально среднее значение пула в последнем слое (поскольку ваша модель исключает верхний слой). Так как это проблема двоичной классификации, ваш последний / выходной слой должен иметь плотный слой с функцией активации одного узла и сигмоида. Таким образом, вы можете добавить последний / выходной Dense слой с одним узлом и передать выходные данные базовой модели следующим образом.

model = tf.keras.applications.mobilenet_v2.MobileNetV2(input_shape=(IMG_HEIGHT, IMG_WIDTH, 3), alpha=1.0, include_top=False, weights='imagenet', input_tensor=None , pooling='avg', classes=2)
# model.summary()
penultimate_layer = model.layers[-1]  # layer that you want to connect your new FC layer to
new_top_layer = tf.keras.layers.Dense(1, activation='sigmoid')(penultimate_layer.output) # create new FC layer and connect it to the rest of the model
new_model = tf.keras.models.Model(model.input, new_top_layer)  # define your new model
print(new_model.summary())

Надеюсь, это поможет.

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