keras常用代码模块介绍——layer模块

相比TensorFlow,keras更加简便易学,学习成本更低,大家只要做到对常用代码模块有所了解,基本就可以按照自己的思路搭建想要的模型。其实这个系列的文章是自己学习过程的笔记而已,部分内容摘抄自官网,也有很多自己不懂的地方,但也希望能帮助大家快速对keras有个认识。

1.通用层

每一个layer的实例都可以使用以下方法:

layer.get_weights()#获取当前层的权重
layer.set_weights()#从numpy中载入权重
layer.get_config()#获取当前层配置信息
layer.input#获取当前层的输入
layer.output#获取当前层的输出
layer.input_shape#获取当前层的输入形状
layer.output_shape#获取当前层的输出形状

通用层的方法其本质都是为了让你检查数据、保存数据用的,方便中间代码的调试过程。

2.高级激活层

说到高级激活了,应该会比较高大上,其实就是对常用的RELU、TANH等函数进行一下稍微的改变而已。这个层封装在keras.layers.advanced_activations里,具体有啥来看一下:

keras.layers.advanced_activations.LeakyReLU(alpha=0.3)#x<0返回x*alpha,x>0返回x
keras.layers.advanced_activations.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)#规则和上一个相同,只不过这个时候的alpha变为了一个和x相同形状的、可训练的向量
keras.layers.advanced_activations.ELU(alpha=1.0)#x<0时,f(x) = alpha * (exp(x) - 1.), x>=0时,f(x) = x
keras.layers.advanced_activations.ThresholdedReLU(theta=1.0)#x > theta时,f(x) = x,x<= theata时,f(x) = 0

3.卷积层

这一层只有做卷积神经网络的时候才有用,卷积的方法也是千千万万,但是基本思路是一样的。这一层的方法都在keras.layers.convolutional里,具体的方法方面明显参数变多了。最常用的是Conv1D和Conv2D。

keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)#参数不重要,和我们讲卷积神经网络原理时看到的一样。
keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)#对二维参数的卷积,就是处理图像的时候经常用
keras.layers.convolutional.Conv3D(filters, kernel_size, strides=(1, 1, 1), padding='valid', data_format=None, dilation_rate=(1, 1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)#三维卷积,也是针对图像来的
keras.layers.convolutional.SeparableConv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, depth_multiplier=1, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)#可分离卷积,就是卷积过程分两步,可能是计算效率更高。
keras.layers.convolutional.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)#这是一个反卷积的情况,就是讲卷积以后的向量反向变换回去。

除此之外,卷积层里还有很多辅助的方法,可以帮助开发者做各种操作。

keras.layers.convolutional.Cropping1D(cropping=(1, 1))#参数为在指定的位置要裁多少元素
keras.layers.convolutional.Cropping2D(cropping=((0, 0), (0, 0)), data_format=None)#图像元素的裁剪
keras.layers.convolutional.Cropping3D(cropping=((1, 1), (1, 1), (1, 1)), data_format=None)#三维方向进行裁剪
keras.layers.convolutional.UpSampling1D(size=2)#将元素重复多少步
keras.layers.convolutional.UpSampling2D(size=(2, 2), data_format=None)#将元素在二维方向上重复多少步
keras.layers.convolutional.UpSampling3D(size=(2, 2, 2), data_format=None)#讲元素在三维方向上重复多少步
keras.layers.convolutional.ZeroPadding1D(padding=1)#一维方向首尾填充0
keras.layers.convolutional.ZeroPadding2D(padding=(1, 1), data_format=None)#二维方向首尾填充0
keras.layers.convolutional.ZeroPadding2D(padding=(1, 1), data_format=None)#三维方向首尾填充0

4.池化层

池化层紧跟卷积层,是对数据降维的一个过程,常用的最大池化和平均池化,但是有学者证明最大池化效果更好,所以通常采用最大池化。

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
keras.layers.GlobalMaxPooling2D(data_format=None)
keras.layers.GlobalAveragePooling2D(data_format=None)

global的池化一般用于最后一层,就是将每一个特征图作为一个特征点,然后可以避免送入全连接层的元素太多,有时候也可以替代全连接层使用。

5.其他常用层

这些层都在keras.layers.core,基本建模涉及到数据的转换和处理的时候都会用到这些层。

5.1 dense层

全连接层就是实现点乘加偏置操作

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

5.2 Activation层

把激活函数加入这一层

keras.layers.core.Activation(activation)

5.3 Dropout层

为了要减少操作要经常性的删除一些不用的元素,dropout层就是以一定概率删除一些层

keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

5.4 Flatten层

这个和numpy的flatten是一样的,就是将多维数据拉平,方便后续操作。

keras.layers.core.Flatten()

5.5 Reshape层

这个是对输入的形状进行重排,排列成自己想要成为的样子。

keras.layers.core.Reshape(target_shape)

5.6 Permute层

维度交换层,两个维护互相交换,为了计算方便,可以满足矩阵乘法的法则。RNN和CNN进行连接的时候可能会用到该层,这一层的其他使用场景也很多。

keras.layers.core.Permute(dims)

5.7 RepeatVector层

将输入重复n次。

keras.layers.core.RepeatVector(n)

5.8 Lambda层

这个lambda和lambda表达式的lambda是一样的,用于推广函数应用的。

keras.layers.core.Lambda(function, output_shape=None, mask=None, arguments=None)

5.9 ActivityRegularizer

对权重加l1和l2损失的。

keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)

5.10 Masking层

在神经网络或者说人工智能里,mask都是都是屏蔽信号用的,就是说到了这一步计算不起作用。

keras.layers.core.Masking(mask_value=0.0)

6 embedding层

这个层是一个词向量嵌入的层,怎么说更好呢,就是你有一堆词,扔进embedding里就成了用一堆向量表示的词,一个词用好几个数字表示。embedding层是这样的,keras.layers.embeddings。

keras.layers.embeddings.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

7.LocallyConnceted

局部连接层,和卷积很像,只不过是权重不共享,每一部分用的权值都是不同的。这一层放在keras.layers.local里。

7.1 LocallyConnected1D层

和Conv1D类似,同样权值是不共享的。

keras.layers.local.LocallyConnected1D(filters, kernel_size, strides=1, padding='valid', data_format=None, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

7.2 LocallyConnected2D层

和Conv2D类似,同样权值是不共享的。

keras.layers.local.LocallyConnected2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

8.Merge层

Merge层用于两个张量的拼接,也是比较常用的操作,都是layer里已大写字母开头的方法。

8.1 Add层

顾名思义,两个相同维度的张量相加,返回一个新的tensor。

keras.layers.Add()

8.2 SubStract层

这一层和add相对应,是减的,返回的也是一个新tensor。

keras.layers.SubStract()

8.3 Multiply层

这个乘法到了keras都是点乘,就是元素乘

keras.layers.Multiply()

8.4 Average层

返回平均值

keras.layers.Average()

8.5 Maximum层

返回逐元素对比的最大值

keras.layers.Maximum()

8.6 Concatenate层

按照指定的轴将tensor拼接到一起,axis=0行拼接,axis=-1列拼接

keras.layers.Concatenate(axis = -1)

8.7 Dot层

dot在神经网络中的意思是对应位置相乘相加,所以dot层就是相乘相加的一个过程。

keras.layers.Dot(axes, normalize=False)

8.8 add层

Add层的函数式包装,方便使用和运算。

keras.layers.add(inputs)#inputs是两个以上的张量

同理8.2-8.7都有这么一个包装函数,看你需要自己使用。

9.Noise层

这一层是为了增加模型的鲁棒性而添加的,方法都包装在keras.layers.noise这里边。

9.1 GaussianNoise层

加入符合正态分布的噪声,主要是为防止过拟合。

keras.layers.noise.GaussianNoise(stddev)

9.2 GaussianDropout层

加入以1为均值,标准差为sqrt(rate/(1-rate)的乘性高斯噪声,只在训练时候起作用。

keras.layers.noise.GaussianDropout(rate)

9.3 Alpha Dropout层

Alpha Dropout是一种保持输入均值和方差不变的Dropout,具体用法尚未探索到,先留着,后续解决。

keras.layers.noise.AlphaDropout(rate, noise_shape=None, seed=None)

10.规范化层

做标准化用的,将数据转化到0-1之间。

keras.layers.normalization.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

11.recurrent层

这一个是针对循环神经网络的层,里边包括了RNN、LSTM等,全都封装在keras.layers.recurrent里。

11.1 Recurrent层

这个是recurrent层的抽象,不能直接用。

keras.layers.recurrent.Recurrent(return_sequences=False, go_backwards=False, stateful=False, unroll=False, implementation=0)

这里这个return_sequences是关键参数,为False是输出最后一层的参数,为True是输出所有层的参数。

11.2 SimpleRNN层

简单的RNN。

keras.layers.SimpleRNN(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)

11.2 GRU层

rnn的改进,参数和SimpleRnn差不多。

keras.layers.recurrent.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)

11.3 LSTM层

rnn的另一种改进。

keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)

11.4 ConvLSTM2D层

ConvLSTM2D是一个LSTM网络,但它的输入变换和循环变换是通过卷积实现的,这个不太理解,也不咋用。

keras.layers.ConvLSTM2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, go_backwards=False, stateful=False, dropout=0.0, recurrent_dropout=0.0)

11.5 SimpleRNN/GRU/LSTMCell层

cell类,其实就是将一个细胞单元表示出来。

keras.layers.LSTMCell(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1)

11.6 StackedRNNCells层

将多个层包装成一个层。

keras.layers.StackedRNNCells(cells)

11.7 CuDNNGRU/LSTM层

基于CuDNN的快速GRU/LSTM实现,只能在GPU上运行,只能使用tensoflow为后端

keras.layers.CuDNNGRU(units, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, return_state=False, stateful=False)

12.Wrapper层

用于给各个层进行相关的包装操作。

12.1 TimeDistributed层

该包装器可以把一个层应用到输入的每一个时间步上。

keras.layers.wrappers.TimeDistributed(layer)

12.2 Bidirectional层

用于包装双向RNN和LSTM。

keras.layers.wrappers.Bidirectional(layer, merge_mode='concat', weights=None)

此外你还可以编写自己的层,给一个小案例进行参考。

from keras import backend as K
from keras.engine.topology import Layer
import numpy as np

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):
        return K.dot(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容