keras模型(keras自带模型)

admin 245 0

各位老铁们,大家好,今天由我来为大家分享keras模型,以及keras自带模型的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

一、怎么在keras中定义自己的目标函数

Keras中自定义目标函数(损失函数)的简单方法

Keras作为一个深度学习库,非常适合新手。在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求。具体包含目标函数和优化方法。但它也支持用户自定义目标函数,下边介绍一种最简单的自定义目标函数的方法。

要实现自定义目标函数,自然想到先看下Keras中的目标函数是怎么定义的。查下源码发现在Keras/objectives.py中,Keras定义了一系列的目标函数。

def mean_squared_error(y_true, y_pred):

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

def mean_absolute_error(y_true, y_pred):

return K.mean(K.abs(y_pred- y_true), axis=-1)

def mean_absolute_percentage_error(y_true, y_pred):

diff= K.abs((y_true- y_pred)/ K.clip(K.abs(y_true), K.epsilon(), np.inf))

return 100.* K.mean(diff, axis=-1)

def mean_squared_logarithmic_error(y_true, y_pred):

first_log= K.log(K.clip(y_pred, K.epsilon(), np.inf)+ 1.)

second_log= K.log(K.clip(y_true, K.epsilon(), np.inf)+ 1.)

return K.mean(K.square(first_log- second_log), axis=-1)

def squared_hinge(y_true, y_pred):

return K.mean(K.square(K.maximum(1.- y_true* y_pred, 0.)), axis=-1)

return K.mean(K.maximum(1.- y_true* y_pred, 0.), axis=-1)

def categorical_crossentropy(y_true, y_pred):

'''Expects a binary class matrix instead of a vector of scalar classes.

return K.categorical_crossentropy(y_pred, y_true)

def sparse_categorical_crossentropy(y_true, y_pred):

'''expects an array of integer classes.

Note: labels shape must have the same number of dimensions as output shape.

If you get a shape error, add a length-1 dimension to labels.

return K.sparse_categorical_crossentropy(y_pred, y_true)

def binary_crossentropy(y_true, y_pred):

return K.mean(K.binary_crossentropy(y_pred, y_true), axis=-1)

def kullback_leibler_divergence(y_true, y_pred):

y_true= K.clip(y_true, K.epsilon(), 1)

y_pred= K.clip(y_pred, K.epsilon(), 1)

return K.sum(y_true* K.log(y_true/ y_pred), axis=-1)

return K.mean(y_pred- y_true* K.log(y_pred+ K.epsilon()), axis=-1)

def cosine_proximity(y_true, y_pred):

y_true= K.l2_normalize(y_true, axis=-1)

y_pred= K.l2_normalize(y_pred, axis=-1)

return-K.mean(y_true* y_pred, axis=-1)

看到源码后,事情就简单多了,我们只要仿照这源码的定义形式,来定义自己的loss就可以了。例如举个最简单的例子,我们定义一个loss为预测值与真实值的差,则可写为:

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

然后,将这段代码放到你的模型中编译,例如

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

有一点需要注意,Keras作为一个高级封装库,它的底层可以支持theano或者tensorflow,在使用上边代码时,首先要导入这一句

from keras import backend as K

最近一段时间,我们米筐科技量化策略研究团队在自己的策略研究平台上,做了一些量化分析方面的特征工程和特征选择研究。关于它们在量化交易中的应用,我可以分享一下我们团队的经验。

首先,追本溯源,为什么特征工程和特征选择值得讨论?在实际的数据分析和建模中,我们通常要面对两种情况:1数据集中已有的特征变量不够多,或者已有的特征变量不足以充分表征数据的特点;2我们拥有大量的特征,需要判断出哪些是相关特征,哪些是不相关特征。特征工程解决的是第一个问题,而特征选择解决的是第二个问题。

对于特征工程来说,它的的难点在于找到好的思路,来产生能够表征数据特点的新特征变量;而特征选择的难点则在于,其本质是一个复杂的组合优化问题(combinatorial optimization)。例如,如果有 30个特征变量,当我们进行建模的时候,每个特征变量有两种可能的状态:“保留”和“被剔除”。那么,这组特征维度的状态集合中的元素个数就是2^{30}。更一般地,如果我们有 N个特征变量,则特征变量的状态集合中的元素个数就是2^{N}。因此,从算法角度讲,通过穷举的方式进行求解的时间复杂度是指数级的(O(2^{N}))。当 N足够大时,特征筛选将会耗费大量的时间和计算资源(图1)。在实际应用中,为了减少运算量,目前特征子集的搜索策略大都采用贪心算法(greedy algorithm),其核心思想是在每一步选择中,都采纳当前条件下最好的选择,从而获得组合优化问题的近似最优解。

二、keras是什么

1、Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化[1]。

2、Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度[1]。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型[2]。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件[3]。

3、Keras的主要开发者是谷歌工程师François Chollet,此外其GitHub项目页面包含6名主要维护者和超过800名直接贡献者[4]。Keras在其正式版本公开后,除部分预编译模型外,按MIT许可证开放源代码

三、Keras快速构建神经网络模型

深度学习框架Keras——像搭积木般构建神经网络,主要分为7个部分,每个部分只需要几个keras API函数就能实现,用户即可像搭积木般一层层构建神经网络模型。

下面章节会对每一部分具体来介绍。。。

Keras中主要有三类模型:Sequential model, Functional model, Subclass model

在开始创建模型之前,首先需要引入tensorflow和keras模块,然后再创建一个Sequential model

layers参数可以为空,然后通过add method向模型中添加layer,相对应的通过pop method移除模型中layer。

创建Function API模型,可以调用Keras.Model来指定多输入多数出。

Layers是神经网络基本构建块。一个Layer包含了tensor-in/tensor-out的计算方法和一些状态,并保存在TensorFlow变量中(即layers的权重weights)。

Layers主要分为6个类别,基础层,核心层,卷基层,池化层,循环层,融合层。

对派生类的实现可以用以下方法:

** init():定义layer的属性,创建layer的静态变量。

** build(self, input_shape):创建依赖于输入的变量,可以调用add_weight()。

** call(self,*args,**kwargs):在确保已调用build()之后,在 call中调用。

** get_config(self):返回包含用于初始化此层的配置的字典类型。

创建SimpleDense派生类,在build()函数里添加trainable weights。实现y=input*w+b

创建ComputeSum派生类,在 init函数里添加 non-trainable weights。实现输入矩阵沿轴0元素相加后,x=x+self.total

核心层是最常用的层,涉及到数据的转换和处理的时候都会用到这些层。

Dense层就是所谓的全连接神经网络层,简称全连接层。全连接层中的每个神经元与其前一层的所有神经元进行全连接。

Dense实现以下操作: output= activation(dot(input, kernel)+ bias)其中 activation是按逐个元素计算的激活函数,kernel是由网络层创建的权值矩阵,以及 bias是其创建的偏置向量(只在 use_bias为 True时才有用)。

将激活函数应用于输出。输入信号进入神经元后进行的运算处理。

sigmoid、tanh、ReLU、softplus的对比曲线如下图所示:

激活函数可以通过设置单独的激活层Activation实现,也可以在构造层对象时通过传递 activation参数实现:

Dropout在训练中每次更新时,将输入单元的按比率随机设置为0,这有助于防止过拟合。未设置为0的输入将按1/(1-rate)放大,以使所有输入的总和不变。

请注意,仅当训练设置为True时才应用Dropout层,以便在推理过程中不会丢弃任何值。使用model.fit时,训练将自动适当地设置为True。

将输入展平。不影响批量大小。注意:如果输入的形状是(batch,)没有特征轴,则展平会增加通道尺寸,而输出的形状是(batch, 1)。

将任意表达式封装为Layer对象。在Lambda层,以便在构造模型时可以使用任意TensorFlow函数。 Lambda层最适合简单操作或快速实验。 Lambda层是通过序列化Python字节码来保存的。

使用覆盖值覆盖序列,以跳过时间步。

对于输入张量的每一个时间步(张量的第一个维度),如果所有时间步中输入张量的值与mask_value相等,则将在所有下游层中屏蔽(跳过)该时间步。如果任何下游层不支持覆盖但仍然收到此类输入覆盖信息,会引发异常。

Embedding是一个将离散变量转为连续向量表示的一个方式。该层只能用作模型中的第一层。

Embedding有以下3个主要目的:在 embedding空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。作为监督性学习任务的输入。用于可视化不同离散变量之间的关系.

由维基百科的介绍我们可以得知,卷积是一种定义在两个函数(𝑓跟𝑔)上的数学操作,旨在产生一个新的函数。那么𝑓和𝑔的卷积就可以写成𝑓∗𝑔,数学定义如下:

对应到不同方面,卷积可以有不同的解释:𝑔既可以看作我们在深度学习里常说的核(Kernel),也可以对应到信号处理中的滤波器(Filter)。而𝑓可以是我们所说的机器学习中的特征(Feature),也可以是信号处理中的信号(Signal)。f和g的卷积(𝑓∗𝑔)就可以看作是对𝑓的加权求和。

卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。

一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波。

2D卷积层(例如对图像的空间卷积)。

3D卷积层(例如体积上的空间卷积)

深度可分离1D卷积。该层执行分别作用在通道上的深度卷积,然后是混合通道的逐点卷积。如果use_bias为True并提供了一个偏差初始值设定项,则它将偏差向量添加到输出中。然后,它可选地应用激活函数以产生最终输出。

深度可分离的2D卷积。可分离的卷积包括首先执行深度空间卷积(它分别作用于每个输入通道),然后是点向卷积,它将混合所得的输出通道。 depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。

直观上,可分离的卷积可以理解为将卷积内核分解为两个较小内核的一种方式,或者是Inception块的一种极端版本。

转置卷积层(有时被成为反卷积)。对转置卷积的需求一般来自希望使用与正常卷积相反方向的变换,将具有卷积输出尺寸的东西转换为具有卷积输入尺寸的东西,同时保持与所述卷积相容的连通性模式。

池化层是模仿人的视觉系统对数据进行降维,用更高层次的特征表示图像。实施池化的目的:降低信息冗余;提升模型的尺度不变性、旋转不变性。防止过拟合。

通常有最大池化层,平均池化层。

池化层有三种形态:1D用于一维数据,2D一般用于二维图像数据,3D带时间序列数据的图像数据

循环神经网络(Recurrent Neural Network,简称 RNN),循环神经网络的提出便是基于记忆模型的想法,期望网络能够记住前面出现的特征,并依据特征推断后面的结果,而且整体的网络结构不断循环,因此得名为循环神经网络。

长短期记忆网络(Long-Short Term Memory, LSTM)论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。

GRU门控循环单元- Cho et al. 2014.

在LSTM中引入了三个门函数:输入门、遗忘门和输出门来控制输入值、记忆值和输出值。而在GRU模型中只有两个门:分别是更新门和重置门。与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加”实用“的GRU。

您可以通过使用关键字参数 initial_state调用它们来符号化地指定 RNN层的初始状态。 initial_state的值应该是表示 RNN层初始状态的张量或张量列表。

可以通过调用带有关键字参数 states的 reset_states方法来数字化地指定 RNN层的初始状态。 states的值应该是一个代表 RNN层初始状态的 Numpy数组或者 Numpy数组列表。

可以使用 RNN. call(以及 RNN.call)的 constants关键字参数将「外部」常量传递给单元。这要求 cell.call方法接受相同的关键字参数 constants。这些常数可用于调节附加静态输入(不随时间变化)上的单元转换,也可用于注意力机制。

在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!