Tensorflow中的变长输入

Tensorflow中的变长输入,tensorflow,Tensorflow,输入的形状是[批次大小,最大步长,50,50]。我想在每一步都使用特定的cnn,使其成为[批量大小,maxstep,5*5*32]。乍一看,我想我应该使用,而_loop 但是很难建立这个图,“maxstep”和“batch_size”都是可变的,那么如何迭代这个张量呢 这是我的错误代码: x = tf.placeholder(tf.float32, [2, None, None, 50, 50]) source = list() target = list() W_conv, B_conv =

输入的形状是
[批次大小,最大步长,50,50]
。我想在每一步都使用特定的cnn,使其成为
[批量大小,maxstep,5*5*32]
。乍一看,我想我应该使用
,而_loop

但是很难建立这个图,“maxstep”和“batch_size”都是可变的,那么如何迭代这个张量呢

这是我的错误代码:

x = tf.placeholder(tf.float32, [2, None, None, 50, 50])
source = list()
target = list()

W_conv, B_conv = weight_and_bias('conv', [5, 5, 1, 32])

for e in x[0]:
    e_tmp = tf.reshape(e, [-1, 50, 50 ,1])
    h_conv = tf.nn.relu(conv2d(e_tmp, W_conv) + B_conv)
    h_pool = max_pool_2x2(h_conv)
    h_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 32])
    source.append(e_tmp)

for e in x[1]:
    e_tmp = tf.reshape(e, [-1, 50, 50 ,1])
    h_conv = tf.nn.relu(conv2d(e_tmp, W_conv) + B_conv)
    h_pool = max_pool_2x2(h_conv)
    h_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 32])
    target.append(e_tmp)

source = np.array(source)
target = np.array(target)
在老师的帮助下,我终于解决了这个问题

首先,我将输入的形状
[batch\u size,variable\u step\u len,50,50]
填充到
[batch\u size,max\u step\u len,50,50]
中,然后将其重塑为
[batch\u size*max\u step\u len,50,50]

第二,我对cnn进行了操作,并对其进行了改造。

在他的帮助下,我终于解决了这个问题

首先,我将输入的形状
[batch\u size,variable\u step\u len,50,50]
填充到
[batch\u size,max\u step\u len,50,50]
中,然后将其重塑为
[batch\u size*max\u step\u len,50,50]


第二,我对cnn进行操作,并重新对其进行整形。

大多数操作都接受批处理维度,并在该批处理上高效地执行操作(比迭代快得多)。有什么原因不能将前两个维度合并为单个批次维度(带重塑),然后正常调用ops?@AllenLavoie您的意思是合并“批次大小”和“最大步长”?事实上,这是一个顺序问题,在cnn操作之后,我仍然需要将带有shape
[batch\u size,maxstep,5*5*32]
的批次输入到动态中。因此,如果将前两个维度合并,序列信息将丢失。在卷积完成后,你不能将其重新整形为[batch_size,maxstep,…],然后对其进行所需的任何序列处理吗?@AllenLavoie Umm…我想我明白你的意思了。但首先我不确定合并和拆分操作是否会保持原来的顺序。其次,
maxstep
batch\u size
都是可变的,也许我可以使用padding将
maxstep
设置为常量。如果序列没有改变,这可能是一个解决方案。tf.reforme实际上并没有改变内存中的表示:它只是关于实际值的元数据,存储在内存中的平面数组中。您可以使用将变量形状引用为整数张量。大多数操作都接受批处理维度,并在该批处理上高效地执行操作(比迭代快得多)。有什么原因不能将前两个维度合并为单个批次维度(带重塑),然后正常调用ops?@AllenLavoie您的意思是合并“批次大小”和“最大步长”?事实上,这是一个顺序问题,在cnn操作之后,我仍然需要将带有shape
[batch\u size,maxstep,5*5*32]
的批次输入到动态中。因此,如果将前两个维度合并,序列信息将丢失。在卷积完成后,你不能将其重新整形为[batch_size,maxstep,…],然后对其进行所需的任何序列处理吗?@AllenLavoie Umm…我想我明白你的意思了。但首先我不确定合并和拆分操作是否会保持原来的顺序。其次,
maxstep
batch\u size
都是可变的,也许我可以使用padding将
maxstep
设置为常量。如果序列没有改变,这可能是一个解决方案。tf.reforme实际上并没有改变内存中的表示:它只是关于实际值的元数据,存储在内存中的平面数组中。您可以使用引用变量形状作为整数张量。解决方案是否存在问题。假设我的特征是(x,50,50),其中x的范围从100到1500。这不会在网络中留下很多零。我的建议是将较大的样本分成小样本,并通过CNN传递。解决方案是否存在问题。假设我的特征是(x,50,50),其中x的范围从100到1500。这不会在网络中留下很多零。我的建议是将较大的样本分成小样本,并通过CNN进行传播。