tf.data API 'flat_map' 方法,用于在字典中使用 VariantDatasets 在窗口方法后解包

tf.data API 'flat_map' method for unpacking after window method with VariantDatasets in dictionary

提问人:Didlex 提问时间:11/8/2023 更新时间:11/8/2023 访问量:14

问:

当尝试使用 flat_map 方法解压缩特征字典中的子 VariantDatasets 时,我很难理解要解析为 flat_map 方法的函数,以成功获取用于训练的时间序列数据集。

我定义数据集并映射函数以拆分为特征和标签:

self.data_ds = tf.data.experimental.CsvDataset(
            ['TData/train.csv'], self.defaults, header=True)
        print(list(self.data_ds.take(1)))
        self.data_ds = self.data_ds.map(self._parse_csv_row).batch(4)
        self.window_data(self.data_ds)

定义为:self._parse_csv_row

    def _parse_csv_row(self, *vals):
        feat_vals = vals[:16]
        features = dict(zip(self.column_names[:-1], feat_vals))
        # features = feat_vals
        class_label = vals[16]
        # class_label = {self.column_names[-1]: class_label}

        return features, class_label

定义如下,问题似乎出在flat_map方法中的函数上。我正在努力理解如何从根本上正确解开它。self.window_data

    def window_data(self, data_ds):
        data_ds = data_ds.window(self.window_size, shift=self.shift, drop_remainder=True)
        for sub_ds in data_ds.take(1):
            print(sub_ds)
        data_ds = data_ds.flat_map(lambda xs, y: {key: window.batch(self.window_size) for key, window in xs})

        return data_ds

给出以下输出:print(sub_ds)

({'close': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'volume': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'pricechange': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'sma': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'macd': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'macdsignal': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'macdhist': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'upperband': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'middleband': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'lowerband': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'rsi': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'slowk': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'slowd': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'cci': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'adx': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>, 'atr': <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>}, <_VariantDataset element_spec=TensorSpec(shape=(None,), dtype=tf.float32, name=None)>)

到目前为止,一切看起来都很好。

我或多或少一直在疯狂猜测我需要输入什么作为函数。该函数需要两个变量,xs 和 y。我在这里找到了当前在 flat_map 方法中的函数:https://github.com/tensorflow/tensorflow/issues/39414。但是我必须添加 y,因为 lambda 需要 2 个变量。

我基本上是试图将这些数据拟合到下面的模型中。最终数据集的窗口大小应为 300,并且有 16 个要素。小批量大小我会在它开始工作后增加,但它使调试更容易。

numeric_features = [tf.feature_column.numeric_column(feat) for feat in data.column_names[:-1]]
feature_layer = tf.keras.layers.DenseFeatures(numeric_features)
# output_bias = tf.keras.initializers.Constant(init_bias)
model1 = Sequential([
    feature_layer,
    LSTM(units=64, stateful=True),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dropout(0.3),
    Dense(units=8, activation='tanh', kernel_regularizer=tf.keras.regularizers.L2(0.16)),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dropout(0.3),
    Dense(units=1, activation='sigmoid') # , bias_initializer=output_bias)
])
python tensorflow tensorflow-datasets 数据预处理

评论


答: 暂无答案