keras入门简介

一、keras介绍

  Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。

  Keras是一个高层神经网络API,Keras由纯Python编写而成并基TensorflowTheano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
  • 支持CNN和RNN,或二者的结合
  • 无缝CPU和GPU切换

Keras的设计原则是

  • 用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。
  • 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
  • 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。
  • 与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。

二、序贯模型

Keras中主要的模型是Sequential模型,Sequential是一系列网络层按顺序构成的栈,也就是“一条路走到黑”。

from keras.models import Sequential
from keras.layers import Dense, Activation
#定义模型
model = Sequential()

#添加第一层神经网络,第一层需要明确输入的维度,这里是100,64表示输入层后面的隐藏层节点数
model.add(Dense(units=64, input_dim=100))
model.add(Activation("relu"))
#添加第二层神经网络,第二层就不需要明确输入层,上面的64个节点的隐藏层就是该输入层,该层的节点数是10
model.add(Dense(units=10))
model.add(Activation("softmax"))

#深度模型框架搭建好后,需要编译模型;编译模型时必须指明损失函数和优化器
model.compile(loss=\'categorical_crossentropy\', optimizer=\'sgd\', metrics=[\'accuracy\'])
#也可以自己定制损失函数
from keras.optimizers import SGD
model.compile(loss=\'categorical_crossentropy\', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))

#完成模型编译后,我们在训练数据上按batch进行一定次数的迭代来训练网络
model.fit(x_train, y_train, epochs=5, batch_size=32)
#当然,我们也可以手动将一个个batch的数据送入网络中训练,这时候需要使用:
model.train_on_batch(x_batch, y_batch)

#模型评估
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

#模型预测
classes = model.predict(x_test, batch_size=128)

序贯模型细节参考:https://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/

三、函数式(Functional)模型

函数式模型的输入是张量,输出也是张量。

from keras.layers import Input, Dense
from keras.models import Model

# 输入层
inputs = Input(shape=(784,))

#Dense的输入是张量,输出也是张量
x = Dense(64, activation=\'relu\')(inputs) #第一个隐藏层
x = Dense(64, activation=\'relu\')(x) #第二个隐藏层
predictions = Dense(10, activation=\'softmax\')(x) #输出层

model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer=\'rmsprop\',
              loss=\'categorical_crossentropy\',
              metrics=[\'accuracy\'])
model.fit(data, labels)  # 开始训练

利用函数式模型的接口,我们可以很容易的重用已经训练好的模型:你可以把模型当作一个层一样,通过提供一个tensor来调用它。注意当你调用一个模型时,你不仅仅重用了它的结构,也重用了它的权重。

x = Input(shape=(784,))
# This works, and returns the 10-way softmax we defined above.
y = model(x)

四、例子

1)回归模型

# Regressor example
# Code: https://github.com/keloli/KerasPractise/edit/master/Regressor.py

import numpy as np
np.random.seed(1337)  
from keras.models import Sequential 
from keras.layers import Dense
import matplotlib.pyplot as plt

# 创建数据集
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)    # 将数据集随机化
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, )) # 假设我们真实模型为:Y=0.5X+2
# 绘制数据集plt.scatter(X, Y)
plt.show()

X_train, Y_train = X[:160], Y[:160]     # 把前160个数据放到训练集
X_test, Y_test = X[160:], Y[160:]       # 把后40个点放到测试集

# 定义一个model,
model = Sequential () # Keras有两种类型的模型,序贯模型(Sequential)和函数式模型
                      # 比较常用的是Sequential,它是单输入单输出的
model.add(Dense(output_dim=1, input_dim=1)) # 通过add()方法一层层添加模型
                                            # Dense是全连接层,第一层需要定义输入,
                                            # 第二层无需指定输入,一般第二层把第一层的输出作为输入

# 定义完模型就需要训练了,不过训练之前我们需要指定一些训练参数
# 通过compile()方法选择损失函数和优化器
# 这里我们用均方误差作为损失函数,随机梯度下降作为优化方法
model.compile(loss=\'mse\', optimizer=\'sgd\')

# 开始训练
print(\'Training -----------\')
for step in range(301):
    cost = model.train_on_batch(X_train, Y_train) # Keras有很多开始训练的函数,这里用train_on_batch()
    if step % 100 == 0:
        print(\'train cost: \', cost)

# 测试训练好的模型
print(\'\nTesting ------------\')
cost = model.evaluate(X_test, Y_test, batch_size=40)
print(\'test cost:\', cost)
W, b = model.layers[0].get_weights()    # 查看训练出的网络参数
                                        # 由于我们网络只有一层,且每次训练的输入只有一个,输出只有一个
                                        # 因此第一层训练出Y=WX+B这个模型,其中W,b为训练出的参数
print(\'Weights=\', W, \'\nbiases=\', b)

# plotting the prediction
Y_pred = model.predict(X_test)
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred)
plt.show()

2) 手写数字识别

# _*_ coding: utf-8 _*_
# Classifier mnist

import numpy as np
np.random.seed(1337)  
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop

# 下载数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 数据预处处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255. 
X_test = X_test.reshape(X_test.shape[0], -1) / 255.  
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)

# 不使用model.add(),用以下方式也可以构建网络
model = Sequential([
    Dense(400, input_dim=784),
    Activation(\'relu\'),
    Dense(10),
    Activation(\'softmax\'),
])

# 定义优化器
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(optimizer=rmsprop,
              loss=\'categorical_crossentropy\',
              metrics=[\'accuracy\']) # metrics赋值为\'accuracy\',会在训练过程中输出正确率

# 这次我们用fit()来训练网路
print(\'Training ------------\')
model.fit(X_train, y_train, epochs=4, batch_size=32)

print(\'\nTesting ------------\')
# 评价训练出的网络
loss, accuracy = model.evaluate(X_test, y_test)

print(\'test loss: \', loss)
print(\'test accuracy: \', accuracy)

参考链接:

  https://www.jianshu.com/p/e9c1e68a615e

https://keras-cn.readthedocs.io/en/latest/#keraspython

  https://keras.io/zh/losses/