文章目录
卷积层 Conv2D
model = keras.models.Sequential() # 以下代码均省略了 keras.layers.
model.add(Conv2D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2))
...
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(),
optimizer=keras.optimizers.SGD(learning_rate=1e-2), metrics=['accuracy'])
filter_size是每两个要翻倍: 32 32 池化 64 64 池化 128 128 池化。
flatten 池化之后要展平。
激活函数可以换成 selu, selu 自带批归一化 BN, 效果更好
可分离卷积层 SeparableConv2D
model = keras.models.Sequential()
model.add(Conv2D(filters=32, kernel_size=3, padding='same', activation='selu', input_shape=(28,28,1)))
model.add(SeparableConv2D(filters=32, kernel_size=3, padding='same', activation='selu'))
model.add(MaxPool2D(pool_size=2))
model.add(SeparableConv2D(filters=64, kernel_size=3, padding='same', activation='selu'))
model.add(SeparableConv2D(filters=64, kernel_size=3, padding='same', activation='selu'))
model.add(MaxPool2D(pool_size=2))
ImageDataGenerator & flow_from_directory
tf.keras.preprocessing.image.ImageDataGenerator
Generate batches of tensor image data with real-time data augmentation.
使用实时数据增强生成一批图片(tensor)
train_generator = keras.preprocessing.image.ImageDataGenerator(
rescale = 1./255,
rotation_range = 40,
width_shift_range = 0.2, # 0.2=20%, >1则表示像素
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
fill_mode = 'nearest',
)
train_gen = train_generator.flow_from_directory(train_dir,
target_size=(height, width),
batch_size=batch_size,
seed=7,
shuffle=True,
class_mode='categorical')
valid_generator = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
valid_gen = valid_generator.flow_from_directory(valid_dir, shuffle=False, ...)
train_num = train_generator.samples # 获得图片文件数量
for i in range(2):
x, y = train_gen.next()
print(x.shape, y)
flow_from_directory产生keras_preprocessing.image.directory_iterator.DirectoryIterator
DirectoryIterator.samples 含义如下:
class DirectoryIterator(BatchFromFilesMixin, Iterator):
def __init__(self, .....)
samples = len(self.filenames)
fit_generator & predict_generator
model = keras.models.Sequential([some layers])
model.compile(loss='categorical_crossentropy', ...)
history = model.fit_generator(train_gen, steps_per_epoch=train_num//batch_size,
epochs=epochs, validation_data=valid_gen,
validation_steps=valid_num//batch_size)
model.predict_generator(test_gen, workers=10, use_multiprocessing=True)
Fits the model on data yielded batch-by-batch by a Python generator. (deprecated)
Warning: THIS FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Please use Model.fit, which supports generators. 换成model.fit, 支持generator.
Generates predictions for the input samples from a data generator. (deprecated)
Warning: THIS FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Please use Model.predict, which supports generators. 换成model.predict, 支持generator
applications.ResNet50
resnet50_fine_tune = keras.models.Sequential()
resnet50_fine_tune.add(keras.applications.ResNet50(include_top=False, pooling='avg', weights='imagenet'))
resnet50_fine_tune.add(keras.layers.Dense(num_classes, activation='softmax'))
resnet50_fine_tune.layers[0].trainable = False # 除了第一层都能调整
resnet50_fine_tune.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
resnet50_fine_tune.summary()
resnet50 = keras.applicationstions.ResNet50(include_top=False, pooling='avg', weights='image')
for layer in resnet50.layers[0:-5]: # 只调整最后几层
layer.trainable = False
resnet50_new = keras.models.Sequential([
resnet50,
keras.layers.Dense(num_classes, activation='softmax')
])
flow_from_dataframe
train_generator = keras.preprocessing.image.ImageDataGenerator(rescale=1./255, ...)
train_gen = train_generator.flow_from_dataframe(
train_df,
directory=None, # 为文件名添加前缀
x_col = 'filepath', # 文件名在dataframe的哪一列
y_col = 'class', # 类别在dataframe的哪一列. 类别是car, horse等字符串, 无需是0123..
classes = class_names,
target_size = (height, width),
batch_size = batch_size,
seed = 7,
shuffle = True,
class_mode = 'sparse'
)
keras_preprocessing.image.dataframe_iterator.DataFrameIterator
DataFrame中存放文件名和类别名,然后用flow_from_dataframe从文件系统中读,是flow_from_directory的替代。