【准备】
【例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)