热线电话:13121318867

登录
2020-06-08 阅读量: 1469
keras介绍-梦神

一、keras介绍

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

Keras最初是作为ONEIROS(开放式神经电子智能机器人操作系统)项目研究工作的一部分而开发的。

“ Oneiroi超出了我们的解释范围,谁能确定他们说的是什么故事?并不是所有男人想要的东西都过去了。那里有两扇门可以通向稍纵即逝的Oneiroi;一扇是由角制成的,一扇是象牙。穿过锯齿的象牙是骗人的,传达的信息是不会实现的;那些通过打磨的角出来的象牙在他们身后具有真理,这对于看到它们的人来说是可以实现的。” 荷马,奥德赛19。562 ff(Shewring翻译)。

  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随TensorFlow 2.0打包在一起tensorflow.keras。要开始使用Keras,只需安装TensorFlow 2.0即可

Keras / TensorFlow与以下设备兼容:

  • Python 3.5–3.8
  • Ubuntu 16.04或更高版本
  • Windows 7或更高版本
  • macOS 10.12.6(Sierra)或更高版本。

二、序贯模型

  1. 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/

33.3678
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子