【TF2.0-CNN】迁移学习(将inceptionV3应用到猫狗分类)

【准备】

【例1】

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf

local_weights_file = '/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'

pre_trained_model = tf.keras.applications.inception_v3.InceptionV3(input_shape=(150, 150, 3),
                                include_top=False,
                                weights=None)

pre_trained_model.load_weights(local_weights_file)
for layer in pre_trained_model.layers:
    layer.trainable = False

last_layer = pre_trained_model.get_layer('mixed7')
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output
x = tf.keras.layers.Flatten()(last_output)
x = tf.keraslayers.Dense(1024, activation='relu')(x)
x = tf.keraslayers.Dropout(0.2)(x)
x = tf.keraslayers.Dense  (1, activation='sigmoid')(x)

model = tf.keras.Model( pre_trained_model.input, x)

model.compile(optimizer = tf.keras.optimizers.RMSprop(lr=0.0001),
              loss = 'binary_crossentropy',
              metrics = ['acc'])

train_datagen = ImageDataGenerator(rescale = 1./255.,
                                   rotation_range = 40,
                                   width_shift_range = 0.2,
                                   height_shift_range = 0.2,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

train_generator = train_datagen.flow_from_directory("/tmp/cats_and_dogs_filtered/train",
                                                    batch_size = 20,
                                                    class_mode = 'binary',
                                                    target_size = (150, 150))

test_datagen = ImageDataGenerator( rescale = 1.0/255. )
validation_generator =  test_datagen.flow_from_directory( "/tmp/cats_and_dogs_filtered/validation",
                                                          batch_size  = 20,
                                                          class_mode  = 'binary',
                                                          target_size = (150, 150))


history = model.fit_generator(
            train_generator,
            validation_data = validation_generator,
            steps_per_epoch = 100,
            epochs = 20,
            validation_steps = 50,
            verbose = 2)

【重点1】导入inceptionV3模型和权重

local_weights_file = '/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'
pre_trained_model = tf.keras.applications.inception_v3.InceptionV3(input_shape=(150, 150, 3),
                                include_top=False,
                                weights=None)

pre_trained_model.load_weights(local_weights_file)
for layer in pre_trained_model.layers:
    layer.trainable = False

导入权重后,通过for循环,用layer.trainable=False把模型中的所有层都冻结(设置为不可训练)。

【重点2】在模型的后面加上猫狗分类的训练层

last_layer = pre_trained_model.get_layer('mixed7')
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output
x = tf.keras.layers.Flatten()(last_output)
x = tf.keraslayers.Dense(1024, activation='relu')(x)
x = tf.keraslayers.Dropout(0.2)(x)
x = tf.keraslayers.Dense  (1, activation='sigmoid')(x)
model = tf.keras.Model( pre_trained_model.input, x)
发布了90 篇原创文章 · 获赞 24 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/menghaocheng/article/details/102783705