TensorFlow Transformer模型批量预测输入格式错误排查求助
Transformer批量预测的正确输入格式
为啥你之前的写法报错?
你传[input_in, input_in, input_in]的时候,input_in本身是包含2个张量的列表,这么写相当于把3个单样本的输入全拆成了6个独立张量——但你的模型本来就只需要2个输入(每个输入对应一个分支的批量数据),自然会报“期望2个输入,实际收到6个”的错误。
正确的输入构造方法
假设单样本的两个输入张量分别是tensor1(形状(1,150))和tensor2(形状(1,150)),批量预测时要分别给每个输入分支做批量堆叠:
- 把所有样本的
tensor1堆在一起,形成形状(X,1,150)的张量(X是你要预测的样本数) - 把所有样本的
tensor2堆在一起,同样形成(X,1,150)的张量 - 最后把这两个批量张量组成列表,传给
predict()就行
代码示例
# 拿3个重复的单样本举例 # 先拆分单样本的两个输入 single_tensor1, single_tensor2 = input_in[0], input_in[1] # 堆叠多个样本的同一分支输入 batch_tensor1 = tf.stack([single_tensor1, single_tensor1, single_tensor1]) # 形状(3,1,150) batch_tensor2 = tf.stack([single_tensor2, single_tensor2, single_tensor2]) # 形状(3,1,150) # 执行批量预测 results = transformer.predict([batch_tensor1, batch_tensor2])
更简洁的写法(重复单样本批量)
如果是用同一个单样本生成批量,也可以用tf.tile()快速复制:
# 对单样本张量做批量复制,这里生成3个样本的批量 batch_tensor1 = tf.tile(single_tensor1, [3, 1]) # 形状(3,150),如果要保留(3,1,150)可以加维度:tf.tile(tf.expand_dims(single_tensor1, 0), [3,1,1]) batch_tensor2 = tf.tile(single_tensor2, [3, 1]) results = transformer.predict([batch_tensor1, batch_tensor2])
核心要点
- 你的模型输入是2个独立张量,每个张量的第一维是批量大小,后面的维度和单样本对应输入一致
- 绝对不能把多个单样本的输入列表直接拼在一起,否则会把每个单样本的两个输入拆成独立元素,导致输入数量不符合模型要求
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

