我有一个数据集,其中有图像,每个图像有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)
)
有人可以帮我吗?
谢谢!
答案 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类似