如何在TensorFlow图模式下拼接字符型RaggedTensor的行?
解决图模式下RaggedTensor每行字符拼接的问题
你遇到的问题其实是对tf.strings.join和RaggedTensor操作的层级理解偏差,直接用tf.strings.join(x)或者tf.ragged.map_flat_values都没找对正确的操作对象——我们需要对RaggedTensor的每一行单独执行拼接,而不是对整个张量或者单个元素操作。
正确的实现代码
先复现你的RaggedTensor:
import tensorflow as tf flat_values = [ b'7', b'2', b'1', b'0', b'4', b'1', b'4', b'5', b'0', b'6', b'0', b'1', b'5', b'7', b'8', b'4', b'6', b'6', b'5', b'4', b'0', b'7', b'4', b'0', b'1', b'3', b'1', b'3', b'4', b'7', b'2', b'7', b'1', b'2', b'1', b'1', b'7', b'4', b'2', b'3', b'5', b'1', b'2', b'4', b'4', b'6', b'3', b'5', b'5', b'6', b'0', b'4', b'1', b'5', b'7', b'8', b'3', b'7', b'4', b'6', b'4', b'3', b'0', b'7', b'0', b'2', b'1', b'7', b'3', b'2', b'7', b'7', b'6', b'2', b'7', b'8', b'4', b'7', b'3', b'6', b'1', b'3', b'6', b'3', b'1', b'4', b'1', b'7', b'6', b'6', b'0', b'5', b'4', b'2', b'1', b'4', b'8', b'7', b'3', b'7', b'4', b'4', b'2', b'5', b'4', b'7', b'6', b'7', b'0', b'5', b'8', b'5', b'6', b'6', b'5', b'7', b'8', b'1', b'0', b'1', b'6', b'4', b'6', b'7', b'3', b'1', b'7', b'1', b'8', b'2', b'0', b'2', ] row_lengths = [ 6, 4, 4, 5, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 6, 5, 5, 4, 4, 4, 5, 6, 6, 6, 6, ] x = tf.RaggedTensor.from_nested_row_lengths( flat_values, (row_lengths,), )
然后用tf.ragged.map_fn遍历每行并拼接:
# 对RaggedTensor的每行执行字符串拼接 joined_rows = tf.ragged.map_fn(lambda row: tf.strings.join(row), x) # 验证结果(图模式下可直接运行) print(joined_rows.to_list())
运行后会得到和你求值后一致的结果:
[b'721041', b'4506', b'0157', b'84665', b'407401', b'313472', b'712117', b'423512', b'446355', b'60415', b'78374', b'643070', b'21732', b'77627', b'847361', b'36314', b'17660', b'5421', b'4873', b'7442', b'54767', b'058566', b'578101', b'646731', b'718202']
如果需要把字节串转成普通字符串,可以再加一步解码:
# 解码为UTF-8字符串 decoded_rows = tf.strings.bytes_decode(joined_rows) print(decoded_rows.to_list())
为什么之前的方法失败?
tf.strings.join(x)报错:这个函数默认要求所有输入张量的形状匹配,但你的RaggedTensor每行长度不同,所以触发了形状不匹配的错误。tf.ragged.map_flat_values(tf.strings.join, x)报错:map_flat_values是用来操作RaggedTensor的底层flat_values(也就是每个单独的字节字符),它会把单个b'7'这种0维张量传给tf.strings.join,但tf.strings.join需要至少1维的输入,所以报了形状秩不够的错误。
而tf.ragged.map_fn正好是用来遍历RaggedTensor的每一行(每个子张量),把每行作为一个1维的整体传给tf.strings.join,完美匹配函数的输入要求,而且完全支持图模式运行,适合放在你的网络验证步骤里。
内容的提问来源于stack exchange,提问作者TayTay
相关产品推荐
相关产品推荐

