ValueError:尝试共享tf.nn.dynamic_rnn中的变量,但看到尺寸不匹配

时间:2018-12-19 23:35:31

标签: tensorflow

尝试使用tensorflow创建展开的RNN模型,并看到我不理解的错误消息。最终,尝试使用多步超前进行简单的时间序列预测,其中输入向量是一组回溯窗口样本(每个10步长,每个特征1个),响应集样本是下一个(5)步骤每个10步回溯窗口的系列。

在这里您可以看到数据集的尺寸和预期的RNN细胞神经元

n_samples = int( data_x.get_shape()[0] )
n_input_steps = int( data__x.get_shape()[1] )
n_inputs = int( tx.get_shape()[2] )
n_neurons = 7 # small for demo purposes
n_output_steps = int( data_y.get_shape()[1] )
n_outputs = int( data_y.get_shape()[2] )

print (n_samples, n_input_steps, n_inputs, n_neurons, n_output_steps, n_outputs)

#output
(97, 10, 1, 7, 5, 1)

和展开的模型代码

# params section

X = tf.placeholder(tf.float64, [None, n_input_steps, n_inputs])
print X.get_shape()
y = tf.placeholder(tf.float64, [None, n_output_steps, n_outputs])
print y.get_shape()

cell = tf.nn.rnn_cell.LSTMCell(name='basic_lstm_cell', num_units=n_neurons, activation=tf.nn.relu, use_peepholes=True)
# wrap in fully connect single output projection
fc_cell = tf.contrib.rnn.OutputProjectionWrapper(cell, output_size=n_outputs, reuse=tf.AUTO_REUSE)

outputs, states = tf.nn.dynamic_rnn(cell=fc_cell, inputs=X, dtype=tf.float64)

"""
expecting unrolled RNN:

y[0]   .... y[n_input_steps]
 |           |
 * -> ... -> *
 |     ....  |
x[0]        x[n_input_steps] 

where each * is an RNN cell with a single output
"""

尝试设置此RNN时抛出的完整错误消息如下

(?, 10, 1)
(?, 5, 1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-204-d52a40d9a302> in <module>()
     10 fc_cell = tf.contrib.rnn.OutputProjectionWrapper(cell, output_size=n_outputs, reuse=tf.AUTO_REUSE)
     11 
---> 12 outputs, states = tf.nn.dynamic_rnn(cell=fc_cell, inputs=X, dtype=tf.float64)
     13 
....
....
....
/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.pyc in _get_single_variable(self, name, shape, dtype, initializer, regularizer, partition_info, reuse, trainable, collections, caching_device, validate_shape, use_resource, constraint, synchronization, aggregation)
    864         raise ValueError("Trying to share variable %s, but specified shape %s"
    865                          " and found shape %s." % (name, shape,
--> 866                                                    found_var.get_shape()))
    867       if not dtype.is_compatible_with(found_var.dtype):
    868         dtype_str = dtype.name

ValueError: Trying to share variable rnn/output_projection_wrapper/basic_lstm_cell/kernel, but specified shape (8, 28) and found shape (4, 12).

ValueError中的这些数字是什么?很难弄清它们是如何产生的,因此很难调试上游出了什么问题。我的设置方式有什么根本性的错误吗?例如。而不是让data_x的形状为(?,10,1)和data_y的形状为(?,5,1),data_y的形状应该为(?,10,1)来匹配x的形状(其中data_y中的每个样本只是其中的对应序列) data_x上移了5步)?

不胜感激任何调试建议或修复程序。

1 个答案:

答案 0 :(得分:0)

随机修改后,发现将代码的单元格创建片段更改为

cell = tf.nn.rnn_cell.LSTMCell(
    name='basic_lstm_cell', num_units=n_neurons, activation=tf.nn.relu, reuse=tf.AUTO_REUSE)
# wrap cell in fully connect single output projection
fc_cell = tf.contrib.rnn.OutputProjectionWrapper(cell, output_size=n_outputs, reuse=tf.AUTO_REUSE)

(主要删除use_peepholes=True)似乎可以防止错误的出现(应该注意,我从不真正知道什么地方是窥视孔,只是在一些代码片段时才将它们保留在那儿,但它们似乎具有影响某处的尺寸)。需要做更多的研究来解释这对代码的影响。