如何使用内置的张量流方法对特征和标签张量执行 sklearn 风格的训练测试拆分?

How to perform sklearn style train-test split on feature and label tensors using built in tensorflow methods?

重新发布我的original question,因为即使在显着提高清晰度之后,它也没有被社区恢复。

我正在寻找一种使用 TensorFlow 内置方法将特征和相应标签数据拆分为训练和测试的方法。我的数据已经在两个张量中(即 tf.Tensor 对象),名为 featureslabels.

我知道如何使用 sklearn.model_selection 轻松地为 numpy 数组执行此操作,如 post. Additionally, I was pointed to this which requires the data to be in a single tensor. Also, I need the train and test sets to be disjoint, unlike in this 所示(这意味着它们在拆分后不能有公共数据点)。

我正在寻找一种使用 Tensorflow 中的内置方法来执行相同操作的方法。

我的要求可能条件太多,但基本上需要的是与 Tensorflow 中的 sklearn.model_selection.train_test_split() 等效的方法,如下所示:

import tensorflow as tf

X_train, X_test, y_train, y_test = tf.train_test_split(features,
                                                labels,
                                                test_size=0.1,
                                                random_state=123)

您可以通过以下方式使用TF来实现

from typing import Tuple

import tensorflow as tf


def split_train_test(features: tf.Tensor,
                     labels: tf.Tensor,
                     test_size: float,
                     random_state: int = 1729) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor]:

    # Generate random masks
    random = tf.random.uniform(shape=(tf.shape(features)[0],), seed=random_state)
    train_mask = random >= test_size
    test_mask = random < test_size

    # Gather values
    train_features, train_labels = tf.boolean_mask(features, mask=train_mask), tf.boolean_mask(labels, mask=train_mask)
    test_features, test_labels = tf.boolean_mask(features, mask=test_mask), tf.boolean_mask(labels, mask=test_mask)

    return train_features, test_features, train_labels, test_labels

我们在这里做的是首先创建一个大小为数据长度的随机均匀张量。 然后我们根据 test_size 给出的比率创建布尔掩码,最后我们使用 tf.boolean_mask

提取 train/test 的相关部分