【发布时间】:2017-10-25 00:03:04
【问题描述】:
我需要在两个卷积层之后实现一个 LSTM 层。这是我第一次卷积后的代码:
convo_2 = convolutional_layer(convo_1_pooling, shape=[5, 5, 32, 64])
convo_2_pooling = max_pool_2by2(convo_2)
convo_2_flat = tf.reshape(convo_2_pooling, shape=[-1, 64 * 50 * 25])
cell = rnn.LSTMCell(num_units=100, activation=tf.nn.relu)
cell = rnn.OutputProjectionWrapper(cell, output_size=7)
conv_to_rnn = int(convo_2_flat.get_shape()[1])
outputs, states = tf.nn.dynamic_rnn(cell, convo_2_flat, dtype=tf.float32)
我在最后一行收到此错误:
ValueError: Shape (?, 50, 64) must have rank 2
我必须在convo_2_flat 变量中指明时间步长,对吗?如何?我真的不知道该怎么做。
编辑:
重塑后:
convo_2_flat = tf.reshape(convo_2_flat, shape=[-1, N_TIME_STEPS, INPUT_SIZE])
在哪里
N_TIME_STEPS = 25
INPUT_SIZE = int(64 * 50 * 25 / N_TIME_STEPS)
我收到此错误:InvalidArgumentError(有关回溯,请参见上文):logits 和标签必须相同大小:logits_size=[5000,7] labels_size=[50,7] 在这一行:
交叉熵 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=outputs))
在我看来,上次重塑后批量大小发生了变化。
编辑 2:
下面的代码是不是错了?
convo_2_shape = convo_2_pooling.get_shape().as_list()
shape_convo_flat = convo_2_shape[1] * convo_2_shape[2] * convo_2_shape[3]
N_TIME_STEPS = convo_2_shape[1]
INPUT_SIZE = tf.cast(shape_convo_flat / N_TIME_STEPS, tf.int32)
convo_2_out = tf.reshape(convo_2_pooling, shape=[-1, shape_convo_flat])
convo_2_out = tf.reshape(convo_2_out, shape=[-1, N_TIME_STEPS, INPUT_SIZE])
我这样设置N_TIME_STEPS 因为否则我会有一个浮点数INPUT_SIZE 并且tf 会抛出一个错误。
【问题讨论】:
标签: python tensorflow lstm convolution