【问题标题】:Tensorflow dataset pipeline with specific classes具有特定类的 TensorFlow 数据集管道
【发布时间】:2022-09-28 13:41:48
【问题描述】:

我想使用具有特定类索引的数据集管道。

  • 例如:

如果我使用 CIFAR-10 数据集。我可以按如下方式加载数据集:

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

加载所有类标签(10个类)。我可以使用以下代码创建管道:

train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices(x_test,y_test)).batch(64)

这适用于训练 Keras 模型。

  • 现在我想用几个样本创建一个管道(而不是使用所有 10 个类样本,可能只使用 5 个样本)。有没有办法制作这样的管道?

【问题讨论】:

    标签: python tensorflow image-processing keras tensorflow-datasets


    【解决方案1】:

    您可以使用tf.data.Dataset.filter

    import tensorflow as tf
    
    class_indexes_to_keep = tf.constant([0, 3, 4, 6, 8], dtype=tf.int64)
    
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
    
    y_train = y_train.astype(int)
    y_test = y_test.astype(int)
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).filter(lambda x, y: tf.reduce_any(y == class_indexes_to_keep)).batch(64)
    test_dataset = tf.data.Dataset.from_tensor_slices((x_test,y_test)).filter(lambda x, y: tf.reduce_any(y == class_indexes_to_keep)).batch(64)
    

    要转换为分类标签,您可以尝试:

    import tensorflow as tf
    
    one_hot_encode = tf.keras.utils.to_categorical(tf.range(10, dtype=tf.int64), num_classes=10)
    class_indexes_to_keep = tf.gather(one_hot_encode, tf.constant([0, 3, 4, 6, 8], dtype=tf.int64))
    
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
    y_train = y_train.astype(int)
    
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).map(lambda x, y: (x, tf.one_hot(y, 10)[0]))
    train_dataset = train_dataset.filter(lambda x, y: tf.reduce_any(tf.reduce_all(y == class_indexes_to_keep, axis=-1))).batch(64)
    

    【讨论】:

    • 您好,AloneTogether,感谢您的回复!代码给了我和错误!说:TypeError:'Equal' Op 的输入'y' 的 int32 类型与参数'x'的 int64 类型不匹配。
    • class_indexes_to_keep = tf.constant([0, 3, 4, 6, 8], dtype=tf.int32) 工作吗? @tasrif
    • 现在可以了!此外,更改 y_train = y_train.astype('int64') y_test = y_test.astype('int64') 也可以
    • Alos,我可以使用此管道将类向量(整数)转换为二进制类矩阵吗?比如使用tf.keras.utils.to_categorical
    • 肯定是的,但你必须确保你的整数从零开始直到 n。请参阅更新的答案。
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多