python - 可以在不使用占位符的情况下获得 TensorFlow 中 LSTM 的可变批量大小吗?
问题描述
在我的 LSTM RNN 实现中,我使用了以下代码行:
self.batch_size = tf.shape(x)[0]
其中 x 是从数据集 api 获得的张量。打印 x 给出以下输出:
Tensor("IteratorGetNext:0", shape=(?, 2, 1024), dtype=float32)
我的其余代码由
targets = tf.one_hot(y,num_classes)
cell = tf.contrib.rnn.BasicLSTMCell
cells = [cell(num_units=n) for n in num_units]
stacked_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)
initial_state = stacked_rnn_cell.zero_state(self.batch_size, tf.float32)
...
output, state = tf.nn.dynamic_rnn(
stacked_rnn_cell, prev_output, initial_state = initial_state, dtype = tf.float32,
sequence_length = [1024]*self.batch_size)
logits = tf.contrib.layers.fully_connected(output[-1],24)
xent = tf.nn.softmax_cross_entropy_with_logits_v2(labels = targets, logits = logits)
self.loss = tf.reduce_mean(xent)
self.opt = tf.train.GradientDescentOptimizer(0.01).\
minimize(self.loss,global_step=global_step)
self.metric_loss,self.update_loss = tf.metrics.mean(self.loss)
self.summary = tf.summary.scalar('Loss',self.update_loss)
我遇到了错误:
InvalidArgumentError (see above for traceback): ConcatOp : Dimensions of inputs should match: shape[0] = [1024,2] vs. shape[1] = [1,128]
1024 是批量大小,2 是输入大小,128 是状态大小。
如果我将第一行更改为
self.batch_size = 1024
或任何其他常数,它会训练。我宁愿不用占位符来处理这个问题,而只是从数据样本中推断出值,这样我就可以保持一般性。有任何想法吗?
解决方案
找到了解决方案!问题线是
output, state = tf.nn.dynamic_rnn(
stacked_rnn_cell, prev_output, initial_state = initial_state, dtype = tf.float32,
sequence_length = [1024]*self.batch_size)
如果我们将其更改为:
output, state = tf.nn.dynamic_rnn(
stacked_rnn_cell, polar, initial_state = initial_state, dtype = tf.float32,
sequence_length = tf.tile([1024],[self.batch_size]))
它似乎按预期工作。
推荐阅读
- android - 在 logcat 中看不到 ATrace 日志
- .net - 将 Wordnet 集成到 C# 应用程序
- c++ - c++ dll 函数导出命名约定(修改)
- c# - 如何在revit-api c#中从revit文档向revit族元素添加参数
- html - 具有纵横比的绝对定位 div
- java - 在php中使用私钥加密字符串
- ios - 如何防止 UISlider 在捕捉/步进时跳到位
- angular - Internet Explorer 和下拉列表问题
- multithreading - Makefile 目标运行并行目标并在执行更多操作之前等待它们完成
- python - 数据帧子集上的“迭代”窗口函数