【发布时间】:2018-01-28 08:52:29
【问题描述】:
我正在训练一个时间序列的 RNN。我将RNNCell 子类化并在dynamic_rnn 中使用它。 RNNCell的拓扑如下:
- 输入(形状
[15, 100, 3]) - 1x3 卷积(5 个内核),ReLu(形状
[15, 98, 5]) - 1x(剩余)卷积(20 个内核),ReLu(形状
[15, 1, 20]) - 连接上一个输出(形状
[15, 1, 21]) - 压缩和 1x1 卷积(1 个内核)、ReLu(形状
[15, 1]) - 挤压和softmax(形状
[15])
dynamic_rnn 的批量大小约为 100(与上面描述的 100 不同,这是数据窗口中的时间段数)。 Epoch 由大约 200 个批次组成。
我想尝试超参数和正则化,但我经常尝试完全停止学习,我不明白为什么。这些是发生的一些奇怪的事情:
Adagrad 有效,但如果我使用 Adam 或 Nadam,则梯度全为零。
我不得不设置一个巨大的学习率 (~1.0) 来查看从一个时期到另一个时期的学习情况。
如果我尝试在任何卷积之后添加 dropout,即使我将 keep_prob 设置为 1.0,它也会停止学习。
如果我调整卷积中的内核数量,对于一些看起来同样好的选择(例如 5、25、1 与 5、20、1),网络会再次完全停止学习。
为什么这个模型如此脆弱?是RNNCell的拓扑吗?
编辑:
这是RNNCell的代码:
class RNNCell(tf.nn.rnn_cell.RNNCell):
def __init__(self):
super(RNNCell, self).__init__()
self._output_size = 15
self._state_size = 15
def __call__(self, X, prev_state):
network = X
# ------ 2 convolutional layers ------
network = tflearn.layers.conv_2d(network, 5, [1, 3], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
width = network.get_shape()[2]
network = tflearn.layers.conv_2d(network, 20, [1, width], [1, 1], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
# ------ concatenate the previous state ------
_, height, width, features = network.get_shape()
network = tf.reshape(network, [-1, int(height), 1, int(width * features)])
network = tf.concat([network, prev_state[..., None, None]], axis=3)
# ------ last convolution and softmax ------
network = tflearn.layers.conv_2d(network, 1, [1, 1], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
network = network[:, :, 0, 0]
predictions = tflearn.layers.core.activation(network, activation="softmax")
return predictions, predictions
@property
def output_size(self):
return self._output_size
@property
def state_size(self):
return self._state_size
【问题讨论】:
-
序列长度为100?
-
正确,窗口有 100 个时间段。我也在试验这些,但它们似乎并没有破坏一切。
-
如果您提供完整的代码和一些数据以使其可重现,那就太好了
-
我很乐意,但是完整的代码太长(它包括直接在 TF 中预处理数据和另一个完整的对象来管道数据)。我可以给你看
RNNCell,够紧凑了。
标签: python tensorflow machine-learning recurrent-neural-network