一、总结
一句话总结:
其实就是把vgg16对应的conv_base像层一样放到Sequential中,然后对图片进行数据增强即可
model.add(conv_base)
from tensorflow.keras import models from tensorflow.keras import layers model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) model.summary()
1、模型的行为和层类似?
向Sequential模型中添加一个模型(比如vgg16):所以你可以向 Sequential 模型中添加一个模型(比如 conv_base), 就像添加一个层一样。
from tensorflow.keras import models from tensorflow.keras import layers model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) model.summary()
2、模型的行为和层类似?
向Sequential模型中添加一个模型(比如vgg16):所以你可以向 Sequential 模型中添加一个模型(比如 conv_base), 就像添加一个层一样。
3、在编译和训练模型之前,一定要“冻结”卷积基?
【冻结表示权重不变】:冻结(freeze)一个或多个层是指在训练 过程中保持其权重不变。
【不冻结会破坏预训练的网络】:如果不这么做,那么卷积基之前学到的表示将会在训练过程中被修改。 因为其上添加的 Dense 层是随机初始化的,所以非常大的权重更新将会在网络中传播,对之前 学到的表示造成很大破坏。
4、在 Keras 中,如何冻结网络?
【将其trainable属性设为False】:在 Keras 中,冻结网络的方法是将其 trainable 属性设为 False。
conv_base.trainable = False
>>> print('This is the number of trainable weights ' 'before freezing the conv base:', len(model.trainable_weights)) This is the number of trainable weights before freezing the conv base: 30 >>> conv_base.trainable = False >>> print('This is the number of trainable weights ' 'after freezing the conv base:', len(model.trainable_weights)) This is the number of trainable weights after freezing the conv base: 4
二、5.3-3、猫狗分类(使用预训练网络-数据增强的特征提取)
博客对应课程的视频位置:
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.applications import VGG16
# 把vgg模型弄过来
conv_base = VGG16(weights='imagenet',
# include_top=False表示不包含dense层
include_top=False,
input_shape=(150, 150, 3))
# C:\Users\Fan Renyi\.keras\models\vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
扩展 conv_base 模型,然后在输入数据上端到端地运行模型。
模型的行为和层类似,所以你可以向 Sequential 模型中添加一个模型(比如 conv_base), 就像添加一个层一样。
import os
base_dir = 'E:\\78_recorded_lesson\\001_course_github\\AI_dataSet\\dogs-vs-cats\\cats_and_dogs_small'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir, 'test')
from tensorflow.keras import models
from tensorflow.keras import layers
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
如你所见,VGG16 的卷积基有 14 714 688 个参数,非常多。在其上添加的分类器有 200 万 个参数。
冻结卷积层
print('This is the number of trainable weights before freezing the conv base:', len(model.trainable_weights))
conv_base.trainable = False
print('This is the number of trainable weights after freezing the conv base:', len(model.trainable_weights))
如此设置之后,只有添加的两个 Dense 层的权重才会被训练。总共有4 个权重张量,每层 2 个(主权重矩阵和偏置向量)。注意,为了让这些修改生效,你必须先编译模型。如果在编译 之后修改了权重的 trainable 属性,那么应该重新编译模型,否则这些修改将被忽略。
3、利用冻结的卷积基端到端地训练模型
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import optimizers
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,
fill_mode='nearest')
# 注意,不能增强验证数据
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir, # 目标目录
target_size=(150, 150), # 将所有图像的大小调整为 150×150
batch_size=20,
class_mode='binary') # 因为使用了binary_crossentropy 损失,所以需要用二进制标签
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=2e-5),
metrics=['acc'])
history = model.fit(
train_generator,
steps_per_epoch=100,
epochs=130,
validation_data=validation_generator,
validation_steps=50)
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'b--', label='Training acc')
plt.plot(epochs, val_acc, 'r-', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'b--', label='Training loss')
plt.plot(epochs, val_loss, 'r-', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:《python深度学习》笔记—5.3-3、猫狗分类(使用预训练网络-数据增强的特征提取) - Python技术站