keras入门简介
一、keras介绍
Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及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