TensorFlow双输入模型提升batch size时报输入张量数量错误如何解决
报错原因与修正方案
核心报错逻辑
你的双输入TensorFlow模型要求传入长度为2的张量列表,两个张量的第一维均为batch size,形状对应[None,80,80,64,1]。当batch size设为8时,你返回的嵌套列表拆平后共有8*2=16个独立张量,TensorFlow会将所有列表元素识别为独立输入,因此触发“期望2个输入,收到16个输入张量”的报错。
1. 数据生成器错误修正
你当前的__getitem__存在3处错误:
- 循环逻辑错误:
range(len(batch_size))写法错误,batch_size为整数,调用len()会直接报错,应改为range(self.batch_size) - 输入结构错误:你按样本维度拼接输入,生成了
[[样本1输入1,样本1输入2], [样本2输入1,样本2输入2]...]的嵌套列表,不符合模型输入要求 - 返回值笔误:你最后返回的是单次循环的
inputs和label,而非拼接后的inputLst和labelLst
修正后的代码如下:
def __getitem__(self, index): input1_lst, input2_lst, label_lst = [], [], [] for i in range(self.batch_size): # 替换为你实际的样本加载逻辑 input1 = load(input1_path) input2 = load(input2_path) label = load(label_path) input1_lst.append(input1) input2_lst.append(input2) label_lst.append(label) # 按输入类型堆叠,生成带batch维度的张量 batch_input1 = tf.stack(input1_lst, axis=0) batch_input2 = tf.stack(input2_lst, axis=0) batch_label = tf.stack(label_lst, axis=0) # 返回长度为2的输入张量列表,符合模型要求 return [batch_input1, batch_input2], batch_label
2. 训练流程错误修正
你当前逐样本计算梯度再平均的写法不仅浪费mini batch的并行计算能力,还存在变量名拼写错误(gradient_of_generator和前面定义的gradients_of_generator不一致),推荐直接用整batch输入计算,修正代码如下:
with tf.GradientTape() as gen_tape: # 直接传入整batch的双输入列表即可 generated_img = generator(batch_inputs, training=True) loss_Gen = Unet_loss(batch_label, generated_img) # 直接计算整batch梯度,无需手动取平均 gradients_of_generator = gen_tape.gradient(loss_Gen, generator.trainable_variables) generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
如果确实有特殊需求必须逐样本计算梯度再平均,需要保证每个样本传入模型的是[单样本input1, 单样本input2]的双元素列表,和batch size为1时的输入格式保持一致即可。
内容的提问来源于stack exchange,提问作者Qwaj
相关产品推荐
相关产品推荐

