深度学习开发框架Keras

一、Keras安装及配置

1、安装Keras

由于Keras是tensorflow的封装,必须先安装tensorflow才能使用

pip install h5py   # 支持模型保存和载入
pip install tensorflow   # 只有python3.5之后版本才能安装TensorFlow
pip install keras

中文文档

2、配置Keras

一旦,Keras 被安装完成,你需要去修改后端文件,也就是去确定,你需要 TensorFlow 作为后端,还是 Theano 作为后端,修改的配置文件位于 ~/.keras/keras.json

{
  "floatx": "float32",
  "epsilon": 1e-07,
  "backend": "tensorflow",
  "image_data_format": "channels_last"
}

请注意,参数 image_data_format 是 channels_last ,也就是说这个后端是 TensorFlow。因为,在TensorFlow中图像的存储方式是[height, width, channels],但是在Theano中是完全不同的,也就是 [channels, height, width]。因此,如果你没有正确的设置这个参数,那么你模型的中间结果将是非常奇怪的。对于Theano来说,这个参数就是channels_first。

二、使用keras搭建网络

1、建模

Keras 有两种不同的神经网络建模方式
(1)Sequential models(序贯模型)
这种方法用于实现一些简单的模型,这样建立的神经网络模型就是一层一层的结构。

from keras.models import Sequential
#创建序贯模型
model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))

(2)Functional API(函数式模型)
序列模型,可以实现简单的神经网络算法,然而很多时候我们的模型并不是严格的序列化模型。你的网络可能是network-in-network形式的,或者有多输入,多输出(图像分割)等等。 这个时候序列模型就不可行了,你需要用到keras的Functional API。这是一种更加灵活的定义方式,可是实现多输入和多输出的深度网络结构。Functional API接受tensors返回tensor,多个函数组合到一起就是一个框架, 也就是keras.models里面的Model类。
在函数式模型中,所有的模型都是可调用的,就像层一样,很容易利用可以训练好的模型,提供tensor进行调用。调用训练好的模型时,不仅仅是重用结构,也是重用权重。
这时候必须先使用keras.Input将输出转换为tensor

from keras import Input
input_tensor = Input(shape=(64,))

使用keras.models.Model将定义好的模型转换为函数式框架

from keras.models import Sequential, Model
from keras import layers
from keras import Input
input_tensor = Input(shape=(784,))
x = layers.Dense(128, activation='relu')(input_tensor)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = Model(input_tensor, output_tensor)

更多介绍
kaggle上的模型示例

# define CNN model using keras

# input 1
Input_figure = Input(shape=(75,75,3), name='input1')
# input 2
Input_angle = Input(shape=(1,), name = 'input2')

x = Conv2D(13, kernel_size=(3,3))(Input_figure)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Dropout(0.3)(x)

x = Conv2D(21, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Dropout(0.3)(x)

x = Conv2D(34, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2,2))(x)
x = Dropout(0.3)(x)

x = Conv2D(55, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2,2))(x)
x = Dropout(0.3)(x)

x = GlobalMaxPool2D()(x)

# concatenate x and input 2
x = concatenate([x, Input_angle])

x = Dense(89)(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = Dropout(0.3)(x)
x = Dense(89, activation='elu')(x)
out = Dense(1, activation='sigmoid')(x)

model = Model(inputs=[Input_figure, Input_angle], outputs=out)

2、模型查看、编译、训练、验证

(1)使用model.summary()方法来查看模型架构

model.summary()

(2)使用model.compile()方法来进行模型编译

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

通过compile来对学习过程进行配置,它接收三个参数。

参数 含义 说明
optimizer 优化器 该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的自定义对象。
loss 损失函数 该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个自定义的损失函数。
metrics 评价指标列表 对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个自定义的指标函数。

用法举例如下

# 二元分类问题,采用预定义指标
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',  # 二分类的对数损失
              metrics=['accuracy'])  # 准确率

# 二分类问题,自定义指标函数
import keras.backend as K

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

def my_loss(y_true, y_pred):
    return K.mean((y_pred-y_true),axis = -1)

model.compile(optimizer='rmsprop',
              loss=my_loss,
              metrics=['accuracy', mean_squared_error])

# 多分类问题
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',  # 多类的对数损失
              metrics=['accuracy']) # 准确率

# 回归问题
model.compile(optimizer='rmsprop',
              loss='mse')   # 均方误差

(3)使用model.fit()方法来进行模型训练

# 模型训练
history = model.fit(train_tensors, train_targets, 
                         validation_data=(valid_tensors, valid_targets),
                         epochs=epochs, 
                         batch_size=batch_size, 
                         callbacks=[checkpointer], 
                         verbose=1)
参数 说明
batch_size 在使用批量梯度下降法训练时候就需要将数据集分成几个 batch。Batch_size是指一个 batch 中的样本总数。
epochs 训练轮数(周期),当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch(每 epoch 完成对整数据集的一次遍历)。随着 epoch 数量增加,神经网络中的权重的更新次数也增加,曲线从欠拟合变得过拟合。
那么,几个 epoch 才是合适的呢?不幸的是,这个问题并没有正确的答案。对于不同的数据集,答案是不一样的。但是数据的多样性会影响合适的 epoch 的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。
Iteration(迭代) 迭代是 batch 需要完成一个 epoch 的次数。记住:在一个 epoch 中,batch 数和迭代数是相等的。比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。
verbose 进度表示方式。0表示不显示数据,1表示显示进度条,2表示用只显示一个数据。
callbacks 回调函数列表。就是函数执行完后自动调用的函数列表
validation_split 验证数据的使用比例。
validation_data 被用来作为验证数据的(X, y)元组。会代替validation_split所划分的验证数据。
class_weigh 分类权值键值对。键为类别,值为该类别对应的权重。只在训练过程中衡量损失函数用。
shuffle 布尔类型。是否数据混洗。(只对训练集有效)

(4)使用model.evalute方法来进行模型验证,展示模型在验证数据上的效果,其中参数和fit函数中的参数基本一致。

model.evalute(X, 
              y, 
              batch_size=128, 
              show_accuracy=False,
              verbose=1, 
              sample_weight=None)

我们可以使用以下命令来快捷的评估模型:

# Scoring the model
score = model.evaluate(X, y)
print("\nAccuracy: ", score[-1])

(5)使用模型对新数据做预测
用于对测试数据的预测,返回:对于测试数据的预测数组

model.predict(X, 
              batch_size=128, 
              verbose=1)

3、模型保存和载入

keras中的模型主要包括model和weight两个部分
(1)保存/加载整个模型
包括(结构 + 权重 + 优化器状态),不建议使用 pickle 或 cPickle 来保存 Keras 模型
可以使用 model.save(filepath) 将 Keras 模型保存到单个 HDF5 文件中,该文件将包含:

  • 模型的结构,允许重新创建模型
  • 模型的权重
  • 训练配置项(损失函数,优化器)
  • 优化器状态,允许准确地从你上次结束的地方继续训练。

可以使用 keras.models.load_model(filepath) 重新实例化模型。load_model 还将负责使用保存的训练配置项来编译模型(除非模型从未编译过)。
示例:

from keras.models import load_model

# 创建 HDF5 文件 'my_model.h5'
model.save('my_model.h5')  

# 删除现有模型
del model  

# 返回一个编译好的模型
# 与之前那个相同
model = load_model('my_model.h5')

(2)只保存/加载模型的结构
只需要保存模型的结构,而非其权重或训练配置项
方法一:json文件

from keras.models import model_from_json

# 保存为 JSON
json_string = model.to_json()

# 从 JSON 重建模型:
model = model_from_json(json_string)

方法二:Yaml文件

from keras.models import model_from_yaml

# 保存为 YAML
yaml_string = model.to_yaml()

# 从 YAML 重建模型:
model = model_from_yaml(yaml_string)

(3)只保存/加载模型的权重
如果只需要模型的权重,可以使用下面的代码以 HDF5 格式进行保存。
请注意,我们首先需要安装 HDF5 和 Python 库 h5py,它们不包含在 Keras 中。

# 保存权重
model.save_weights('my_model_weights.h5')

# 假设你有用于实例化模型的代码,则可以将保存的权重加载到具有相同结构的模型中
model.load_weights('my_model_weights.h5')

# 如果你需要将权重加载到不同的结构(有一些共同层)的模型中,例如微调或迁移学习,则可以按层的名字来加载权重
model.load_weights('my_model_weights.h5', by_name=True)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容