提问人:Didlex 提问时间:11/8/2023 更新时间:11/8/2023 访问量:14
tf.data API 'flat_map' 方法,用于在字典中使用 VariantDatasets 在窗口方法后解包
tf.data API 'flat_map' method for unpacking after window method with VariantDatasets in dictionary
问:
当尝试使用 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)
])
答: 暂无答案
评论