填充批次不处理最后一批数据,其大小小于批次大小

时间:2019-09-16 20:48:03

标签: python tensorflow keras

我有一个数据集,其中有图像,每个图像有10个问题,因此有10个答案。我已经成功地训练并检查了模型。该模型由两个输入组成,一个输入作为CNN的图像,另一个输入作为LSTM的问题。因此,对于每张图片,我都会提出10个问题。然后将两者的结果串联起来并输入到FC层。

考虑到我的批处理大小为64,我将提供64张图像和640个问题。在连接时,我需要使axis:0处的尺寸相等,以避免由于尺寸不同而导致的连接错误。因此,我将CNN网络的输出拉平并重复10次,然后将其连接到LSTM输出。

model_rn.py 中,我执行以下操作:

class Model:
    def __init__(self):
        self.img = tf.placeholder(
            name='img',
            dtype=tf.float32,
            shape=[self.batch_size, self.img_size, self.img_size, 3]
        )
        self.q = tf.placeholder(
            name='ques',
            dtype=tf.float32,
            shape=[self.batch_size * 10, self.ques_dim]
        )
        self.ans = tf.placeholder(
            name='ans',
            dtype=tf.float32,
            shape=[self.batch_size * 10, self.ans_dim]
        )
        # and some more class variables
        self.build()

    def build(self):
        def cnn(img, q, scope):
            # some Conv2D and BatchNormalization
            flat = Flatten(name='flatten')(bn_4)  # layer where data is flattened before concatenate
            flat = tf.keras.backend.repeat_elements(flat, 10, axis=0)  # repeat 10 times
        # some statements to feed data into LSTM and CNN

然后我加载我的模型,并尝试在包含20个图像,200个问题以及200个答案的测试数据集上运行它。但是然后我得到了错误:

  

ValueError:无法为张量为'img_1:0'的形状((640,128,128,3)')输入形状(20,128,128,3)的值

要从我使用过的padded_batch的测试数据集中提取批次。

dataset_img = Dataset.from_tensor_slices((images)).padded_batch(
    64, padded_shapes=(128, 128, 3)
)
dataset_ques = Dataset.from_tensor_slices((questions)).padded_batch(
    64 * 10, padded_shapes=(14)
)
dataset_ans = Dataset.from_tensor_slices((answers)).padded_batch(
    64 * 10, padded_shapes=(22)
)

有人可以帮我吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您已将占位符限制为恰好采用“ batch_size”行数。要占用任何行,您可以像这样创建占位符

self.img = tf.placeholder(
            name='img',
            dtype=tf.float32,
            shape=[None, self.img_size, self.img_size, 3]
        )

与self.q和self.ans类似

相关问题