使用TensorFlow Dataset.bucket_by_sequence_length触发TypeError求助
问题与解决方案:TensorFlow Dataset.bucket_by_sequence_length 报错处理
你在构建英日机器翻译可变长度数据集时,调用Dataset.bucket_by_sequence_length触发报错:
TypeError: Tensor.__init__() missing 3 required positional arguments: 'op', 'value_index', and 'dtype'
相关代码如下:
# Create initial dataset eng, jap = map(list, zip(*data)) assert len(eng) == len(jap) eng = tf.ragged.constant(eng, dtype=tf.uint16) jap = tf.ragged.constant(jap, dtype=tf.uint16) dataset = tf.data.Dataset.from_tensor_slices((eng, jap)) # Bucket based on sequence length vocab = tokenizer.get_vocab() dataset = dataset.bucket_by_sequence_length( element_length_func=lambda x, _=None: tf.shape(x)[0], bucket_boundaries=[100], bucket_batch_sizes=[BATCH_SIZE, BATCH_SIZE], padding_values=vocab["[PAD]"], )
问题根源
你的数据集元素是**(英文RaggedTensor, 日文RaggedTensor)**的二元组,但padding_values参数只传入了单个PAD值,无法与数据集的二元组结构匹配,导致内部张量初始化时参数缺失,触发报错。
解决方案
1. 匹配padding_values与数据集结构
将padding_values改为对应二元组的形式,分别为英文和日文指定PAD值:
dataset = dataset.bucket_by_sequence_length( element_length_func=lambda x, _: tf.shape(x)[0], # 基于英文序列长度分桶 bucket_boundaries=[100], bucket_batch_sizes=[BATCH_SIZE, BATCH_SIZE], padding_values=(vocab["[PAD]"], vocab["[PAD]"]), # 对应(eng, jap)的二元组结构 )
2. 优化序列长度计算(针对RaggedTensor)
对于RaggedTensor,使用row_lengths()方法获取序列长度更可靠,避免tf.shape可能出现的兼容问题:
def get_sequence_length(eng_tensor, jap_tensor): # 基于英文序列长度分桶,若需参考日文则返回jap_tensor.row_lengths() return eng_tensor.row_lengths() dataset = dataset.bucket_by_sequence_length( element_length_func=get_sequence_length, bucket_boundaries=[100], bucket_batch_sizes=[BATCH_SIZE, BATCH_SIZE], padding_values=(vocab["[PAD]"], vocab["[PAD]"]), )
3. 额外检查项
- 确保
BATCH_SIZE是整数类型,而非张量或其他非数值类型 - 若需基于日文序列长度分桶,只需调整
element_length_func返回日文张量的长度即可
内容的提问来源于stack exchange,提问作者Aaron Lockhart
相关产品推荐
相关产品推荐

