程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

我如何将 bucket_sequence_by_length 与每个元素的多个组件的(压缩)数据集一起使用

发布于2023-02-03 21:17     阅读(349)     评论(0)     点赞(6)     收藏(4)


我有一个数据集,每个观察都有多个组件(比标准的多Xy假设我有额外的组件Z)。每个观察值都可以有可变长度,因此我想使用bucket_by_sequence_lengthAPI tf.data.DatasetX我分别为、Z创建了数据集y,然后将它们压缩在一起。这是最小的例子:

import numpy as np
import tensorflow as tf
np.random.seed(42)
X = []
Z = []
y = []
for i in range(100):
    obs_len = np.random.randint(5, 25)
    X.append(np.random.random(size=[obs_len, 4]))
    Z.append(np.random.random(size=[obs_len, 1]))
    y.append(np.random.randint(0, 2, size=[obs_len,]))

def create_generator(list_of_arrays):
    for i in list_of_arrays:
        yield i
        
X_dataset = tf.data.Dataset.from_generator(lambda: create_generator(X), output_types= tf.float32, output_shapes=(None, 4))
Z_dataset = tf.data.Dataset.from_generator(lambda: create_generator(Z), output_types= tf.float32, output_shapes=(None, 1))
y_dataset = tf.data.Dataset.from_generator(lambda: create_generator(y), output_types= tf.float32, output_shapes=(None, ))
dataset = tf.data.Dataset.zip((X_dataset, Z_dataset, y_dataset))

现在我想继续bucket_by_sequence_lengthdataset但出现以下错误(请参阅摘录):

   (...)
   2686     def element_to_bucket_id(*args):
   2687       """Return int64 id of the length bucket for this element."""
-> 2688       seq_length = element_length_func(*args)
   2689 
   2690       boundaries = list(bucket_boundaries)

TypeError: <lambda>() takes 1 positional argument but 3 were given

由于 tf 抱怨element_length_func它被定义为采用一个参数(一个包含 3 个元素的元组),但收到了三个参数(一个元组被展开),我试图更改长度函数的实现:

def get_len(X, Z, y):
    return X.shape[0]

dataset.bucket_by_sequence_length(element_length_func=get_len,
                                  bucket_boundaries=[15],
                                  bucket_batch_sizes=[8, 8]) 

但是也没有成功,导致报错:

ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.

不幸的是,这两个错误的回溯真的很长,所以我决定修剪它们,但这个例子应该很容易重现。

bucket_by_sequence_length因此,我的问题是 -当我的数据集包含不止一个或两个组件时,我该如何使用?


解决方案


只使用动态形状tf.shapeget_len不是静态形状.shape

import numpy as np
import tensorflow as tf

np.random.seed(42)
X = []
Z = []
y = []
for i in range(100):
    obs_len = np.random.randint(5, 25)
    X.append(np.random.random(size=[obs_len, 4]))
    Z.append(np.random.random(size=[obs_len, 1]))
    y.append(np.random.randint(0, 2, size=[obs_len,]))

def create_generator(list_of_arrays):
    for i in list_of_arrays:
        yield i
        
X_dataset = tf.data.Dataset.from_generator(lambda: create_generator(X), output_types= tf.float32, output_shapes=(None, 4))
Z_dataset = tf.data.Dataset.from_generator(lambda: create_generator(Z), output_types= tf.float32, output_shapes=(None, 1))
y_dataset = tf.data.Dataset.from_generator(lambda: create_generator(y), output_types= tf.float32, output_shapes=(None, ))
dataset = tf.data.Dataset.zip((X_dataset, Z_dataset, y_dataset))

def get_len(X, Z, y):
    return tf.shape(X)[0]

bucket_dataset = dataset.bucket_by_sequence_length(
    element_length_func=get_len,
    bucket_boundaries=[15],
    bucket_batch_sizes=[8, 8]
) 

next(iter(bucket_dataset))


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1895302/0e3d6a4e78c0b5bbe52f/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)