我最近实现了一个模型,当我运行它时,我收到了这个警告:
UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape.
This may consume a large amount of memory.
"Converting sparse IndexedSlices to a dense Tensor of unknown shape. "
Run Code Online (Sandbox Code Playgroud)
随着一些类似的参数设置(嵌入维度)突然,模型是非常慢的.
想要了解在tensorflow中实现渐变剪切期间tf.clip_by_value和tf.clip_by_global_norm的角色差异.哪一个是首选的,如何决定要剪辑的最大值?
我不能让TensorFlow RELU激活(既不是tf.nn.relu
也没有tf.nn.relu6
)在没有NaN值的情况下进行激活和权重杀死我的训练运行.
我相信我正在遵循所有正确的一般建议.例如,我用我的初始化我的权重
weights = tf.Variable(tf.truncated_normal(w_dims, stddev=0.1))
biases = tf.Variable(tf.constant(0.1 if neuron_fn in [tf.nn.relu, tf.nn.relu6] else 0.0, shape=b_dims))
Run Code Online (Sandbox Code Playgroud)
并使用较慢的训练率,例如,
tf.train.MomentumOptimizer(0.02, momentum=0.5).minimize(cross_entropy_loss)
Run Code Online (Sandbox Code Playgroud)
但任何可观深度的网络都会导致NaN
成本和至少一些权重(至少在它们的摘要直方图中).事实上,成本通常NaN
是从一开始(训练前).
即使我使用L2(约0.001)正则化和辍学(约50%),我似乎也有这些问题.
是否有一些参数或设置我应该调整以避免这些问题?我不知道哪里开始寻找,所以任何建议都将不胜感激!
问题:一个很长的RNN网
N1 -- N2 -- ... --- N100
Run Code Online (Sandbox Code Playgroud)
对于类似的优化器AdamOptimizer
,compute_gradient()
将为所有训练变量提供渐变.
但是,它可能会在某个步骤中爆炸.
类似于如何有效地应用梯度剪切张量流的方法 可以剪切大的最终梯度.
但是如何剪辑那些中级的呢?
一种方法可能是从"N100 - > N99"手动执行backprop,剪辑渐变,然后是"N99 - > N98"等等,但这太复杂了.
所以我的问题是:是否有更简单的方法来剪辑中间渐变?(当然,严格来说,它们不再是数学意义上的渐变)
我正在尝试将渐变裁剪添加到图形中。我使用了这里推荐的方法:如何在张量流中有效地应用梯度修剪?
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
if gradient_clipping:
gradients = optimizer.compute_gradients(loss)
clipped_gradients = [(tf.clip_by_value(grad, -1, 1), var) for grad, var in gradients]
opt = optimizer.apply_gradients(clipped_gradients, global_step=global_step)
else:
opt = optimizer.minimize(loss, global_step=global_step)
Run Code Online (Sandbox Code Playgroud)
但是,当我打开渐变裁剪时,会得到以下堆栈跟踪:
<ipython-input-19-be0dcc63725e> in <listcomp>(.0)
61 if gradient_clipping:
62 gradients = optimizer.compute_gradients(loss)
---> 63 clipped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients]
64 opt = optimizer.apply_gradients(clipped_gradients, global_step=global_step)
65 else:
/home/armence/mlsandbox/venv/lib/python3.4/site-packages/tensorflow/python/ops/clip_ops.py in clip_by_value(t, clip_value_min, clip_value_max, name)
51 with ops.op_scope([t, clip_value_min, clip_value_max], name,
52 "clip_by_value") as name:
---> 53 t …
Run Code Online (Sandbox Code Playgroud) 我有一些数据以非常高的速率采样(每秒数百次)。对于任何给定的实例,这平均会导致序列长度很大(〜90,000个样本)。整个序列只有一个标签。我正在尝试使用LSTM神经网络将新序列分类为这些标签之一(多类分类)。
但是,使用具有如此大序列长度的LSTM会导致网络很大。
有什么方法可以有效地“整理”这些序列,以使我可以减少神经网络的序列长度,但仍保持整个实例中捕获的信息?
我正在训练一个 LSTM 自动编码器,但损失函数随机上升,如下图所示:
我尝试了多种方法来防止这种情况发生,调整批量大小,调整图层中的神经元数量,但似乎没有任何帮助。我检查了我的输入数据以查看它是否包含空值/无穷大值,但它没有,它也被标准化了。这是我的代码供参考:
model = Sequential()
model.add(Masking(mask_value=0, input_shape=(430, 3)))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu'))
model.add(RepeatVector(430))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(3)))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
context_paths = loadFile()
X_train, X_test = train_test_split(context_paths, test_size=0.20)
history = model.fit(X_train, X_train, epochs=1, batch_size=4, verbose=1, validation_data=(X_test, X_test))
Run Code Online (Sandbox Code Playgroud)
损失函数在随机时间点爆炸,有时早些,有时晚些。我读到这个线程可能出现的问题,但在尝试多次后的事情这一点我不知道怎样做才能防止损失函数从随机暴涨。任何建议表示赞赏。除此之外,我可以看到我的准确度并没有增加多少,所以问题可能是相互关联的。
以下网络代码应该是您经典的简单 LSTM 语言模型,一段时间后开始输出 nan loss……在我的训练集上需要几个小时,而且我无法在较小的数据集上轻松复制它。但它总是发生在认真的训练中。
Sparse_softmax_with_cross_entropy 在数值上应该是稳定的,所以它不可能是原因......但除此之外,我没有看到任何其他节点可能会导致图中出现问题。可能是什么问题呢?
class MyLM():
def __init__(self, batch_size, embedding_size, hidden_size, vocab_size):
self.x = tf.placeholder(tf.int32, [batch_size, None]) # [batch_size, seq-len]
self.lengths = tf.placeholder(tf.int32, [batch_size]) # [batch_size]
# remove padding. [batch_size * seq_len] -> [batch_size * sum(lengths)]
mask = tf.sequence_mask(self.lengths) # [batch_size, seq_len]
mask = tf.cast(mask, tf.int32) # [batch_size, seq_len]
mask = tf.reshape(mask, [-1]) # [batch_size * seq_len]
# remove padding + last token. [batch_size * seq_len] -> [batch_size * sum(lengths-1)]
mask_m1 = tf.cast(tf.sequence_mask(self.lengths - 1, maxlen=tf.reduce_max(self.lengths)), tf.int32) …
Run Code Online (Sandbox Code Playgroud) tensorflow ×6
lstm ×3
python ×3
adam ×1
autoencoder ×1
clipping ×1
gradient ×1
keras ×1
nan ×1
python-3.x ×1