Keras各种layer的作用及用法--简要总结(不断更新中)

  1. BatchNormalization layer:
    通常在线性向非线性转变时使用,如下:
model.add(Dense(100,input_dim=20))
model.add(BatchNormalization())
model.add(Activation('relu'))

作用:
能够保证权重的尺度不变,因为BatchNormalization在激活函数前对输入进行了标准化

另一个流行的做法:
在2D卷积与激活函数前,进行Normalization,如下:

def Conv2DReluBatchNorm(n_filter, w_filter, h_filter, inputs):
    return BatchNormalization()(Activation(activation='relu')(Convolution2D(n_filter, w_filter, h_filter, border_mode='same')(inputs)))

在一些code中,bias=False的意思简单明了,目的是为了减少参数。

model.add(Dense(64, bias=False))
  1. Maxpooling layer
    池化层是基于采样的离散过程(sample-based discretization process)。
    听起来好复杂的样子,简单来说,即对input进行采样,降低input的维度,减少了参数(简化了计算),增强了模型的泛化能力,也降低了overfitting的可能性。

Max_pooling

简单来说,就是用22的filter过滤原输入,得到每一个22格子中值最大的元素,构成新的输入。
注意,这些2*2的格子没有Overlap。

直观的例子如下,经过Max_pooling后,一帧图像相当于被采样成一个更小的图像,但保存了原始图像的大量特征:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Pijyntd-1595469511984)(https://imgconvert.csdnimg.cn/aHR0cDovL3VwbG9hZC1pbWFnZXMuamlhbnNodS5pby91cGxvYWRfaW1hZ2VzLzI1MjgzMTAtZDc3NjEwMzVlYzc1MTdhNS5wbmc?x-oss-process=image/format,png])

Max_pooling layer只能用于图像吗?不是的,目前CNN在text classification领域也大有可为。只要是CNN, max_pooling layer都可以尝试一下。
以上图片来自,Stanford’s CS231n, http://cs231n.stanford.edu。

  1. pad_sequences & Masking layer
    上面提到,文本数据也可以用CNN来处理。很多人有疑问,CNN的输入通常是一个(图像)矩阵,而文本中句子或者文章的长度不一,CNN如何将长短不一的输入转化成矩阵呢?
    答案是pad_sequences
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32',
    padding='pre', truncating='pre', value=0.)

sequences: 所有的句子
maxlen: 把所有句子的长度都定为maxlen,如果是None,则maxlen自动设置为sequences中最长的那个
padding: 在句子前端(pre)或后端(post)填充
truncating: 截断过长的句子,从前端(pre)或者后端(post)截断
value: 填充的数值

假设我们使用0填充,那么多无用的0,会不会影响结果呢?
对于CNN来说,是不影响的。
对于RNN也需要pad_sequences,此时填充的0是多余的,就需要使用Masking layer忽略其中的0值。

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))
  1. Flatten layer & Dense layer
    Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到(Convolution)全连接层(Dense)的过渡。
model = Sequential()
model.add(Convolution2D(64, 3, 3,
            border_mode='same',
            input_shape=(3, 32, 32)))
# now: model.output_shape == (None, 64, 32, 32)
model.add(Flatten())
# now: model.output_shape == (None, 65536)
model.add(Dense(32))

也就是说,Convolution卷积层之后是无法直接连接Dense全连接层的,需要把Convolution层的数据压平(Flatten),然后就可以直接加Dense层了。上面code最后一行, Dense(32)表示output的shape为(*,32)。

注意,当Dense作为第一层时,需要specify输入的维度,之后就不用了,如下:

# as first layer in a sequential model:
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)

# after the first layer, you don't need to specify
# the size of the input anymore:
model.add(Dense(32))
  1. Dropout layer
    如dropout的名字,就是要随机扔掉当前层一些weight,相当于废弃了一部分Neurons。
    它还有另一个名字 dropout regularization, 所以你应该知道它有什么作用了:

降低模型复杂度,增强模型的泛化能力,防止过拟合[1]。
顺带降低了运算量。。。
[1] Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014). Dropout: A simple way to prevent neural networks from overfitting. The Journal of Machine Learning Research, 15(1), 1929-1958.

model = Sequential()
model.add(Dense(60, input_dim=60, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.2))
model.add(Dense(30, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.2))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

转载自https://www.jianshu.com/p/86d667ee3c62

<think>好的,我现在需要回答用户关于Keras深度学习框架的询问。首先,用户提供了几个系统级指令,要求所有行内数学表达式用$...$格式,独立公式用$$...$$,并且要生成相关问题。同时,回答需要用中文,结构清晰,引用末尾添加标识。 首先,我需要整理Keras的基本信息。根据提供的引用,Keras是一个基于Python的高级API,支持TensorFlow、JAX等后端,特点是模块化和易用性。引用[1]、[2]、[4]、[5]都提到了这些点。需要确保正确引用这些来源,比如在介绍特点时引用[2]和[5]。 接下来,用户可能想了解Keras的核心功能。引用[3]提到Keras适合开发和实现深度学习任务,尤其是需要Python库的场景。需要强调其模块化设计,如引用[2]所述。这里要注意数学表达式的格式,如果有涉及公式的地方,比如神经网络的损失函数,需要用$...$包裹,例如$L = \frac{1}{n}\sum_{i=1}^n(y_i - \hat{y}_i)^2$。 然后,安装方法部分,引用[5]提到了如何安装Keras,需要简要说明安装步骤,比如pip install keras,并确保后端如TensorFlow已安装。 应用场景部分,引用[1]和[3]指出Keras广泛应用于图像识别、自然语言处理等领域,可以举例说明。同时,如果有数学表达式,比如卷积层输出尺寸的计算公式,需要用独立公式格式: $$ O = \frac{W - F + 2P}{S} + 1 $$ 其中变量需要用$符号包裹,如输入宽度$W$,滤波器尺寸$F$等。 在生成相关问题部分,需要根据用户可能感兴趣的方面提问,比如Keras与其他框架的比较、优缺点、模型构建步骤、常见API等,确保问题覆盖全面。 最后,检查引用标识是否正确添加,比如每个引用末尾的[^1]、[^2]等是否对应正确的来源。同时,确保所有数学表达式符合格式要求,没有使用错误的括号或遗漏$符号。 现在将这些内容组织成结构清晰的回答,分点介绍,并生成相关问题。需要注意避免使用Markdown格式,但根据用户指示,这里可能允许使用代码块展示示例代码,如构建模型的Python代码,需用三个反引号包裹。 总结步骤: 1. 介绍Keras的基本概念和背景,引用相关来源。 2. 分点说明核心特点,如高级API、模块化、多后端支持。 3. 安装方法,引用对应来源。 4. 应用场景,举例说明。 5. 代码示例,展示简单模型构建。 6. 数学公式的正确应用。 7. 生成相关问题。 检查是否有遗漏的引用或格式错误,确保回答准确且符合用户要求。</think>### Keras深度学习框架介绍 #### 一、基本概念与背景 Keras是一个用Python编写的高级深度学习API,能够在TensorFlow、JAX或PyTorch等后端框架上运行[^4][^5]。其设计目标是简化神经网络模型的构建与训练过程,通过模块化接口隐藏底层实现细节,使得开发者无需关注复杂的数学运算(如梯度下降公式$ \theta_{t+1} = \theta_t - \eta \nabla_\theta L $)即可快速实现模型[^2]。 #### 二、核心特点 1. **高级API抽象** Keras提供直观的层(Layer)、模型(Model)、优化器(Optimizer)等抽象接口。例如,构建一个全连接网络仅需: ```python from keras.models import Sequential model = Sequential() model.add(Dense(64, activation='relu', input_dim=100)) model.add(Dense(10, activation='softmax')) ``` 这种设计显著降低了代码复杂度[^2]。 2. **模块化设计** 通过组合层、损失函数(如交叉熵损失$L = -\sum y_i \log \hat{y}_i$)和评估指标,用户可以灵活定制模型结构[^2][^3]。 3. **多后端支持** 支持TensorFlow、Theano、CNTK等计算引擎,用户可通过配置文件切换后端。 #### 三、安装与配置 安装Keras仅需执行: ```bash pip install keras ``` 但需提前安装后端框架(如TensorFlow)。若使用GPU加速,还需配置CUDA和cuDNN[^5]。 #### 四、典型应用场景 1. **图像分类** 使用卷积神经网络(CNN)时,特征图尺寸可通过公式计算: $$ O = \frac{W - F + 2P}{S} + 1 $$ 其中$W$为输入宽度,$F$为滤波器尺寸,$P$为填充,$S$为步长。 2. **自然语言处理** 循环神经网络(RNN)的时间步计算可表示为: $$ h_t = \sigma(W_h h_{t-1} + W_x x_t + b) $$ 其中$\sigma$为激活函数,$h_t$为隐藏状态[^3]。 #### 五、简单示例:手写数字识别 ```python from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Flatten # 加载数据 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 构建模型 model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation='relu'), Dense(10, activation='softmax') ]) # 编译与训练 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5, validation_split=0.2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值