Tensorflow 2.0 学习(chapter 6)

卷积层 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的替代。

发布了80 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u010099177/article/details/104824271