相关疑难解决方法(0)

在RNN / lstm RNN中使用批处理规范化是正常的吗?

我是深度学习的初学者。我知道在常规神经网络中,人们在激活之前会使用批处理规范,这将减少对良好的权重初始化的依赖。我想知道当我使用它时是否会对RNN / lstm RNN起到同样的作用。有人有经验吗?谢谢。

machine-learning deep-learning

12
推荐指数
3
解决办法
1万
查看次数

RNN正则化:要对哪个组件进行正则化?

我正在构建一个用于分类的RNN(在RNN之后有一个softmax层)。要进行正则化的选项有很多,我不确定是否只尝试所有这些,效果会一样吗?在什么情况下我应该规范哪些组件?

这些组件是:

  • 内核权重(图层输入)
  • 循环重量
  • 偏压
  • 激活功能(层输出)

python regularized deep-learning keras recurrent-neural-network

8
推荐指数
1
解决办法
2925
查看次数

将时序数据馈入有状态LSTM的正确方法?

假设我有一个整数序列:

0,1,2, ..

并希望根据给定的最后3个整数来预测下一个整数,例如:

[0,1,2]->5[3,4,5]->6

假设我像这样设置模型:

batch_size=1
time_steps=3
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, time_steps, 1), stateful=True))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)

据我了解,模型具有以下结构(请原图):

在此处输入图片说明

第一个问题:我的理解正确吗?

请注意,我已经画出了C_{t-1}, h_{t-1}进入图片的先前状态,因为指定时会暴露出来stateful=True。在这个简单的“下一个整数预测”问题中,应通过提供此额外的信息来改善性能(只要先前的状态是由前三个整数产生的)。

这使我想到了一个主要问题: 似乎标准做法(例如,参见此博客文章TimeseriesGenerator keras预处理实用程序)是在训练过程中向模型提供一组交错的输入。

例如:

batch0: [[0, 1, 2]]
batch1: [[1, 2, 3]]
batch2: [[2, 3, 4]]
etc
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为这似乎需要第一Lstm单元的输出(对应于第一时间步长)。看这个图:

从tensorflow docs

stateful:布尔值(默认为False)。如果为True,则批次中索引i的每个样本的最后状态将用作下一个批次中索引i的样本的初始状态。

似乎此“内部”状态不可用,并且所有可用状态都是最终状态。看这个图:

因此,如果我的理解是正确的(显然不是这样),那么在使用时是否不应该将不重叠的样本窗口馈送到模型中stateful=True?例如:

batch0: [[0, 1, 2]]
batch1: [[3, 4, 5]]
batch2: [[6, 7, 8]]
etc
Run Code Online (Sandbox Code Playgroud)

python machine-learning lstm keras tensorflow

7
推荐指数
1
解决办法
226
查看次数

如何在 Keras/TensorFlow 中可视化 RNN/LSTM 梯度?

我遇到过研究出版物和问答讨论需要检查每个反向传播时间 (BPTT) 的 RNN 梯度 - 即每个时间步长的梯度。主要用途是自省:我们如何知道 RNN 是否正在学习长期依赖?一个自己主题的问题,但最重要的见解是梯度流

  • 如果一个非零梯度流经每个时间步,那么每个时间步都有助于学习——即,结果梯度源于对每个输入时间步的考虑,因此整个序列会影响权重更新
  • 如上所述,RNN不再忽略长序列的一部分,而是被迫向它们学习

...但是我如何在 Keras / TensorFlow 中实际可视化这些梯度?一些相关的答案是在正确的方向上,但它们似乎对双向 RNN 失败了,并且只展示了如何获得层的梯度,而不是如何有意义地可视化它们(输出是一个 3D 张量 - 我该如何绘制它?)

python visualization keras tensorflow recurrent-neural-network

6
推荐指数
1
解决办法
2299
查看次数

SpatialDropout2D、BatchNormalization 和激活函数的正确顺序?

对于 CNN 架构,我想使用 SpatialDropout2D 层而不是 Dropout 层。另外我想使用 BatchNormalization。到目前为止,我总是直接在卷积层之后但在激活函数之前设置 BatchNormalization,就像 Ioffe 和 Szegedy 的论文中提到的那样。我总是在 MaxPooling2D 层之后设置 dropout 层。

https://machinelearningmastery.com/how-to-reduce-overfit-with-dropout-regularization-in-keras/ 中, SpatialDropout2D 直接设置在卷积层之后。

我发现我现在应该以何种顺序应用这些层相当令人困惑。我还在 Keras 页面上读到 SpatialDropout 应该直接放在 ConvLayer 后面(但我再也找不到这个页面了)。

以下顺序是否正确?

ConvLayer - SpatialDropout - BatchNormalization - 激活函数 - MaxPooling

我真的希望得到提示并提前谢谢你

更新 我的目标实际上是在以下 CNN 架构 dropout 中交换空间 dropout:

model = Sequential()
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(10))
model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

keras activation-function batch-normalization dropout

6
推荐指数
1
解决办法
1652
查看次数

Tensorflow 中哪些层受到 dropout 层的影响?

考虑迁移学习,以便在 keras/tensorflow 中使用预训练模型。对于每个旧层,trained参数设置false为使其权重在训练期间不会更新,而最后一层已被新层替换,并且必须对这些层进行训练。特别是添加了两个带有神经元和 relu 激活函数的全连接隐藏层5121024在这些层之后,使用 Dropout 层rate 0.2。这意味着在每个训练时期,20%神经元都会被随机丢弃。

该 dropout 层影响哪些层?它是否会影响所有网络,包括已layer.trainable=false设置的预训练层,还是仅影响新添加的层?或者它只影响前一层(即具有1024神经元的一层)?

换句话说,在每个时期因 dropout 而关闭的神经元属于哪一层?

import os

from tensorflow.keras import layers
from tensorflow.keras import Model
  
from tensorflow.keras.applications.inception_v3 import InceptionV3

local_weights_file = 'weights.h5'

pre_trained_model = InceptionV3(input_shape = (150, 150, 3), 
                                include_top = False, 
                                weights = None)

pre_trained_model.load_weights(local_weights_file)

for layer in pre_trained_model.layers:
  layer.trainable = False
  
# pre_trained_model.summary()

last_layer = pre_trained_model.get_layer('mixed7')
last_output = last_layer.output

# Flatten the output …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow dropout transfer-learning

4
推荐指数
1
解决办法
4890
查看次数

LSTM 'recurrent_dropout' 与 'relu' 产生 NaN

任何非零值recurrent_dropout都会产生 NaN 损失和权重;后者要么是 0,要么是 NaN。发生在堆叠、浅、stateful, return_sequences= 任何、带有 & w/o Bidirectional(), activation='relu', loss='binary_crossentropy'。NaN 发生在几个批次内。

有修复吗?感谢帮助。


尝试排除故障

  • recurrent_dropout=0.2,0.1,0.01,1e-6
  • kernel_constraint=maxnorm(0.5,axis=0)
  • recurrent_constraint=maxnorm(0.5,axis=0)
  • clipnorm=50 (经验确定),Nadam 优化器
  • activation='tanh'- 无 NaN,权重稳定,测试最多 10 个批次
  • lr=2e-6,2e-5- 无 NaN,权重稳定,测试最多 10 个批次
  • lr=5e-5- 3 个批次没有 NaN,权重稳定 - 第 4 批次有 NaN
  • batch_shape=(32,48,16)- 2 个批次损失较大,第 3 批次为 NaN

注意:每批次batch_shape=(32,672,16)17 次调用train_on_batch


环境

  • Keras 2.2.4(TensorFlow 后端)、Python 3.7、Spyder 3.3.7(通过 Anaconda)
  • GTX 1070 6GB、i7-7700HQ、12GB 内存、Win-10.0.17134 x64
  • CuDNN 10+,最新的 …

numerical-stability lstm keras tensorflow

3
推荐指数
1
解决办法
1361
查看次数