http://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/
https://keras-cn.readthedocs.io/en/latest/
https://blog.keras.io/
这就是Keras
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
支持CNN和RNN,或二者的结合
无缝CPU和GPU切换
Keras的核心数据结构是“模型”,模型是一种组织网络层的方式
# 模型输入张量
Input(shape=(input_dim,), dtype='float32', name='main_input')
# concatenate数据并联
keras.layers.concatenate([main_input, site_input, access_input])
Dense(200, activation='relu',
kernel_initializer='lecun_uniform', kernel_regularizer=regularizers.l2(regularizer))(x0)
Dropout(dropout)(x)
# 定义模型三个输入,一个输出
model = Model(inputs=[main_input, site_input, access_input], outputs=[x])
一个简单的demo
from keras.models import Sequential
# 构建一个模型
model = Sequential()
from keras.layers import Dense, Activation
model.add(Dense(units=64, input_dim=100))
model.add(Activation("relu"))
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))
# 模型训练
model.fit(x_train, y_train, epochs=5, batch_size=32)
# 分批训练
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)
序贯(Sequential)模型
序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。
https://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/
函数式(Functional)模型
层对象接受张量为参数,返回一个张量。
支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。
输入是张量,输出也是张量的一个框架就是一个模型,通过Model定义。
这样的模型可以被像Keras的Sequential一样被训练
符号计算
无论是Theano还是TensorFlow,都是一个“符号式”的库。
符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。
建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还是一个“空壳子”,里面没有任何实际的数据,只有当你把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
因为符号计算能够提供关键的计算优化、自动求导等功能。
张量
张量可以看作是向量、矩阵的自然推广,我们用张量来表示广泛的数据类型。
张量的阶数有时候也称为维度,或者轴 axis
data_format
“channels_first”,即通道维靠前。(100,3,16,32) theano caffe
“channels_last”,(100,16,32,3) tensorflow
batch
深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。
这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
Keras中用的优化器SGD是stochastic gradient descent的缩写
epochs
epochs指的就是训练过程中数据将被“轮”多少次,就这样
卷积层
Conv1D层:一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波
Conv2D层:二维卷积层,即对图像的空域卷积
Conv3D层:三维卷积对三维的输入进行滑动窗卷积
常用层
常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接、激活层等
Dense层:常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)
Activation层:激活层对一个层的输出施加激活函数
Dropout层:为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时按一定概率(rate) 随机断开输入神经元,Dropout层用于防止过拟合。
Flatten层:用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。
Reshape层:用来将输入shape转换为特定的shape
嵌入层 Embedding
嵌入层将正整数(下标)转换为具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
Embedding层只能作为模型的第一层
Merge层
Add:
添加输入列表的图层。
该层接收一个相同shape列表张量,并返回它们的和,shape不变。
SubStract:
两个输入的层相减。
Concatenate:
该层接收一个列表的同shape张量,并返回它们的按照给定轴相接构成的向量。
(批)规范化BatchNormalization
该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1
BN层的作用:
(1)加速收敛 (2)控制过拟合,可以少用或不用Dropout和正则 (3)降低网络对初始化权重不敏感 (4)允许使用较大的学习率