【问题标题】:From .tfrecord to tf.data.Dataset to tf.keras.model.fit从 .tfrecord 到 tf.data.Dataset 到 tf.keras.model.fit
【发布时间】:2020-01-18 22:47:43
【问题描述】:

我正在尝试使用 Tensorflow (v2.0) 的数据集 API 将大量数据传递给 tf.keras.model。这是我的数据集的简化版本:

for rec in my_dataset:
    print(repr(rec))

$ {'feature0': <tf.Tensor: id=528, shape=(), dtype=float32, numpy=0.2963>,
'feature1': <tf.Tensor: id=618, shape=(), dtype=int64, numpy=0>,
'feature2': <tf.Tensor: id=620, shape=(), dtype=string, numpy=b'Inst1'>,
'target': <tf.Tensor: id=621, shape=(), dtype=int64, numpy=2>}
{'feature0': <tf.Tensor: id=528, shape=(), dtype=float32, numpy=0.4633>,
'feature1': <tf.Tensor: id=618, shape=(), dtype=int64, numpy=1>,
'feature2': <tf.Tensor: id=620, shape=(), dtype=string, numpy=b'Inst4'>,
'target': <tf.Tensor: id=621, shape=(), dtype=int64, numpy=0>}

...等等。 my_dataset 对象中的每条记录都是一个字典,其中特征(和目标)名称作为键,关联的张量作为值。我从几个 .tfrecord 文件中创建了数据集,因此在每个张量对应一个 tf.train.Example(包装器)对象的意义上,我受到了限制。数据集与 tensorflow 文档中的格式完全匹配(例如,参见 https://www.tensorflow.org/tutorials/load_data/tfrecord#reading_a_tfrecord_file 中的最后一个代码示例)。

我想将此数据集与 keras 一起使用。我正在使用的tf.keras.model 对象似乎都因为它们的fit 函数而将表示特征向量(X)和目标(y)的元组作为输入。我想我可以弄清楚如何将张量从我的数据集中转换为 numpy 数组并以这种方式将它们传递给模型,或者使用迭代器迭代数据集,但如果我理解正确,这似乎违背了使用以数据集 API 开头(例如,请参阅 https://www.tensorflow.org/guide/keras/overview#train_from_tfdata_datasets)。

我的问题:将my_dataset 转换为tf.keras.model.fit() 将收到的某种形式的适当方法是什么?或者,如果这是一个错误的问题,我错过了哪些让我无法提出正确问题的基本概念? (例如,.tfrecord 示例的结构是否应该不同?或者,我是否需要使用迭代器而不是直接将 my_dataset 传递给模型?)

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    不幸的是,我只能找到解决方法,而不是彻底的解决方案。因为tf.stack 仅适用于相同数据类型的项目,所以我需要在处理示例期间将所有数据转换为浮点数(包括所有字符串的单热编码),然后在生成的张量上使用tf.stack

    def proces_example(serialized_example):
        feature_description = get_feature_desc()  # dictionary describing features and dtypes
        target_name = get_target_name()  # so we don't include the target in our feature vector
        parsed_example = tf.io.parse_single_example(serialized_example, feature_description)
        tensor_list = []
        for tensor in parsed_example:
            if tensor != target_name:
                parsed_example[tensor] = tf.dtypes.cast(parsed_example[tensor], tf.float32)
                tensor_list.append(parsed_example[tensor])
        X = tf.stack(tensor_list)
        y = parsed_example[target_name]
        return X, y
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2020-12-02
      • 2021-04-23
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多