Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用tensorflow数据集api批量填充最大序列长度?_Python_Tensorflow_Variable Length Array - Fatal编程技术网

Python 如何使用tensorflow数据集api批量填充最大序列长度?

Python 如何使用tensorflow数据集api批量填充最大序列长度?,python,tensorflow,variable-length-array,Python,Tensorflow,Variable Length Array,例如,我有 123 1234 12345 1234556 1234567890 像这样制作全局填充很容易 0000000123 0000001234 0000012345 0001234556 1234567890 00123 01234 12345 但我想填充数据集api批处理生成的每个数据集。 例如,批量为3时,随机抽取3个样本 123 1234 12345 像这样垫着 0000000123 0000001234 0000012345 0001234556 1234567890 0

例如,我有

123
1234
12345
1234556
1234567890
像这样制作全局填充很容易

0000000123
0000001234
0000012345
0001234556
1234567890
00123
01234
12345
但我想填充数据集api批处理生成的每个数据集。 例如,批量为3时,随机抽取3个样本

123
1234
12345
像这样垫着

0000000123
0000001234
0000012345
0001234556
1234567890
00123
01234
12345
例如,我可以在numpy中实现,但这就是在tf api中构建批的方式:

data = tf.data.Dataset.from_tensor_slices((X, y))
data = data.apply(tf.data.experimental.shuffle_and_repeat(buffer_size=len(y)))
data = data.batch(batch_size, drop_remainder=False)
data = data.prefetch(2)

如果我理解正确,您可以:

导入操作系统
数据=“123”
1234
12345"""
行=数据。拆分行()
max_len=max((len(i)表示线中的i))
行=(i.rjust(max_len,'0')表示行中的i)
数据=os.linesep.join(行)
打印(数据)
输出:

00123
01234
12345

您可以使用padded_批处理方法

data.padded\u批次(批次大小,padded\u形状=最大形状)
其中max_shape是所需填充张量的大小

我相信这将附加尾随零而不是前导零,但它可能仍然适合您的目的

编辑

完整的工作示例:

将tensorflow导入为tf
将numpy作为np导入
def gen():
收益率(np.数组([1,2,3]),np.数组(1))
收益率(np.数组([1,2,3,4]),np.数组(0))
data=tf.data.Dataset.from_生成器(gen,output_types=(tf.int32,tf.int32))
data=data.apply(tf.contrib.data.shuffle_和_repeat(buffer_size=2))
data=data.padded_批处理(10,padded_形状=([None],]))
迭代器=tf.data.iterator.from_结构(data.output_类型,data.output_形状)
batch=iterator.get_next()
init_op=iterator.make_初始值设定项(数据)
使用tf.Session()作为sess:
sess.run(初始化操作)
批次输出=sess.run(批次)
打印(批量输出)

如果我理解正确,您可以使用keras pad_序列:

sequence = np.array([[1,2], [1, 2, 3, 4], [1, 2, 3,4, 5, 6]])  

tf.keras.preprocessing.sequence.pad_sequences(sequence, padding='pre', value=0)  

array([[0, 0, 0, 0, 1, 2],  
       [0, 0, 1, 2, 3, 4],  
       [1, 2, 3, 4, 5, 6]])

嗯,是的,例如,我可以用numpy来做,但不知道如何用tensorflow来做。在问题中添加了tensorflow数据集代码。在第二行构造的批处理,它是tensor对象。我像这样尝试数据=数据。填充的批处理(批处理大小,填充的形状=([None,None],[None]),drop\u rements=True),但得到错误类型错误:预期的二进制或unicode字符串,得到数组([-264]),…我不确定您的错误是否相关。我已更新了我的答案,以提供完整的工作示例。您可能需要根据实际数据的形状进行调整。可能与我用您的代码制作的笔记本中的from_tensor_切片有关,from_tensor_切片对于可变维度ndarray不起作用。