th与tf的区别
==================
Keras提供了两套后端,Theano和Tensorflow,
th和tf的大部分功能都被backend统一包装起来了,但二者还是存在不小的冲突,有时候你需要特别注意Keras是运行在哪种后端之上,它们的主要冲突有:
dim_ordering,也就是维度顺序。比方说一张224*224的彩色图片,theano的维度顺序是(3,224,224),即通道维在前。而tf的维度顺序是(224,224,3),即通道维在后。
卷积层权重的shape:从无到有训练一个网络,不会有任何问题。但是如果你想把一个th训练出来的卷积层权重载入风格为tf的卷积层……说多了都是泪。我一直觉得这个是个bug,数据的dim_ordering有问题就罢了,为啥卷积层权重的shape还需要变换咧?我迟早要提个PR把这个bug修掉!
然后是卷积层kernel的翻转不翻转问题,这个我们说过很多次了,就不再多提。
数据格式的区别,channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。(tf 默认的格式是(rows,cols,channels),f 默认的格式是(channels,rows,cols))
以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。
譬如:
vgg16_weights_th_dim_ordering_th_kernels_notop.h5
vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
注意:在th下,由于模型默认的格式是channel_last的(height,wdith,channels),如果要使用channel_first(channels,height,wdith)的格式,可以在最前面加上这一句:
K.set_image_data_format('channels_first')
rows是行的大小,即图像的height。
cols是列的大小,即图像的width。
notop的含义
==================
notop代表是否包括顶层的全连接层,默认include_top=True,包括全连接层。
以VGG16模型为例:
keras.applications.vgg16.VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000)
VGG16 模型,权值由 ImageNet 训练而来。
该模型可同时构建于 channels_first
(通道,高度,宽度) 和 channels_last
(高度,宽度,通道)两种输入维度顺序。
模型默认输入尺寸是 224x224。
参数
- include_top: 是否包括顶层的全连接层。
- weights:
None
代表随机初始化,'imagenet'
代表加载在 ImageNet 上预训练的权值。 - input_tensor: 可选,Keras tensor 作为模型的输入(即
layers.Input()
输出的 tensor)。 - input_shape: 可选,输入尺寸元组,仅当
include_top=False
时有效,否则输入形状必须是(244, 244, 3)
(对于channels_last
数据格式),或者(3, 244, 244)
(对于channels_first
数据格式)。它必须拥有 3 个输入通道,且宽高必须不小于 32。例如(200, 200, 3)
是一个合法的输入尺寸。 - pooling: 可选,当
include_top
为False
时,该参数指定了特征提取时的池化方式。None
代表不池化,直接输出最后一层卷积层的输出,该输出是一个四维张量。'avg'
代表全局平均池化(GlobalAveragePooling2D),相当于在最后一层卷积层后面再加一层全局平均池化层,输出是一个二维张量。'max'
代表全局最大池化
- classes: 可选,图片分类的类别数,仅当
include_top
为True
并且不加载预训练权值时可用