62. 迁移学习完成动物分类#
62.1. 介绍#
图像分类的实验中,已经了解了迁移学习的概念,并使用 Alexnet 预训练模型完成了猫狗识别任务。本次挑战中,我们尝试使用 TensorFlow Keras 来训练动物分类迁移学习模型。
62.2. 知识点#
迁移学习
预训练模型
TensorFlow Keras
Note
本挑战前半部分内容可沿用实验的方法进行学习。
挑战将使用我们提供的动物图像数据集,里面包含猫,狗,马 3 种不同的动物。
Note
# 从课程镜像服务器下载数据文件
wget -nc "https://cdn.aibydoing.com/aibydoing/files/transfer-train.zip"
unzip -o "transfer-train.zip"
解压之后,每种动物只包含 50 张图片,我们想要看一看迁移学习对于极小数据集的效果。
通过 Keras 官方文档,我们可以找到其提供的预训练模型,我们选择体积较小且效果还不错的 MobileNetV2,模型在 ImageNet 训练完的体积为 14MB。
Keras 预训练模型托管在 GitHub 下载较慢:
import tensorflow as tf
# 读取并加载模型
mobilenet = tf.keras.applications.MobileNetV2()
mobilenet.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224.h5
14536120/14536120 [==============================] - 2s 0us/step
Model: "mobilenetv2_1.00_224"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 224, 224, 3)] 0 []
Conv1 (Conv2D) (None, 112, 112, 32) 864 ['input_1[0][0]']
bn_Conv1 (BatchNormalizati (None, 112, 112, 32) 128 ['Conv1[0][0]']
on)
Conv1_relu (ReLU) (None, 112, 112, 32) 0 ['bn_Conv1[0][0]']
expanded_conv_depthwise (D (None, 112, 112, 32) 288 ['Conv1_relu[0][0]']
epthwiseConv2D)
expanded_conv_depthwise_BN (None, 112, 112, 32) 128 ['expanded_conv_depthwise[0][0
(BatchNormalization) ]']
expanded_conv_depthwise_re (None, 112, 112, 32) 0 ['expanded_conv_depthwise_BN[0
lu (ReLU) ][0]']
expanded_conv_project (Con (None, 112, 112, 16) 512 ['expanded_conv_depthwise_relu
v2D) [0][0]']
expanded_conv_project_BN ( (None, 112, 112, 16) 64 ['expanded_conv_project[0][0]'
BatchNormalization) ]
block_1_expand (Conv2D) (None, 112, 112, 96) 1536 ['expanded_conv_project_BN[0][
0]']
block_1_expand_BN (BatchNo (None, 112, 112, 96) 384 ['block_1_expand[0][0]']
rmalization)
block_1_expand_relu (ReLU) (None, 112, 112, 96) 0 ['block_1_expand_BN[0][0]']
block_1_pad (ZeroPadding2D (None, 113, 113, 96) 0 ['block_1_expand_relu[0][0]']
)
block_1_depthwise (Depthwi (None, 56, 56, 96) 864 ['block_1_pad[0][0]']
seConv2D)
block_1_depthwise_BN (Batc (None, 56, 56, 96) 384 ['block_1_depthwise[0][0]']
hNormalization)
block_1_depthwise_relu (Re (None, 56, 56, 96) 0 ['block_1_depthwise_BN[0][0]']
LU)
block_1_project (Conv2D) (None, 56, 56, 24) 2304 ['block_1_depthwise_relu[0][0]
']
block_1_project_BN (BatchN (None, 56, 56, 24) 96 ['block_1_project[0][0]']
ormalization)
block_2_expand (Conv2D) (None, 56, 56, 144) 3456 ['block_1_project_BN[0][0]']
block_2_expand_BN (BatchNo (None, 56, 56, 144) 576 ['block_2_expand[0][0]']
rmalization)
block_2_expand_relu (ReLU) (None, 56, 56, 144) 0 ['block_2_expand_BN[0][0]']
block_2_depthwise (Depthwi (None, 56, 56, 144) 1296 ['block_2_expand_relu[0][0]']
seConv2D)
block_2_depthwise_BN (Batc (None, 56, 56, 144) 576 ['block_2_depthwise[0][0]']
hNormalization)
block_2_depthwise_relu (Re (None, 56, 56, 144) 0 ['block_2_depthwise_BN[0][0]']
LU)
block_2_project (Conv2D) (None, 56, 56, 24) 3456 ['block_2_depthwise_relu[0][0]
']
block_2_project_BN (BatchN (None, 56, 56, 24) 96 ['block_2_project[0][0]']
ormalization)
block_2_add (Add) (None, 56, 56, 24) 0 ['block_1_project_BN[0][0]',
'block_2_project_BN[0][0]']
block_3_expand (Conv2D) (None, 56, 56, 144) 3456 ['block_2_add[0][0]']
block_3_expand_BN (BatchNo (None, 56, 56, 144) 576 ['block_3_expand[0][0]']
rmalization)
block_3_expand_relu (ReLU) (None, 56, 56, 144) 0 ['block_3_expand_BN[0][0]']
block_3_pad (ZeroPadding2D (None, 57, 57, 144) 0 ['block_3_expand_relu[0][0]']
)
block_3_depthwise (Depthwi (None, 28, 28, 144) 1296 ['block_3_pad[0][0]']
seConv2D)
block_3_depthwise_BN (Batc (None, 28, 28, 144) 576 ['block_3_depthwise[0][0]']
hNormalization)
block_3_depthwise_relu (Re (None, 28, 28, 144) 0 ['block_3_depthwise_BN[0][0]']
LU)
block_3_project (Conv2D) (None, 28, 28, 32) 4608 ['block_3_depthwise_relu[0][0]
']
block_3_project_BN (BatchN (None, 28, 28, 32) 128 ['block_3_project[0][0]']
ormalization)
block_4_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_3_project_BN[0][0]']
block_4_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_4_expand[0][0]']
rmalization)
block_4_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_4_expand_BN[0][0]']
block_4_depthwise (Depthwi (None, 28, 28, 192) 1728 ['block_4_expand_relu[0][0]']
seConv2D)
block_4_depthwise_BN (Batc (None, 28, 28, 192) 768 ['block_4_depthwise[0][0]']
hNormalization)
block_4_depthwise_relu (Re (None, 28, 28, 192) 0 ['block_4_depthwise_BN[0][0]']
LU)
block_4_project (Conv2D) (None, 28, 28, 32) 6144 ['block_4_depthwise_relu[0][0]
']
block_4_project_BN (BatchN (None, 28, 28, 32) 128 ['block_4_project[0][0]']
ormalization)
block_4_add (Add) (None, 28, 28, 32) 0 ['block_3_project_BN[0][0]',
'block_4_project_BN[0][0]']
block_5_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_4_add[0][0]']
block_5_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_5_expand[0][0]']
rmalization)
block_5_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_5_expand_BN[0][0]']
block_5_depthwise (Depthwi (None, 28, 28, 192) 1728 ['block_5_expand_relu[0][0]']
seConv2D)
block_5_depthwise_BN (Batc (None, 28, 28, 192) 768 ['block_5_depthwise[0][0]']
hNormalization)
block_5_depthwise_relu (Re (None, 28, 28, 192) 0 ['block_5_depthwise_BN[0][0]']
LU)
block_5_project (Conv2D) (None, 28, 28, 32) 6144 ['block_5_depthwise_relu[0][0]
']
block_5_project_BN (BatchN (None, 28, 28, 32) 128 ['block_5_project[0][0]']
ormalization)
block_5_add (Add) (None, 28, 28, 32) 0 ['block_4_add[0][0]',
'block_5_project_BN[0][0]']
block_6_expand (Conv2D) (None, 28, 28, 192) 6144 ['block_5_add[0][0]']
block_6_expand_BN (BatchNo (None, 28, 28, 192) 768 ['block_6_expand[0][0]']
rmalization)
block_6_expand_relu (ReLU) (None, 28, 28, 192) 0 ['block_6_expand_BN[0][0]']
block_6_pad (ZeroPadding2D (None, 29, 29, 192) 0 ['block_6_expand_relu[0][0]']
)
block_6_depthwise (Depthwi (None, 14, 14, 192) 1728 ['block_6_pad[0][0]']
seConv2D)
block_6_depthwise_BN (Batc (None, 14, 14, 192) 768 ['block_6_depthwise[0][0]']
hNormalization)
block_6_depthwise_relu (Re (None, 14, 14, 192) 0 ['block_6_depthwise_BN[0][0]']
LU)
block_6_project (Conv2D) (None, 14, 14, 64) 12288 ['block_6_depthwise_relu[0][0]
']
block_6_project_BN (BatchN (None, 14, 14, 64) 256 ['block_6_project[0][0]']
ormalization)
block_7_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_6_project_BN[0][0]']
block_7_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_7_expand[0][0]']
rmalization)
block_7_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_7_expand_BN[0][0]']
block_7_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_7_expand_relu[0][0]']
seConv2D)
block_7_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_7_depthwise[0][0]']
hNormalization)
block_7_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_7_depthwise_BN[0][0]']
LU)
block_7_project (Conv2D) (None, 14, 14, 64) 24576 ['block_7_depthwise_relu[0][0]
']
block_7_project_BN (BatchN (None, 14, 14, 64) 256 ['block_7_project[0][0]']
ormalization)
block_7_add (Add) (None, 14, 14, 64) 0 ['block_6_project_BN[0][0]',
'block_7_project_BN[0][0]']
block_8_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_7_add[0][0]']
block_8_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_8_expand[0][0]']
rmalization)
block_8_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_8_expand_BN[0][0]']
block_8_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_8_expand_relu[0][0]']
seConv2D)
block_8_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_8_depthwise[0][0]']
hNormalization)
block_8_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_8_depthwise_BN[0][0]']
LU)
block_8_project (Conv2D) (None, 14, 14, 64) 24576 ['block_8_depthwise_relu[0][0]
']
block_8_project_BN (BatchN (None, 14, 14, 64) 256 ['block_8_project[0][0]']
ormalization)
block_8_add (Add) (None, 14, 14, 64) 0 ['block_7_add[0][0]',
'block_8_project_BN[0][0]']
block_9_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_8_add[0][0]']
block_9_expand_BN (BatchNo (None, 14, 14, 384) 1536 ['block_9_expand[0][0]']
rmalization)
block_9_expand_relu (ReLU) (None, 14, 14, 384) 0 ['block_9_expand_BN[0][0]']
block_9_depthwise (Depthwi (None, 14, 14, 384) 3456 ['block_9_expand_relu[0][0]']
seConv2D)
block_9_depthwise_BN (Batc (None, 14, 14, 384) 1536 ['block_9_depthwise[0][0]']
hNormalization)
block_9_depthwise_relu (Re (None, 14, 14, 384) 0 ['block_9_depthwise_BN[0][0]']
LU)
block_9_project (Conv2D) (None, 14, 14, 64) 24576 ['block_9_depthwise_relu[0][0]
']
block_9_project_BN (BatchN (None, 14, 14, 64) 256 ['block_9_project[0][0]']
ormalization)
block_9_add (Add) (None, 14, 14, 64) 0 ['block_8_add[0][0]',
'block_9_project_BN[0][0]']
block_10_expand (Conv2D) (None, 14, 14, 384) 24576 ['block_9_add[0][0]']
block_10_expand_BN (BatchN (None, 14, 14, 384) 1536 ['block_10_expand[0][0]']
ormalization)
block_10_expand_relu (ReLU (None, 14, 14, 384) 0 ['block_10_expand_BN[0][0]']
)
block_10_depthwise (Depthw (None, 14, 14, 384) 3456 ['block_10_expand_relu[0][0]']
iseConv2D)
block_10_depthwise_BN (Bat (None, 14, 14, 384) 1536 ['block_10_depthwise[0][0]']
chNormalization)
block_10_depthwise_relu (R (None, 14, 14, 384) 0 ['block_10_depthwise_BN[0][0]'
eLU) ]
block_10_project (Conv2D) (None, 14, 14, 96) 36864 ['block_10_depthwise_relu[0][0
]']
block_10_project_BN (Batch (None, 14, 14, 96) 384 ['block_10_project[0][0]']
Normalization)
block_11_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_10_project_BN[0][0]']
block_11_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_11_expand[0][0]']
ormalization)
block_11_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_11_expand_BN[0][0]']
)
block_11_depthwise (Depthw (None, 14, 14, 576) 5184 ['block_11_expand_relu[0][0]']
iseConv2D)
block_11_depthwise_BN (Bat (None, 14, 14, 576) 2304 ['block_11_depthwise[0][0]']
chNormalization)
block_11_depthwise_relu (R (None, 14, 14, 576) 0 ['block_11_depthwise_BN[0][0]'
eLU) ]
block_11_project (Conv2D) (None, 14, 14, 96) 55296 ['block_11_depthwise_relu[0][0
]']
block_11_project_BN (Batch (None, 14, 14, 96) 384 ['block_11_project[0][0]']
Normalization)
block_11_add (Add) (None, 14, 14, 96) 0 ['block_10_project_BN[0][0]',
'block_11_project_BN[0][0]']
block_12_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_11_add[0][0]']
block_12_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_12_expand[0][0]']
ormalization)
block_12_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_12_expand_BN[0][0]']
)
block_12_depthwise (Depthw (None, 14, 14, 576) 5184 ['block_12_expand_relu[0][0]']
iseConv2D)
block_12_depthwise_BN (Bat (None, 14, 14, 576) 2304 ['block_12_depthwise[0][0]']
chNormalization)
block_12_depthwise_relu (R (None, 14, 14, 576) 0 ['block_12_depthwise_BN[0][0]'
eLU) ]
block_12_project (Conv2D) (None, 14, 14, 96) 55296 ['block_12_depthwise_relu[0][0
]']
block_12_project_BN (Batch (None, 14, 14, 96) 384 ['block_12_project[0][0]']
Normalization)
block_12_add (Add) (None, 14, 14, 96) 0 ['block_11_add[0][0]',
'block_12_project_BN[0][0]']
block_13_expand (Conv2D) (None, 14, 14, 576) 55296 ['block_12_add[0][0]']
block_13_expand_BN (BatchN (None, 14, 14, 576) 2304 ['block_13_expand[0][0]']
ormalization)
block_13_expand_relu (ReLU (None, 14, 14, 576) 0 ['block_13_expand_BN[0][0]']
)
block_13_pad (ZeroPadding2 (None, 15, 15, 576) 0 ['block_13_expand_relu[0][0]']
D)
block_13_depthwise (Depthw (None, 7, 7, 576) 5184 ['block_13_pad[0][0]']
iseConv2D)
block_13_depthwise_BN (Bat (None, 7, 7, 576) 2304 ['block_13_depthwise[0][0]']
chNormalization)
block_13_depthwise_relu (R (None, 7, 7, 576) 0 ['block_13_depthwise_BN[0][0]'
eLU) ]
block_13_project (Conv2D) (None, 7, 7, 160) 92160 ['block_13_depthwise_relu[0][0
]']
block_13_project_BN (Batch (None, 7, 7, 160) 640 ['block_13_project[0][0]']
Normalization)
block_14_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_13_project_BN[0][0]']
block_14_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_14_expand[0][0]']
ormalization)
block_14_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_14_expand_BN[0][0]']
)
block_14_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_14_expand_relu[0][0]']
iseConv2D)
block_14_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_14_depthwise[0][0]']
chNormalization)
block_14_depthwise_relu (R (None, 7, 7, 960) 0 ['block_14_depthwise_BN[0][0]'
eLU) ]
block_14_project (Conv2D) (None, 7, 7, 160) 153600 ['block_14_depthwise_relu[0][0
]']
block_14_project_BN (Batch (None, 7, 7, 160) 640 ['block_14_project[0][0]']
Normalization)
block_14_add (Add) (None, 7, 7, 160) 0 ['block_13_project_BN[0][0]',
'block_14_project_BN[0][0]']
block_15_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_14_add[0][0]']
block_15_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_15_expand[0][0]']
ormalization)
block_15_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_15_expand_BN[0][0]']
)
block_15_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_15_expand_relu[0][0]']
iseConv2D)
block_15_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_15_depthwise[0][0]']
chNormalization)
block_15_depthwise_relu (R (None, 7, 7, 960) 0 ['block_15_depthwise_BN[0][0]'
eLU) ]
block_15_project (Conv2D) (None, 7, 7, 160) 153600 ['block_15_depthwise_relu[0][0
]']
block_15_project_BN (Batch (None, 7, 7, 160) 640 ['block_15_project[0][0]']
Normalization)
block_15_add (Add) (None, 7, 7, 160) 0 ['block_14_add[0][0]',
'block_15_project_BN[0][0]']
block_16_expand (Conv2D) (None, 7, 7, 960) 153600 ['block_15_add[0][0]']
block_16_expand_BN (BatchN (None, 7, 7, 960) 3840 ['block_16_expand[0][0]']
ormalization)
block_16_expand_relu (ReLU (None, 7, 7, 960) 0 ['block_16_expand_BN[0][0]']
)
block_16_depthwise (Depthw (None, 7, 7, 960) 8640 ['block_16_expand_relu[0][0]']
iseConv2D)
block_16_depthwise_BN (Bat (None, 7, 7, 960) 3840 ['block_16_depthwise[0][0]']
chNormalization)
block_16_depthwise_relu (R (None, 7, 7, 960) 0 ['block_16_depthwise_BN[0][0]'
eLU) ]
block_16_project (Conv2D) (None, 7, 7, 320) 307200 ['block_16_depthwise_relu[0][0
]']
block_16_project_BN (Batch (None, 7, 7, 320) 1280 ['block_16_project[0][0]']
Normalization)
Conv_1 (Conv2D) (None, 7, 7, 1280) 409600 ['block_16_project_BN[0][0]']
Conv_1_bn (BatchNormalizat (None, 7, 7, 1280) 5120 ['Conv_1[0][0]']
ion)
out_relu (ReLU) (None, 7, 7, 1280) 0 ['Conv_1_bn[0][0]']
global_average_pooling2d ( (None, 1280) 0 ['out_relu[0][0]']
GlobalAveragePooling2D)
predictions (Dense) (None, 1000) 1281000 ['global_average_pooling2d[0][
0]']
==================================================================================================
Total params: 3538984 (13.50 MB)
Trainable params: 3504872 (13.37 MB)
Non-trainable params: 34112 (133.25 KB)
__________________________________________________________________________________________________
可以看到,模型的最终输出为
(None,
1000)
,也就是 ImageNet 上的 1000 分类。而本次挑战实际上是 3
分类问题,所以需要修改最终的输出层。对于 TensorFlow Keras
预训练模型,虽然我们可以直接在后面添加一个 3
类别输出的全连接层,但由于原来的输出层已经使用了 Softmax
激活,所以这里还是希望能够直接对输出层修改。
TensorFlow Keras
考虑到微调的需要,所以提供了不包含分类器(输出层)的预训练模型,只需要在导入模型时添加
include_top=False
参数即可。
# 读取并加载模型
mobilenet_notop = tf.keras.applications.MobileNetV2(include_top=False)
mobilenet_notop.summary()
WARNING:tensorflow:`input_shape` is undefined or non-square, or `rows` is not in [96, 128, 160, 192, 224]. Weights for input shape (224, 224) will be loaded as the default.
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5
9406464/9406464 [==============================] - 1s 0us/step
Model: "mobilenetv2_1.00_224"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_2 (InputLayer) [(None, None, None, 3)] 0 []
Conv1 (Conv2D) (None, None, None, 32) 864 ['input_2[0][0]']
bn_Conv1 (BatchNormalizati (None, None, None, 32) 128 ['Conv1[0][0]']
on)
Conv1_relu (ReLU) (None, None, None, 32) 0 ['bn_Conv1[0][0]']
expanded_conv_depthwise (D (None, None, None, 32) 288 ['Conv1_relu[0][0]']
epthwiseConv2D)
expanded_conv_depthwise_BN (None, None, None, 32) 128 ['expanded_conv_depthwise[0][0
(BatchNormalization) ]']
expanded_conv_depthwise_re (None, None, None, 32) 0 ['expanded_conv_depthwise_BN[0
lu (ReLU) ][0]']
expanded_conv_project (Con (None, None, None, 16) 512 ['expanded_conv_depthwise_relu
v2D) [0][0]']
expanded_conv_project_BN ( (None, None, None, 16) 64 ['expanded_conv_project[0][0]'
BatchNormalization) ]
block_1_expand (Conv2D) (None, None, None, 96) 1536 ['expanded_conv_project_BN[0][
0]']
block_1_expand_BN (BatchNo (None, None, None, 96) 384 ['block_1_expand[0][0]']
rmalization)
block_1_expand_relu (ReLU) (None, None, None, 96) 0 ['block_1_expand_BN[0][0]']
block_1_pad (ZeroPadding2D (None, None, None, 96) 0 ['block_1_expand_relu[0][0]']
)
block_1_depthwise (Depthwi (None, None, None, 96) 864 ['block_1_pad[0][0]']
seConv2D)
block_1_depthwise_BN (Batc (None, None, None, 96) 384 ['block_1_depthwise[0][0]']
hNormalization)
block_1_depthwise_relu (Re (None, None, None, 96) 0 ['block_1_depthwise_BN[0][0]']
LU)
block_1_project (Conv2D) (None, None, None, 24) 2304 ['block_1_depthwise_relu[0][0]
']
block_1_project_BN (BatchN (None, None, None, 24) 96 ['block_1_project[0][0]']
ormalization)
block_2_expand (Conv2D) (None, None, None, 144) 3456 ['block_1_project_BN[0][0]']
block_2_expand_BN (BatchNo (None, None, None, 144) 576 ['block_2_expand[0][0]']
rmalization)
block_2_expand_relu (ReLU) (None, None, None, 144) 0 ['block_2_expand_BN[0][0]']
block_2_depthwise (Depthwi (None, None, None, 144) 1296 ['block_2_expand_relu[0][0]']
seConv2D)
block_2_depthwise_BN (Batc (None, None, None, 144) 576 ['block_2_depthwise[0][0]']
hNormalization)
block_2_depthwise_relu (Re (None, None, None, 144) 0 ['block_2_depthwise_BN[0][0]']
LU)
block_2_project (Conv2D) (None, None, None, 24) 3456 ['block_2_depthwise_relu[0][0]
']
block_2_project_BN (BatchN (None, None, None, 24) 96 ['block_2_project[0][0]']
ormalization)
block_2_add (Add) (None, None, None, 24) 0 ['block_1_project_BN[0][0]',
'block_2_project_BN[0][0]']
block_3_expand (Conv2D) (None, None, None, 144) 3456 ['block_2_add[0][0]']
block_3_expand_BN (BatchNo (None, None, None, 144) 576 ['block_3_expand[0][0]']
rmalization)
block_3_expand_relu (ReLU) (None, None, None, 144) 0 ['block_3_expand_BN[0][0]']
block_3_pad (ZeroPadding2D (None, None, None, 144) 0 ['block_3_expand_relu[0][0]']
)
block_3_depthwise (Depthwi (None, None, None, 144) 1296 ['block_3_pad[0][0]']
seConv2D)
block_3_depthwise_BN (Batc (None, None, None, 144) 576 ['block_3_depthwise[0][0]']
hNormalization)
block_3_depthwise_relu (Re (None, None, None, 144) 0 ['block_3_depthwise_BN[0][0]']
LU)
block_3_project (Conv2D) (None, None, None, 32) 4608 ['block_3_depthwise_relu[0][0]
']
block_3_project_BN (BatchN (None, None, None, 32) 128 ['block_3_project[0][0]']
ormalization)
block_4_expand (Conv2D) (None, None, None, 192) 6144 ['block_3_project_BN[0][0]']
block_4_expand_BN (BatchNo (None, None, None, 192) 768 ['block_4_expand[0][0]']
rmalization)
block_4_expand_relu (ReLU) (None, None, None, 192) 0 ['block_4_expand_BN[0][0]']
block_4_depthwise (Depthwi (None, None, None, 192) 1728 ['block_4_expand_relu[0][0]']
seConv2D)
block_4_depthwise_BN (Batc (None, None, None, 192) 768 ['block_4_depthwise[0][0]']
hNormalization)
block_4_depthwise_relu (Re (None, None, None, 192) 0 ['block_4_depthwise_BN[0][0]']
LU)
block_4_project (Conv2D) (None, None, None, 32) 6144 ['block_4_depthwise_relu[0][0]
']
block_4_project_BN (BatchN (None, None, None, 32) 128 ['block_4_project[0][0]']
ormalization)
block_4_add (Add) (None, None, None, 32) 0 ['block_3_project_BN[0][0]',
'block_4_project_BN[0][0]']
block_5_expand (Conv2D) (None, None, None, 192) 6144 ['block_4_add[0][0]']
block_5_expand_BN (BatchNo (None, None, None, 192) 768 ['block_5_expand[0][0]']
rmalization)
block_5_expand_relu (ReLU) (None, None, None, 192) 0 ['block_5_expand_BN[0][0]']
block_5_depthwise (Depthwi (None, None, None, 192) 1728 ['block_5_expand_relu[0][0]']
seConv2D)
block_5_depthwise_BN (Batc (None, None, None, 192) 768 ['block_5_depthwise[0][0]']
hNormalization)
block_5_depthwise_relu (Re (None, None, None, 192) 0 ['block_5_depthwise_BN[0][0]']
LU)
block_5_project (Conv2D) (None, None, None, 32) 6144 ['block_5_depthwise_relu[0][0]
']
block_5_project_BN (BatchN (None, None, None, 32) 128 ['block_5_project[0][0]']
ormalization)
block_5_add (Add) (None, None, None, 32) 0 ['block_4_add[0][0]',
'block_5_project_BN[0][0]']
block_6_expand (Conv2D) (None, None, None, 192) 6144 ['block_5_add[0][0]']
block_6_expand_BN (BatchNo (None, None, None, 192) 768 ['block_6_expand[0][0]']
rmalization)
block_6_expand_relu (ReLU) (None, None, None, 192) 0 ['block_6_expand_BN[0][0]']
block_6_pad (ZeroPadding2D (None, None, None, 192) 0 ['block_6_expand_relu[0][0]']
)
block_6_depthwise (Depthwi (None, None, None, 192) 1728 ['block_6_pad[0][0]']
seConv2D)
block_6_depthwise_BN (Batc (None, None, None, 192) 768 ['block_6_depthwise[0][0]']
hNormalization)
block_6_depthwise_relu (Re (None, None, None, 192) 0 ['block_6_depthwise_BN[0][0]']
LU)
block_6_project (Conv2D) (None, None, None, 64) 12288 ['block_6_depthwise_relu[0][0]
']
block_6_project_BN (BatchN (None, None, None, 64) 256 ['block_6_project[0][0]']
ormalization)
block_7_expand (Conv2D) (None, None, None, 384) 24576 ['block_6_project_BN[0][0]']
block_7_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_7_expand[0][0]']
rmalization)
block_7_expand_relu (ReLU) (None, None, None, 384) 0 ['block_7_expand_BN[0][0]']
block_7_depthwise (Depthwi (None, None, None, 384) 3456 ['block_7_expand_relu[0][0]']
seConv2D)
block_7_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_7_depthwise[0][0]']
hNormalization)
block_7_depthwise_relu (Re (None, None, None, 384) 0 ['block_7_depthwise_BN[0][0]']
LU)
block_7_project (Conv2D) (None, None, None, 64) 24576 ['block_7_depthwise_relu[0][0]
']
block_7_project_BN (BatchN (None, None, None, 64) 256 ['block_7_project[0][0]']
ormalization)
block_7_add (Add) (None, None, None, 64) 0 ['block_6_project_BN[0][0]',
'block_7_project_BN[0][0]']
block_8_expand (Conv2D) (None, None, None, 384) 24576 ['block_7_add[0][0]']
block_8_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_8_expand[0][0]']
rmalization)
block_8_expand_relu (ReLU) (None, None, None, 384) 0 ['block_8_expand_BN[0][0]']
block_8_depthwise (Depthwi (None, None, None, 384) 3456 ['block_8_expand_relu[0][0]']
seConv2D)
block_8_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_8_depthwise[0][0]']
hNormalization)
block_8_depthwise_relu (Re (None, None, None, 384) 0 ['block_8_depthwise_BN[0][0]']
LU)
block_8_project (Conv2D) (None, None, None, 64) 24576 ['block_8_depthwise_relu[0][0]
']
block_8_project_BN (BatchN (None, None, None, 64) 256 ['block_8_project[0][0]']
ormalization)
block_8_add (Add) (None, None, None, 64) 0 ['block_7_add[0][0]',
'block_8_project_BN[0][0]']
block_9_expand (Conv2D) (None, None, None, 384) 24576 ['block_8_add[0][0]']
block_9_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_9_expand[0][0]']
rmalization)
block_9_expand_relu (ReLU) (None, None, None, 384) 0 ['block_9_expand_BN[0][0]']
block_9_depthwise (Depthwi (None, None, None, 384) 3456 ['block_9_expand_relu[0][0]']
seConv2D)
block_9_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_9_depthwise[0][0]']
hNormalization)
block_9_depthwise_relu (Re (None, None, None, 384) 0 ['block_9_depthwise_BN[0][0]']
LU)
block_9_project (Conv2D) (None, None, None, 64) 24576 ['block_9_depthwise_relu[0][0]
']
block_9_project_BN (BatchN (None, None, None, 64) 256 ['block_9_project[0][0]']
ormalization)
block_9_add (Add) (None, None, None, 64) 0 ['block_8_add[0][0]',
'block_9_project_BN[0][0]']
block_10_expand (Conv2D) (None, None, None, 384) 24576 ['block_9_add[0][0]']
block_10_expand_BN (BatchN (None, None, None, 384) 1536 ['block_10_expand[0][0]']
ormalization)
block_10_expand_relu (ReLU (None, None, None, 384) 0 ['block_10_expand_BN[0][0]']
)
block_10_depthwise (Depthw (None, None, None, 384) 3456 ['block_10_expand_relu[0][0]']
iseConv2D)
block_10_depthwise_BN (Bat (None, None, None, 384) 1536 ['block_10_depthwise[0][0]']
chNormalization)
block_10_depthwise_relu (R (None, None, None, 384) 0 ['block_10_depthwise_BN[0][0]'
eLU) ]
block_10_project (Conv2D) (None, None, None, 96) 36864 ['block_10_depthwise_relu[0][0
]']
block_10_project_BN (Batch (None, None, None, 96) 384 ['block_10_project[0][0]']
Normalization)
block_11_expand (Conv2D) (None, None, None, 576) 55296 ['block_10_project_BN[0][0]']
block_11_expand_BN (BatchN (None, None, None, 576) 2304 ['block_11_expand[0][0]']
ormalization)
block_11_expand_relu (ReLU (None, None, None, 576) 0 ['block_11_expand_BN[0][0]']
)
block_11_depthwise (Depthw (None, None, None, 576) 5184 ['block_11_expand_relu[0][0]']
iseConv2D)
block_11_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_11_depthwise[0][0]']
chNormalization)
block_11_depthwise_relu (R (None, None, None, 576) 0 ['block_11_depthwise_BN[0][0]'
eLU) ]
block_11_project (Conv2D) (None, None, None, 96) 55296 ['block_11_depthwise_relu[0][0
]']
block_11_project_BN (Batch (None, None, None, 96) 384 ['block_11_project[0][0]']
Normalization)
block_11_add (Add) (None, None, None, 96) 0 ['block_10_project_BN[0][0]',
'block_11_project_BN[0][0]']
block_12_expand (Conv2D) (None, None, None, 576) 55296 ['block_11_add[0][0]']
block_12_expand_BN (BatchN (None, None, None, 576) 2304 ['block_12_expand[0][0]']
ormalization)
block_12_expand_relu (ReLU (None, None, None, 576) 0 ['block_12_expand_BN[0][0]']
)
block_12_depthwise (Depthw (None, None, None, 576) 5184 ['block_12_expand_relu[0][0]']
iseConv2D)
block_12_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_12_depthwise[0][0]']
chNormalization)
block_12_depthwise_relu (R (None, None, None, 576) 0 ['block_12_depthwise_BN[0][0]'
eLU) ]
block_12_project (Conv2D) (None, None, None, 96) 55296 ['block_12_depthwise_relu[0][0
]']
block_12_project_BN (Batch (None, None, None, 96) 384 ['block_12_project[0][0]']
Normalization)
block_12_add (Add) (None, None, None, 96) 0 ['block_11_add[0][0]',
'block_12_project_BN[0][0]']
block_13_expand (Conv2D) (None, None, None, 576) 55296 ['block_12_add[0][0]']
block_13_expand_BN (BatchN (None, None, None, 576) 2304 ['block_13_expand[0][0]']
ormalization)
block_13_expand_relu (ReLU (None, None, None, 576) 0 ['block_13_expand_BN[0][0]']
)
block_13_pad (ZeroPadding2 (None, None, None, 576) 0 ['block_13_expand_relu[0][0]']
D)
block_13_depthwise (Depthw (None, None, None, 576) 5184 ['block_13_pad[0][0]']
iseConv2D)
block_13_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_13_depthwise[0][0]']
chNormalization)
block_13_depthwise_relu (R (None, None, None, 576) 0 ['block_13_depthwise_BN[0][0]'
eLU) ]
block_13_project (Conv2D) (None, None, None, 160) 92160 ['block_13_depthwise_relu[0][0
]']
block_13_project_BN (Batch (None, None, None, 160) 640 ['block_13_project[0][0]']
Normalization)
block_14_expand (Conv2D) (None, None, None, 960) 153600 ['block_13_project_BN[0][0]']
block_14_expand_BN (BatchN (None, None, None, 960) 3840 ['block_14_expand[0][0]']
ormalization)
block_14_expand_relu (ReLU (None, None, None, 960) 0 ['block_14_expand_BN[0][0]']
)
block_14_depthwise (Depthw (None, None, None, 960) 8640 ['block_14_expand_relu[0][0]']
iseConv2D)
block_14_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_14_depthwise[0][0]']
chNormalization)
block_14_depthwise_relu (R (None, None, None, 960) 0 ['block_14_depthwise_BN[0][0]'
eLU) ]
block_14_project (Conv2D) (None, None, None, 160) 153600 ['block_14_depthwise_relu[0][0
]']
block_14_project_BN (Batch (None, None, None, 160) 640 ['block_14_project[0][0]']
Normalization)
block_14_add (Add) (None, None, None, 160) 0 ['block_13_project_BN[0][0]',
'block_14_project_BN[0][0]']
block_15_expand (Conv2D) (None, None, None, 960) 153600 ['block_14_add[0][0]']
block_15_expand_BN (BatchN (None, None, None, 960) 3840 ['block_15_expand[0][0]']
ormalization)
block_15_expand_relu (ReLU (None, None, None, 960) 0 ['block_15_expand_BN[0][0]']
)
block_15_depthwise (Depthw (None, None, None, 960) 8640 ['block_15_expand_relu[0][0]']
iseConv2D)
block_15_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_15_depthwise[0][0]']
chNormalization)
block_15_depthwise_relu (R (None, None, None, 960) 0 ['block_15_depthwise_BN[0][0]'
eLU) ]
block_15_project (Conv2D) (None, None, None, 160) 153600 ['block_15_depthwise_relu[0][0
]']
block_15_project_BN (Batch (None, None, None, 160) 640 ['block_15_project[0][0]']
Normalization)
block_15_add (Add) (None, None, None, 160) 0 ['block_14_add[0][0]',
'block_15_project_BN[0][0]']
block_16_expand (Conv2D) (None, None, None, 960) 153600 ['block_15_add[0][0]']
block_16_expand_BN (BatchN (None, None, None, 960) 3840 ['block_16_expand[0][0]']
ormalization)
block_16_expand_relu (ReLU (None, None, None, 960) 0 ['block_16_expand_BN[0][0]']
)
block_16_depthwise (Depthw (None, None, None, 960) 8640 ['block_16_expand_relu[0][0]']
iseConv2D)
block_16_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_16_depthwise[0][0]']
chNormalization)
block_16_depthwise_relu (R (None, None, None, 960) 0 ['block_16_depthwise_BN[0][0]'
eLU) ]
block_16_project (Conv2D) (None, None, None, 320) 307200 ['block_16_depthwise_relu[0][0
]']
block_16_project_BN (Batch (None, None, None, 320) 1280 ['block_16_project[0][0]']
Normalization)
Conv_1 (Conv2D) (None, None, None, 1280) 409600 ['block_16_project_BN[0][0]']
Conv_1_bn (BatchNormalizat (None, None, None, 1280) 5120 ['Conv_1[0][0]']
ion)
out_relu (ReLU) (None, None, None, 1280) 0 ['Conv_1_bn[0][0]']
==================================================================================================
Total params: 2257984 (8.61 MB)
Trainable params: 2223872 (8.48 MB)
Non-trainable params: 34112 (133.25 KB)
__________________________________________________________________________________________________
所以,接下来,我们在
mobilenet_notop
后添加自定义输出层即可。对比原来的完整模型,还需要补充一个
GlobalAveragePooling2D
层。
pool = tf.keras.layers.GlobalAveragePooling2D()(mobilenet_notop.output)
outs = tf.keras.layers.Dense(3, activation="softmax")(pool)
outs
<KerasTensor: shape=(None, 3) dtype=float32 (created by layer 'dense')>
接下来,就可以封装我们新定义的模型了。
model = tf.keras.models.Model(inputs=mobilenet_notop.input, outputs=outs)
model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_2 (InputLayer) [(None, None, None, 3)] 0 []
Conv1 (Conv2D) (None, None, None, 32) 864 ['input_2[0][0]']
bn_Conv1 (BatchNormalizati (None, None, None, 32) 128 ['Conv1[0][0]']
on)
Conv1_relu (ReLU) (None, None, None, 32) 0 ['bn_Conv1[0][0]']
expanded_conv_depthwise (D (None, None, None, 32) 288 ['Conv1_relu[0][0]']
epthwiseConv2D)
expanded_conv_depthwise_BN (None, None, None, 32) 128 ['expanded_conv_depthwise[0][0
(BatchNormalization) ]']
expanded_conv_depthwise_re (None, None, None, 32) 0 ['expanded_conv_depthwise_BN[0
lu (ReLU) ][0]']
expanded_conv_project (Con (None, None, None, 16) 512 ['expanded_conv_depthwise_relu
v2D) [0][0]']
expanded_conv_project_BN ( (None, None, None, 16) 64 ['expanded_conv_project[0][0]'
BatchNormalization) ]
block_1_expand (Conv2D) (None, None, None, 96) 1536 ['expanded_conv_project_BN[0][
0]']
block_1_expand_BN (BatchNo (None, None, None, 96) 384 ['block_1_expand[0][0]']
rmalization)
block_1_expand_relu (ReLU) (None, None, None, 96) 0 ['block_1_expand_BN[0][0]']
block_1_pad (ZeroPadding2D (None, None, None, 96) 0 ['block_1_expand_relu[0][0]']
)
block_1_depthwise (Depthwi (None, None, None, 96) 864 ['block_1_pad[0][0]']
seConv2D)
block_1_depthwise_BN (Batc (None, None, None, 96) 384 ['block_1_depthwise[0][0]']
hNormalization)
block_1_depthwise_relu (Re (None, None, None, 96) 0 ['block_1_depthwise_BN[0][0]']
LU)
block_1_project (Conv2D) (None, None, None, 24) 2304 ['block_1_depthwise_relu[0][0]
']
block_1_project_BN (BatchN (None, None, None, 24) 96 ['block_1_project[0][0]']
ormalization)
block_2_expand (Conv2D) (None, None, None, 144) 3456 ['block_1_project_BN[0][0]']
block_2_expand_BN (BatchNo (None, None, None, 144) 576 ['block_2_expand[0][0]']
rmalization)
block_2_expand_relu (ReLU) (None, None, None, 144) 0 ['block_2_expand_BN[0][0]']
block_2_depthwise (Depthwi (None, None, None, 144) 1296 ['block_2_expand_relu[0][0]']
seConv2D)
block_2_depthwise_BN (Batc (None, None, None, 144) 576 ['block_2_depthwise[0][0]']
hNormalization)
block_2_depthwise_relu (Re (None, None, None, 144) 0 ['block_2_depthwise_BN[0][0]']
LU)
block_2_project (Conv2D) (None, None, None, 24) 3456 ['block_2_depthwise_relu[0][0]
']
block_2_project_BN (BatchN (None, None, None, 24) 96 ['block_2_project[0][0]']
ormalization)
block_2_add (Add) (None, None, None, 24) 0 ['block_1_project_BN[0][0]',
'block_2_project_BN[0][0]']
block_3_expand (Conv2D) (None, None, None, 144) 3456 ['block_2_add[0][0]']
block_3_expand_BN (BatchNo (None, None, None, 144) 576 ['block_3_expand[0][0]']
rmalization)
block_3_expand_relu (ReLU) (None, None, None, 144) 0 ['block_3_expand_BN[0][0]']
block_3_pad (ZeroPadding2D (None, None, None, 144) 0 ['block_3_expand_relu[0][0]']
)
block_3_depthwise (Depthwi (None, None, None, 144) 1296 ['block_3_pad[0][0]']
seConv2D)
block_3_depthwise_BN (Batc (None, None, None, 144) 576 ['block_3_depthwise[0][0]']
hNormalization)
block_3_depthwise_relu (Re (None, None, None, 144) 0 ['block_3_depthwise_BN[0][0]']
LU)
block_3_project (Conv2D) (None, None, None, 32) 4608 ['block_3_depthwise_relu[0][0]
']
block_3_project_BN (BatchN (None, None, None, 32) 128 ['block_3_project[0][0]']
ormalization)
block_4_expand (Conv2D) (None, None, None, 192) 6144 ['block_3_project_BN[0][0]']
block_4_expand_BN (BatchNo (None, None, None, 192) 768 ['block_4_expand[0][0]']
rmalization)
block_4_expand_relu (ReLU) (None, None, None, 192) 0 ['block_4_expand_BN[0][0]']
block_4_depthwise (Depthwi (None, None, None, 192) 1728 ['block_4_expand_relu[0][0]']
seConv2D)
block_4_depthwise_BN (Batc (None, None, None, 192) 768 ['block_4_depthwise[0][0]']
hNormalization)
block_4_depthwise_relu (Re (None, None, None, 192) 0 ['block_4_depthwise_BN[0][0]']
LU)
block_4_project (Conv2D) (None, None, None, 32) 6144 ['block_4_depthwise_relu[0][0]
']
block_4_project_BN (BatchN (None, None, None, 32) 128 ['block_4_project[0][0]']
ormalization)
block_4_add (Add) (None, None, None, 32) 0 ['block_3_project_BN[0][0]',
'block_4_project_BN[0][0]']
block_5_expand (Conv2D) (None, None, None, 192) 6144 ['block_4_add[0][0]']
block_5_expand_BN (BatchNo (None, None, None, 192) 768 ['block_5_expand[0][0]']
rmalization)
block_5_expand_relu (ReLU) (None, None, None, 192) 0 ['block_5_expand_BN[0][0]']
block_5_depthwise (Depthwi (None, None, None, 192) 1728 ['block_5_expand_relu[0][0]']
seConv2D)
block_5_depthwise_BN (Batc (None, None, None, 192) 768 ['block_5_depthwise[0][0]']
hNormalization)
block_5_depthwise_relu (Re (None, None, None, 192) 0 ['block_5_depthwise_BN[0][0]']
LU)
block_5_project (Conv2D) (None, None, None, 32) 6144 ['block_5_depthwise_relu[0][0]
']
block_5_project_BN (BatchN (None, None, None, 32) 128 ['block_5_project[0][0]']
ormalization)
block_5_add (Add) (None, None, None, 32) 0 ['block_4_add[0][0]',
'block_5_project_BN[0][0]']
block_6_expand (Conv2D) (None, None, None, 192) 6144 ['block_5_add[0][0]']
block_6_expand_BN (BatchNo (None, None, None, 192) 768 ['block_6_expand[0][0]']
rmalization)
block_6_expand_relu (ReLU) (None, None, None, 192) 0 ['block_6_expand_BN[0][0]']
block_6_pad (ZeroPadding2D (None, None, None, 192) 0 ['block_6_expand_relu[0][0]']
)
block_6_depthwise (Depthwi (None, None, None, 192) 1728 ['block_6_pad[0][0]']
seConv2D)
block_6_depthwise_BN (Batc (None, None, None, 192) 768 ['block_6_depthwise[0][0]']
hNormalization)
block_6_depthwise_relu (Re (None, None, None, 192) 0 ['block_6_depthwise_BN[0][0]']
LU)
block_6_project (Conv2D) (None, None, None, 64) 12288 ['block_6_depthwise_relu[0][0]
']
block_6_project_BN (BatchN (None, None, None, 64) 256 ['block_6_project[0][0]']
ormalization)
block_7_expand (Conv2D) (None, None, None, 384) 24576 ['block_6_project_BN[0][0]']
block_7_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_7_expand[0][0]']
rmalization)
block_7_expand_relu (ReLU) (None, None, None, 384) 0 ['block_7_expand_BN[0][0]']
block_7_depthwise (Depthwi (None, None, None, 384) 3456 ['block_7_expand_relu[0][0]']
seConv2D)
block_7_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_7_depthwise[0][0]']
hNormalization)
block_7_depthwise_relu (Re (None, None, None, 384) 0 ['block_7_depthwise_BN[0][0]']
LU)
block_7_project (Conv2D) (None, None, None, 64) 24576 ['block_7_depthwise_relu[0][0]
']
block_7_project_BN (BatchN (None, None, None, 64) 256 ['block_7_project[0][0]']
ormalization)
block_7_add (Add) (None, None, None, 64) 0 ['block_6_project_BN[0][0]',
'block_7_project_BN[0][0]']
block_8_expand (Conv2D) (None, None, None, 384) 24576 ['block_7_add[0][0]']
block_8_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_8_expand[0][0]']
rmalization)
block_8_expand_relu (ReLU) (None, None, None, 384) 0 ['block_8_expand_BN[0][0]']
block_8_depthwise (Depthwi (None, None, None, 384) 3456 ['block_8_expand_relu[0][0]']
seConv2D)
block_8_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_8_depthwise[0][0]']
hNormalization)
block_8_depthwise_relu (Re (None, None, None, 384) 0 ['block_8_depthwise_BN[0][0]']
LU)
block_8_project (Conv2D) (None, None, None, 64) 24576 ['block_8_depthwise_relu[0][0]
']
block_8_project_BN (BatchN (None, None, None, 64) 256 ['block_8_project[0][0]']
ormalization)
block_8_add (Add) (None, None, None, 64) 0 ['block_7_add[0][0]',
'block_8_project_BN[0][0]']
block_9_expand (Conv2D) (None, None, None, 384) 24576 ['block_8_add[0][0]']
block_9_expand_BN (BatchNo (None, None, None, 384) 1536 ['block_9_expand[0][0]']
rmalization)
block_9_expand_relu (ReLU) (None, None, None, 384) 0 ['block_9_expand_BN[0][0]']
block_9_depthwise (Depthwi (None, None, None, 384) 3456 ['block_9_expand_relu[0][0]']
seConv2D)
block_9_depthwise_BN (Batc (None, None, None, 384) 1536 ['block_9_depthwise[0][0]']
hNormalization)
block_9_depthwise_relu (Re (None, None, None, 384) 0 ['block_9_depthwise_BN[0][0]']
LU)
block_9_project (Conv2D) (None, None, None, 64) 24576 ['block_9_depthwise_relu[0][0]
']
block_9_project_BN (BatchN (None, None, None, 64) 256 ['block_9_project[0][0]']
ormalization)
block_9_add (Add) (None, None, None, 64) 0 ['block_8_add[0][0]',
'block_9_project_BN[0][0]']
block_10_expand (Conv2D) (None, None, None, 384) 24576 ['block_9_add[0][0]']
block_10_expand_BN (BatchN (None, None, None, 384) 1536 ['block_10_expand[0][0]']
ormalization)
block_10_expand_relu (ReLU (None, None, None, 384) 0 ['block_10_expand_BN[0][0]']
)
block_10_depthwise (Depthw (None, None, None, 384) 3456 ['block_10_expand_relu[0][0]']
iseConv2D)
block_10_depthwise_BN (Bat (None, None, None, 384) 1536 ['block_10_depthwise[0][0]']
chNormalization)
block_10_depthwise_relu (R (None, None, None, 384) 0 ['block_10_depthwise_BN[0][0]'
eLU) ]
block_10_project (Conv2D) (None, None, None, 96) 36864 ['block_10_depthwise_relu[0][0
]']
block_10_project_BN (Batch (None, None, None, 96) 384 ['block_10_project[0][0]']
Normalization)
block_11_expand (Conv2D) (None, None, None, 576) 55296 ['block_10_project_BN[0][0]']
block_11_expand_BN (BatchN (None, None, None, 576) 2304 ['block_11_expand[0][0]']
ormalization)
block_11_expand_relu (ReLU (None, None, None, 576) 0 ['block_11_expand_BN[0][0]']
)
block_11_depthwise (Depthw (None, None, None, 576) 5184 ['block_11_expand_relu[0][0]']
iseConv2D)
block_11_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_11_depthwise[0][0]']
chNormalization)
block_11_depthwise_relu (R (None, None, None, 576) 0 ['block_11_depthwise_BN[0][0]'
eLU) ]
block_11_project (Conv2D) (None, None, None, 96) 55296 ['block_11_depthwise_relu[0][0
]']
block_11_project_BN (Batch (None, None, None, 96) 384 ['block_11_project[0][0]']
Normalization)
block_11_add (Add) (None, None, None, 96) 0 ['block_10_project_BN[0][0]',
'block_11_project_BN[0][0]']
block_12_expand (Conv2D) (None, None, None, 576) 55296 ['block_11_add[0][0]']
block_12_expand_BN (BatchN (None, None, None, 576) 2304 ['block_12_expand[0][0]']
ormalization)
block_12_expand_relu (ReLU (None, None, None, 576) 0 ['block_12_expand_BN[0][0]']
)
block_12_depthwise (Depthw (None, None, None, 576) 5184 ['block_12_expand_relu[0][0]']
iseConv2D)
block_12_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_12_depthwise[0][0]']
chNormalization)
block_12_depthwise_relu (R (None, None, None, 576) 0 ['block_12_depthwise_BN[0][0]'
eLU) ]
block_12_project (Conv2D) (None, None, None, 96) 55296 ['block_12_depthwise_relu[0][0
]']
block_12_project_BN (Batch (None, None, None, 96) 384 ['block_12_project[0][0]']
Normalization)
block_12_add (Add) (None, None, None, 96) 0 ['block_11_add[0][0]',
'block_12_project_BN[0][0]']
block_13_expand (Conv2D) (None, None, None, 576) 55296 ['block_12_add[0][0]']
block_13_expand_BN (BatchN (None, None, None, 576) 2304 ['block_13_expand[0][0]']
ormalization)
block_13_expand_relu (ReLU (None, None, None, 576) 0 ['block_13_expand_BN[0][0]']
)
block_13_pad (ZeroPadding2 (None, None, None, 576) 0 ['block_13_expand_relu[0][0]']
D)
block_13_depthwise (Depthw (None, None, None, 576) 5184 ['block_13_pad[0][0]']
iseConv2D)
block_13_depthwise_BN (Bat (None, None, None, 576) 2304 ['block_13_depthwise[0][0]']
chNormalization)
block_13_depthwise_relu (R (None, None, None, 576) 0 ['block_13_depthwise_BN[0][0]'
eLU) ]
block_13_project (Conv2D) (None, None, None, 160) 92160 ['block_13_depthwise_relu[0][0
]']
block_13_project_BN (Batch (None, None, None, 160) 640 ['block_13_project[0][0]']
Normalization)
block_14_expand (Conv2D) (None, None, None, 960) 153600 ['block_13_project_BN[0][0]']
block_14_expand_BN (BatchN (None, None, None, 960) 3840 ['block_14_expand[0][0]']
ormalization)
block_14_expand_relu (ReLU (None, None, None, 960) 0 ['block_14_expand_BN[0][0]']
)
block_14_depthwise (Depthw (None, None, None, 960) 8640 ['block_14_expand_relu[0][0]']
iseConv2D)
block_14_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_14_depthwise[0][0]']
chNormalization)
block_14_depthwise_relu (R (None, None, None, 960) 0 ['block_14_depthwise_BN[0][0]'
eLU) ]
block_14_project (Conv2D) (None, None, None, 160) 153600 ['block_14_depthwise_relu[0][0
]']
block_14_project_BN (Batch (None, None, None, 160) 640 ['block_14_project[0][0]']
Normalization)
block_14_add (Add) (None, None, None, 160) 0 ['block_13_project_BN[0][0]',
'block_14_project_BN[0][0]']
block_15_expand (Conv2D) (None, None, None, 960) 153600 ['block_14_add[0][0]']
block_15_expand_BN (BatchN (None, None, None, 960) 3840 ['block_15_expand[0][0]']
ormalization)
block_15_expand_relu (ReLU (None, None, None, 960) 0 ['block_15_expand_BN[0][0]']
)
block_15_depthwise (Depthw (None, None, None, 960) 8640 ['block_15_expand_relu[0][0]']
iseConv2D)
block_15_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_15_depthwise[0][0]']
chNormalization)
block_15_depthwise_relu (R (None, None, None, 960) 0 ['block_15_depthwise_BN[0][0]'
eLU) ]
block_15_project (Conv2D) (None, None, None, 160) 153600 ['block_15_depthwise_relu[0][0
]']
block_15_project_BN (Batch (None, None, None, 160) 640 ['block_15_project[0][0]']
Normalization)
block_15_add (Add) (None, None, None, 160) 0 ['block_14_add[0][0]',
'block_15_project_BN[0][0]']
block_16_expand (Conv2D) (None, None, None, 960) 153600 ['block_15_add[0][0]']
block_16_expand_BN (BatchN (None, None, None, 960) 3840 ['block_16_expand[0][0]']
ormalization)
block_16_expand_relu (ReLU (None, None, None, 960) 0 ['block_16_expand_BN[0][0]']
)
block_16_depthwise (Depthw (None, None, None, 960) 8640 ['block_16_expand_relu[0][0]']
iseConv2D)
block_16_depthwise_BN (Bat (None, None, None, 960) 3840 ['block_16_depthwise[0][0]']
chNormalization)
block_16_depthwise_relu (R (None, None, None, 960) 0 ['block_16_depthwise_BN[0][0]'
eLU) ]
block_16_project (Conv2D) (None, None, None, 320) 307200 ['block_16_depthwise_relu[0][0
]']
block_16_project_BN (Batch (None, None, None, 320) 1280 ['block_16_project[0][0]']
Normalization)
Conv_1 (Conv2D) (None, None, None, 1280) 409600 ['block_16_project_BN[0][0]']
Conv_1_bn (BatchNormalizat (None, None, None, 1280) 5120 ['Conv_1[0][0]']
ion)
out_relu (ReLU) (None, None, None, 1280) 0 ['Conv_1_bn[0][0]']
global_average_pooling2d_1 (None, 1280) 0 ['out_relu[0][0]']
(GlobalAveragePooling2D)
dense (Dense) (None, 3) 3843 ['global_average_pooling2d_1[0
][0]']
==================================================================================================
Total params: 2261827 (8.63 MB)
Trainable params: 2227715 (8.50 MB)
Non-trainable params: 34112 (133.25 KB)
__________________________________________________________________________________________________
对比原 MobileNetV2,现在就已经改成了我们需要的模型。
PyTorch 中,当我们想固定预训练模型某些层参数时,可以使用
requires_grad
=
False
。而在 TensorFlow 中,我们使用下面的方法:
for layer in model.layers[:-2]:
layer.trainable = False # 固定前 2 层参数
for layer in model.layers[-2:]:
layer.trainable = True # 后两层可训练
接下来,使用
tf.keras.preprocessing.image.ImageDataGenerator
🔗
构建数据预处理规则。同时,通过调用
tf.keras.applications.mobilenet_v2.preprocess_input
使用可预训练模型完全一致的预处理方法。最后,使用
.flow_from_directory
方法加载数据文件夹。整个过程看起来复制,代码实际上是很清晰的。
train_data = tf.keras.preprocessing.image.ImageDataGenerator(
preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input
)
train_generator = train_data.flow_from_directory(
"train/",
target_size=(224, 224),
color_mode="rgb",
batch_size=16,
class_mode="categorical",
shuffle=True,
)
Found 150 images belonging to 3 classes.
可以看到,数据加载器按子文件夹自动对数据进行了标签处理。加载了
3 个分类供 150 张训练图片。你可以通过
train_generator.classes
查看分类标签,并自行尝试查看其他属性的含义。
最后,我们编译模型并完成训练。注意,这里通过
fit_generator
🔗
从数据加载器(迭代器)中读取图片并训练。
model.compile(optimizer="Adam", loss="categorical_crossentropy", metrics=["accuracy"])
history = model.fit_generator(generator=train_generator, steps_per_epoch=10, epochs=5)
Epoch 1/5
10/10 [==============================] - 2s 109ms/step - loss: 0.8937 - accuracy: 0.5667
Epoch 2/5
10/10 [==============================] - 1s 99ms/step - loss: 0.3466 - accuracy: 0.9133
Epoch 3/5
10/10 [==============================] - 1s 97ms/step - loss: 0.1866 - accuracy: 0.9733
Epoch 4/5
10/10 [==============================] - 1s 100ms/step - loss: 0.1223 - accuracy: 0.9733
Epoch 5/5
10/10 [==============================] - 1s 115ms/step - loss: 0.0877 - accuracy: 1.0000
训练过程中,我们可以将
fit_generator
赋值给一个变量
history
,然后从中加载训练准确度和损失等指标变化并绘制成图。由于这里没有设置验证集,下方注释了相关部分代码。
from matplotlib import pyplot as plt
%matplotlib inline
# 训练集准确度和损失
acc = history.history["accuracy"]
loss = history.history["loss"]
# 验证集准确度和损失
# val_acc = history.history['val_acc']
# val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, "r", label="Training accuracy")
plt.plot(epochs, loss, "b", label="Training loss")
plt.title("Training accuracy and loss")
plt.legend(loc=0)
由于第一次接触 TensorFlow Keras 迁移学习,所以挑战前半部分提供了详细的训练过程。接下来,你需要根据前面的内容启发,自行完成模型的推理。
上面的训练过程需要一点时间,你可以开始思考挑战题目。
开放型挑战
挑战:请将训练好的 TensorFlow Keras 模型保存为正确的格式,并实现对任意链接图片进行推理。
提示:请合理利用搜索引擎等各种工具自行思考并解决此题,实现方式不定,但目标与下面的动图演示相似。
## 补充代码 ###
参考答案 Exercise 62.1
import requests
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
IMAGE_URL = input("请输入图片链接:")
res = requests.get(IMAGE_URL)
with open("test.jpg", "wb") as f:
f.write(res.content)
image = tf.keras.preprocessing.image.load_img(
"test.jpg", target_size=(224, 224))
image_a = tf.keras.preprocessing.image.img_to_array(image)
image_e = np.expand_dims(image_a, axis=0)
image_i = tf.keras.applications.mobilenet_v2.preprocess_input(image_e)
preds = np.argmax(model.predict(image_i))
if preds == 0:
title = "cat"
elif preds == 1:
title = "dog"
else:
title = "horse"
plt.title("prediction: {}".format(title))
plt.imshow(image)
期望输出:
最终,我们期望能实现对任意外部链接图片进行推理。Notebook
中可以通过
input()
实现交互输入,填写链接回车后即可得到输入图片和预测结果。特别地,预测结果显示在图片标题中。显示图片可以是原图,也可以是预处理之后的图像,不作要求。动态展示过程如下:
○ 欢迎分享本文链接到你的社交账号、博客、论坛等。更多的外链会增加搜索引擎对本站收录的权重,从而让更多人看到这些内容。