keras中文文档笔记12——协助使用Keras
预训练模型
Application应用 Kera的应用模块Application提供了带有预训练权重的Keras模型,这些模型可以用来进行预测、特征提取和finetune
模型的预训练权重将下载到~/.keras/models/并在载入模型时自动载入
可用的模型 应用于图像分类的模型,权重训练自ImageNet: Xception VGG16 VGG19 ResNet50 * InceptionV3
所有的这些模型(除了Xception)都兼容Theano和Tensorflow,并会自动基于~/.keras/keras.json的Keras的图像维度进行自动设置。例如,如果你设置data_format=”channel_last”,则加载的模型将按照TensorFlow的维度顺序来构造,即“Width-Height-Depth”的顺序
图片分类模型的示例 利用ResNet50网络进行ImageNet分类
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as npmodel = ResNet50(weights='imagenet')img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])
# Predicted: [(u'n02504013', u'Indian_elephant', 0.82658225), (u'n01871265', u'tusker', 0.1122357), (u'n02504458', u'African_elephant', 0.061040461)]
利用VGG16提取特征
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as npmodel = VGG16(weights='imagenet', include_top=False)img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)features = model.predict(x)
从VGG19的任意中间层中抽取特征
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as npbase_model = VGG19(weights='imagenet')
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)block4_pool_features = model.predict(x)
在新类别上精细调节inceptionV3
from keras.applications.inception_v3 import InceptionV3
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K# create the base pre-trained model
base_model = InceptionV3(weights='imagenet', include_top=False)# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(1024, activation='relu')(x)
# and a logistic layer -- let's say we have 200 classes
predictions = Dense(200, activation='softmax')(x)# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)# first: train only the top layers (which were randomly initialized)
# i.e. freeze all convolutional InceptionV3 layers
for layer in base_model.layers:
layer.trainable = False# compile the model (should be done *after* setting layers to non-trainable)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')# train the model on the new data for a few epochs
model.fit_generator(...)# at this point, the top layers are well trained and we can start fine-tuning
# convolutional layers from inception V3. We will freeze the bottom N layers
# and train the remaining top layers.# let's visualize layer names and layer indices to see how many layers
# we should freeze:
for i, layer in enumerate(base_model.layers):
print(i, layer.name)# we chose to train the top 2 inception blocks, i.e. we will freeze
# the first 172 layers and unfreeze the rest:
for layer in model.layers[:172]:
layer.trainable = False
for layer in model.layers[172:]:
layer.trainable = True# we need to recompile the model for these modifications to take effect
# we use SGD with a low learning rate
from keras.optimizers import SGD
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy')# we train our model again (this time fine-tuning the top 2 inception blocks
# alongside the top Dense layers
model.fit_generator(...)
在定制的输入tensor上构建InceptionV3
from keras.applications.inception_v3 import InceptionV3
from keras.layers import Input# this could also be the output a different Keras model or layer
input_tensor = Input(shape=(224, 224, 3))# this assumes K.image_data_format() == 'channels_last'model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=True)
Xception模型
keras.applications.xception.Xception(include_top=True, weights='imagenet',input_tensor=None, input_shape=None,pooling=None, classes=1000)
Xception V1 模型, 权重由ImageNet训练而言
在ImageNet上,该模型取得了验证集top1 0.790和top5 0.945的正确率
注意,该模型目前仅能以TensorFlow为后端使用,由于它依赖于”SeparableConvolution”层,目前该模型只支持channels_last的维度顺序(width, height, channels)
默认输入图片大小为299x299
VGG16模型
keras.applications.vgg16.VGG16(include_top=True, weights='imagenet',input_tensor=None, input_shape=None,pooling=None,classes=1000)
VGG16模型,权重由ImageNet训练而来
该模型再Theano和TensorFlow后端均可使用,并接受channels_first和channels_last两种输入维度顺序
模型的默认输入尺寸时224x224
VGG19模型
keras.applications.vgg19.VGG19(include_top=True, weights='imagenet',input_tensor=None, input_shape=None,pooling=None,classes=1000)
VGG19模型,权重由ImageNet训练而来
该模型在Theano和TensorFlow后端均可使用,并接受channels_first和channels_last两种输入维度顺序
模型的默认输入尺寸时224x224
ResNet50模型
keras.applications.resnet50.ResNet50(include_top=True, weights='imagenet',
input_tensor=None, input_shape=None,
pooling=None,
classes=1000)
50层残差网络模型,权重训练自ImageNet
该模型在Theano和TensorFlow后端均可使用,并接受channels_first和channels_last两种输入维度顺序
模型的默认输入尺寸时224x224
InceptionV3模型
keras.applications.inception_v3.InceptionV3(include_top=True,weights='imagenet',input_tensor=None,input_shape=None,pooling=None,classes=1000)
InceptionV3网络,权重训练自ImageNet
该模型在Theano和TensorFlow后端均可使用,并接受channels_first和channels_last两种输入维度顺序
模型的默认输入尺寸时299x299
常用数据库 CIFAR10 小图片分类数据集 该数据库具有50,000个32*32的彩色图片作为训练集,10,000个图片作为测试集。图片一共有10个类别。
使用方法
from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
CIFAR100 小图片分类数据库 该数据库具有50,000个32*32的彩色图片作为训练集,10,000个图片作为测试集。图片一共有100个类别,每个类别有600张图片。这100个类别又分为20个大类。
使用方法
from keras.datasets import cifar100
(X_train, y_train), (X_test, y_test) = cifar100.load_data(label_mode='fine')
IMDB影评倾向分类 本数据库含有来自IMDB的25,000条影评,被标记为正面/负面两种评价。影评已被预处理为词下标构成的序列。方便起见,单词的下标基于它在数据集中出现的频率标定,例如整数3所编码的词为数据集中第3常出现的词。这样的组织方法使得用户可以快速完成诸如“只考虑最常出现的10,000个词,但不考虑最常出现的20个词”这样的操作
按照惯例,0不代表任何特定的词,而用来编码任何未知单词
使用方法
from keras.datasets import imdb
(X_train, y_train), (X_test, y_test) = imdb.load_data(path="imdb.npz",nb_words=None,skip_top=0,maxlen=None,test_split=0.1)seed=113,start_char=1,oov_char=2,index_from=3)
路透社新闻主题分类 本数据库包含来自路透社的11,228条新闻,分为了46个主题。与IMDB库一样,每条新闻被编码为一个词下标的序列。
使用方法
from keras.datasets import reuters
(X_train, y_train), (X_test, y_test) = reuters.load_data(path="reuters.npz",nb_words=None,skip_top=0,maxlen=None,test_split=0.2,seed=113,start_char=1,oov_char=2,index_from=3)
参数的含义与IMDB同名参数相同,唯一多的参数是: test_split,用于指定从原数据中分割出作为测试集的比例。该数据库支持获取用于编码序列的词下标:
word_index = reuters.get_word_index(path="reuters_word_index.json")
上面代码的返回值是一个以单词为关键字,以其下标为值的字典。例如,word_index[‘giraffe’]的值可能为1234
MNIST手写数字识别 本数据库有60,000个用于训练的28*28的灰度手写数字图片,10,000个测试图片
使用方法
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
Boston房屋价格回归数据集 本数据集由StatLib库取得,由CMU维护。每个样本都是1970s晚期波士顿郊区的不同位置,每条数据含有13个属性,目标值是该位置房子的房价中位数(千dollar)。
使用方法
from keras.datasets import boston_housing
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()
模型可视化 keras.utils.vis_utils模块提供了画出Keras模型的函数(利用graphviz)
该函数将画出模型结构图,并保存成图片:
from keras.utils import plot_model
plot_model(model, to_file='model.png')
我们也可以直接获取一个pydot.Graph对象,然后按照自己的需要配置它,例如,如果要在ipython中展示图片
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dotSVG(model_to_dot(model).create(prog='dot', format='svg'))
【Tips】依赖 pydot-ng 和 graphviz,若出现错误,用命令行输入pip install pydot-ng & brew install graphviz
工具 本模块提供了一系列有用工具
CustomObjectScope
keras.utils.generic_utils.CustomObjectScope()
提供定制类的作用域,在该作用域内全局定制类能够被更改,但在作用域结束后将回到初始状态。 以with声明开头的代码将能够通过名字访问定制类的实例,在with的作用范围,这些定制类的变动将一直持续,在with作用域结束后,全局定制类的实例将回归其在with作用域前的状态。
with CustomObjectScope({"MyObject":MyObject}):
layer = Dense(..., W_regularizer="MyObject")
# save, load, etc. will recognize custom object by name
HDF5Matrix
keras.utils.io_utils.HDF5Matrix(datapath, dataset, start=0, end=None, normalizer=None)
这是一个使用HDF5数据集代替Numpy数组的方法
提供start和end参数可以进行切片,另外,还可以提供一个正规化函数或匿名函数,该函数将会在每片数据检索时自动调用。
x_data = https://www.it610.com/article/HDF5Matrix('input/file.hdf5', 'data')
model.predict(x_data)
to_categorical
to_categorical(y, num_classes=None)
将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵, 用于应用到以categorical_crossentropy为目标函数的模型中.
normalize
normalize(x, axis=-1, order=2)
对numpy数组规范化,返回规范化后的数组
convert_all_kernels_in_model
convert_all_kernels_in_model(model)
将模型中全部卷积核在Theano和TensorFlow模式中切换
plot_model
plot_model(model, to_file='model.png', show_shapes=False, show_layer_names=True)
绘制模型图
custom_object_scope
custom_object_scope()
提供定制类的作用域,在该作用域内全局定制类能够被更改,但在作用域结束后将回到初始状态。 以with声明开头的代码将能够通过名字访问定制类的实例,在with的作用范围,这些定制类的变动将一直持续,在with作用域结束后,全局定制类的实例将回归其在with作用域前的状态。
本函数返回CustomObjectScope对象
with custom_object_scope({"MyObject":MyObject}):
layer = Dense(..., W_regularizer="MyObject")
# save, load, etc. will recognize custom object by name
get_custom_objects
get_custom_objects()
检索全局定制类,推荐利用custom_object_scope更新和清理定制对象,但get_custom_objects可被直接用于访问_GLOBAL_CUSTOM_OBJECTS。本函数返回从名称到类别映射的全局字典。
get_custom_objects().clear()
get_custom_objects()["MyObject"] = MyObject
serialize_keras_object
serialize_keras_object(instance)
将keras对象序列化
deserialize_keras_object
eserialize_keras_object(identifier, module_objects=None, custom_objects=None, printable_module_name='object')
从序列中恢复keras对象
get_file
get_file(fname, origin, untar=False, md5_hash=None, file_hash=None, cache_subdir='datasets', hash_algorithm='auto', extract=False, archive_format='auto', cache_dir=None)
从给定的URL中下载文件, 可以传递MD5值用于数据校验(下载后或已经缓存的数据均可)
默认情况下文件会被下载到~/.keras中的cache_subdir文件夹,并将其文件名设为fname,因此例如一个文件example.txt最终将会被存放在`~/.keras/datasets/example.txt~
tar,tar.gz.tar.bz和zip格式的文件可以被提取,提供哈希码可以在下载后校验文件。命令喊程序shasum和sha256sum可以计算哈希值。
Keras后端 Keras提供了两种后端引擎Theano/Tensorflow,并将其函数统一封装,使得用户可以以同一个接口调用不同后端引擎的函数
- Theano是一个开源的符号主义张量操作框架,由蒙特利尔大学LISA/MILA实验室开发。
- TensorFlow是一个符号主义的张量操作框架,由Google开发。
- CNTK是一个由微软开发的商业级工具包。
如果你至少运行过一次Keras,你将在下面的目录下找到Keras的配置文件:
$HOME/.keras/keras.json
如果该目录下没有该文件,你可以手动创建一个
文件的默认配置如下:
{
"image_data_format": "channels_last",
"epsilon": 1e-07,
"floatx": "float32",
"backend": "tensorflow"
}
将backend字段的值改写为你需要使用的后端:theano或tensorflow或者CNTK,即可完成后端的切换。
我们也可以通过定义环境变量KERAS_BACKEND来覆盖上面配置文件中定义的后端:
KERAS_BACKEND=tensorflow python -c "from keras import backend;
"
Using TensorFlow backend.
使用抽象的Keras后端来编写代码 如果你希望你编写的Keras模块能够同时在Theano和TensorFlow两个后端上使用,你可以通过Keras后端接口来编写代码,这里是一个简介:
from keras import backend as K
下面的代码实例化了一个输入占位符,等价于tf.placeholder() ,T.matrix(),T.tensor3()等
input = K.placeholder(shape=(2, 4, 5))
# also works:
input = K.placeholder(shape=(None, 4, 5))
# also works:
input = K.placeholder(ndim=3)
下面的代码实例化了一个共享变量(shared),等价于tf.variable()或 theano.shared()
val = np.random.random((3, 4, 5))
var = K.variable(value=https://www.it610.com/article/val)# all-zeros variable:
var = K.zeros(shape=(3, 4, 5))
# all-ones:
var = K.ones(shape=(3, 4, 5))
大多数你需要的张量操作都可以通过统一的Keras后端接口完成,而不关心具体执行这些操作的是Theano还是TensorFlow
a = b + c * K.abs(d)
c = K.dot(a, K.transpose(b))
a = K.sum(b, axis=2)
a = K.softmax(b)
a = concatenate([b, c], axis=-1)
# etc...
Kera后端函数 太多了, 此处省略n字……
Scikit-Learn接口包装器 我们可以通过包装器将Sequential模型(仅有一个输入)作为Scikit-Learn工作流的一部分,相关的包装器定义在keras.wrappers.scikit_learn.py中
目前,有两个包装器可用:
- keras.wrappers.scikit_learn.KerasClassifier(build_fn=None,
**sk_params)实现了sklearn的分类器接口 - keras.wrappers.scikit_learn.KerasRegressor(build_fn=None,
**sk_params)实现了sklearn的回归器接口
推荐阅读
- ts泛型使用举例
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- P5 DS——构件与文档关联
- EdgeDB 架构简析
- LaTeX记录|LaTeX记录 —— LaTeX文档基本结构
- android|android today上下卡片,【精品文档】关于计算机专业大学生安卓系统有关的外文文献翻译成品(基于Android(安卓)的考勤管理系统(中英文双语对照)
- 《DOM知识点总结》
- BLAS|BLAS API 中文文档(2)(待续)
- 用c#转换word或excel文档为html文件|用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
- elasticsearch分析器