关于Keras Dense层整理

我就废话不多说了,大家还是直接看代码吧!

'''
Created on 2018-4-4

'''
keras.layers.core.Dense(
units, #代表该层的输出维度
activation=None, #激活函数.但是默认 liner
use_bias=True, #是否使用b
kernel_initializer='glorot_uniform', #初始化w权重,keras/initializers.py
bias_initializer='zeros', #初始化b权重
kernel_regularizer=None, #施加在权重w上的正则项,keras/regularizer.py
bias_regularizer=None, #施加在偏置向量b上的正则项
activity_regularizer=None, #施加在输出上的正则项
kernel_constraint=None, #施加在权重w上的约束项
bias_constraint=None #施加在偏置b上的约束项
)

# 所实现的运算是output = activation(dot(input, kernel)+bias)
# model.add(Dense(units=64, activation='relu', input_dim=784))

# keras初始化所有激活函数,activation:
# keras\activations.py
# keras\backend\cntk_backend.py
# import cntk as C
# 1.softmax:
#       对输入数据的最后一维进行softmax,一般用在输出层;
#   ndim == 2,K.softmax(x),其实调用的是cntk,是一个模块;
#   ndim >= 2,e = K.exp(x - K.max(x)),s = K.sum(e),return e / s
# 2.elu
#   K.elu(x)
# 3.selu: 可伸缩的指数线性单元
#   alpha = 1.6732632423543772848170429916717
#   scale = 1.0507009873554804934193349852946
#   return scale * K.elu(x, alpha)
# 4.softplus
#   C.softplus(x)
# 5.softsign
#   return x / (1 + C.abs(x))
# 6.relu
#   def relu(x, alpha=0., max_value=None):
#     if alpha != 0.:
#       negative_part = C.relu(-x)
#     x = C.relu(x)
#     if max_value is not None:
#       x = C.clip(x, 0.0, max_value)
#     if alpha != 0.:
#       x -= alpha * negative_part
#     return x
# 7.tanh
#   return C.tanh(x)
# 8.sigmoid
#   return C.sigmoid(x)
# 9.hard_sigmoid
#   x = (0.2 * x) + 0.5
#   x = C.clip(x, 0.0, 1.0)
#   return x
# 10.linear
#   return x

# keras初始化所有方法,initializer:
# Zeros
# Ones
# Constant(固定一个值)
# RandomNormal(正态分布)
# RandomUniform(均匀分布)
# TruncatedNormal(截尾高斯分布,神经网络权重和滤波器的推荐初始化方法)
# VarianceScaling(该初始化方法能够自适应目标张量的shape)
# Orthogonal(随机正交矩阵初始化)
# Identiy(单位矩阵初始化,仅适用于2D方阵)
# lecun_uniform(LeCun均匀分布初始化)
# lecun_normal(LeCun正态分布初始化)
# glorot_normal(Glorot正态分布初始化)
# glorot_uniform(Glorot均匀分布初始化)
# he_normal(He正态分布初始化)
# he_uniform(He均匀分布初始化,Keras中文文档写错了)

# keras正则化,regularizer:
# import backend as K
# L1: regularization += K.sum(self.l1 * K.abs(x))
# L2: regularization += K.sum(self.l2 * K.square(x))

补充知识:keras.layers.Dense()方法及其参数

一、Dense层

keras.layers.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)

二、参数

units: 神经元节点数数,鸡输出空间维度。

activation: 激活函数,若不指定,则不使用激活函数 (即线性激活: a(x) = x)。

use_bias: 布尔值,该层是否使用偏置向量。

kernel_initializer: kernel 权值矩阵的初始化器

bias_initializer: 偏置向量的初始化器

kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数

bias_regularizer: 运用到偏置向的的正则化函数

activity_regularizer: 运用到层的输出的正则化函数 (它的 “activation”)。

kernel_constraint: 运用到 kernel 权值矩阵的约束函数

bias_constraint: 运用到偏置向量的约束函数

三、示例

例1:

from keras.layers import Dense

# 作为 Sequential 模型的第一层
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
# 其输出数组的尺寸为 (*, 32)

# 在第一层之后,你就不再需要指定输入的尺寸了:
model.add(Dense(32))

注意在Sequential模型的第一层要定义Dense层的形状,此处定义为input_shape=(16,)

例2:

from keras.layers import Dense

model = Sequential()
model.add(Dense(512, activation= 'sigmoid', input_dim= 2, use_bias= True))

这里定义了一个有512个神经元节点,使用sigmoid激活函数的神经层,此时输入形状参数为input_dim,注意它与input_shape参数的区别。

input_shape:即张量的形状,从前往后对应由外向内的维度

[[1],[2],[3]] 这个张量的shape为(3,1)

[[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]]这个张量的shape为(3,2,2),

[1,2,3,4]这个张量的shape为(4,)

input_dim:代表张量的维度,之前3个例子的input_dim分别为2,3,1。

常见的一种用法:只提供了input_dim=32,说明输入是一个32维的向量,相当于一个一阶、拥有32个元素的张量,它的shape就是(32,)。因此,input_shape=(32, )

四、总结

本文对Dense()方法及其参数做了详细的介绍,并对其用法进行了大概的讲解,有什么问题可以评论区留言或者联系我,我会及时解答。希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Keras预训练模型ResNet50进行图像分类方式

    Keras提供了一些用ImageNet训练过的模型:Xception,VGG16,VGG19,ResNet50,InceptionV3.在使用这些模型的时候,有一个参数include_top表示是否包含模型顶部的全连接层,如果包含,则可以将图像分为ImageNet中的1000类,如果不包含,则可以利用这些参数来做一些定制的事情. 在运行时自动下载有可能会失败,需要去网站中手动下载,放在"~/.keras/models/"中,使用WinPython则在"settings/.ke

  • 使用keras实现densenet和Xception的模型融合

    我正在参加天池上的一个竞赛,刚开始用的是DenseNet121但是效果没有达到预期,因此开始尝试使用模型融合,将Desenet和Xception融合起来共同提取特征. 代码如下: def Multimodel(cnn_weights_path=None,all_weights_path=None,class_num=5,cnn_no_vary=False): ''' 获取densent121,xinception并联的网络 此处的cnn_weights_path是个列表是densenet和xce

  • 在keras下实现多个模型的融合方式

    在网上搜过发现关于keras下的模型融合框架其实很简单,奈何网上说了一大堆,这个东西官方文档上就有,自己写了个demo: # Function:基于keras框架下实现,多个独立任务分类 # Writer: PQF # Time: 2019/9/29 import numpy as np from keras.layers import Input, Dense from keras.models import Model import tensorflow as tf # 生成训练集 data

  • Keras使用ImageNet上预训练的模型方式

    我就废话不多说了,大家还是直接看代码吧! import keras import numpy as np from keras.applications import vgg16, inception_v3, resnet50, mobilenet #Load the VGG model vgg_model = vgg16.VGG16(weights='imagenet') #Load the Inception_V3 model inception_model = inception_v3.I

  • 关于Keras Dense层整理

    我就废话不多说了,大家还是直接看代码吧! ''' Created on 2018-4-4 ''' keras.layers.core.Dense( units, #代表该层的输出维度 activation=None, #激活函数.但是默认 liner use_bias=True, #是否使用b kernel_initializer='glorot_uniform', #初始化w权重,keras/initializers.py bias_initializer='zeros', #初始化b权重 k

  • 使用keras根据层名称来初始化网络

    keras根据层名称来初始化网络 def get_model(input_shape1=[75, 75, 3], input_shape2=[1], weights=None): bn_model = 0 trainable = True # kernel_regularizer = regularizers.l2(1e-4) kernel_regularizer = None activation = 'relu' img_input = Input(shape=input_shape1) a

  • 解决Keras 自定义层时遇到版本的问题

    在2.2.0版本前, from keras import backend as K from keras.engine.topology import Layer class MyLayer(Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): # 为该层

  • 给keras层命名,并提取中间层输出值,保存到文档的实例

    更新: 感谢评论区提供的方案. 采用model.summary(),model.get_config()和for循环均可获得Keras的层名. 示例如下图 对于keras特定层的命名,只需在层内添加 name 即可 model.add(Activation('softmax',name='dense_1') ) # 注意 name 要放于函数内 #提取中间层 from keras.models import Model import keras layer_name = 'dense_1' #获

  • Keras实现支持masking的Flatten层代码

    不知道为什么,我总是需要实现某种骚操作,而这种骚操作往往是Keras不支持的.例如,我有一个padding过的矩阵,那么它一定是带masking的,然后我想要把它Flatten,再输入到Dense层.然而Keras的Flatten层不支持masking. Keras原本Flatten的实现 class Flatten(Layer): def __init__(self, **kwargs): super(Flatten, self).__init__(**kwargs) self.input_s

  • keras 自定义loss层+接受输入实例

    loss函数如何接受输入值 keras封装的比较厉害,官网给的例子写的云里雾里, 在stackoverflow找到了答案 You can wrap the loss function as a inner function and pass your input tensor to it (as commonly done when passing additional arguments to the loss function). def custom_loss_wrapper(input_

  • 浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)

    池化层定义在tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( inputs, pool_size, strides, padding='valid', data_format='channels_last', name=None ) inputs: 进行池化的数据. pool_size: 池化的核大小(pool_height, pool_width),如[3,3].

  • Keras自定义实现带masking的meanpooling层方式

    Keras确实是一大神器,代码可以写得非常简洁,但是最近在写LSTM和DeepFM的时候,遇到了一个问题:样本的长度不一样.对不定长序列的一种预处理方法是,首先对数据进行padding补0,然后引入keras的Masking层,它能自动对0值进行过滤. 问题在于keras的某些层不支持Masking层处理过的输入数据,例如Flatten.AveragePooling1D等等,而其中meanpooling是我需要的一个运算.例如LSTM对每一个序列的输出长度都等于该序列的长度,那么均值运算就只应该

  • 解决Keras的自定义lambda层去reshape张量时model保存出错问题

    前几天忙着参加一个AI Challenger比赛,一直没有更新博客,忙了将近一个月的时间,也没有取得很好的成绩,不过这这段时间内的确学到了很多,就在决赛结束的前一天晚上,准备复现使用一个新的网络UPerNet的时候出现了一个很匪夷所思,莫名其妙的一个问题.谷歌很久都没有解决,最后在一个日语网站上看到了解决方法. 事后想想,这个问题在后面搭建网络的时候会很常见,但是网上却没有人提出解决办法,So, I think that's very necessary for me to note this.

  • 解决keras加入lambda层时shape的问题

    使用keras时,加入keras的lambda层以实现自己定义的操作.但是,发现操作结果的shape信息有问题. 我的后端是theano,使用了sum操作. 比如输入时,shape为(32,28,28),其中32为batch大小. 此时对应的ndim应该等于3. 但是,lambda处理后结果显示_keras_shape为(32,28,28),而ndim却是2. 这导致后边各项操作都会出现问题. 此处sum函数加入参数keepdims=True即可. 此注意keras中的各种层几乎都不用去理会ba

随机推荐