【问题标题】:How to combine tf.data.Dataset and tf.estimator.DNNRegressor properly如何正确组合 tf.data.Dataset 和 tf.estimator.DNNRegressor
【发布时间】:2019-09-06 13:42:53
【问题描述】:

我目前正在学习使用 tensorflow,但在入门时遇到了麻烦。 我想使用最新的 API,即估算器和数据集。但是如果我运行下面给出的代码,我会得到一个错误。

在张量流页面https://www.tensorflow.org/api_docs/python/tf/estimator/DNNRegressor 我发现,“该函数应构造并返回以下之一:* tf.data.Dataset 对象:Dataset 对象的输出必须是具有相同的元组(特征、标签)约束如下。”

我认为我的代码会提供该功能,但似乎有问题,我没有想法。

import tensorflow as tf
def input_evaluation_set():
    data = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
    labels = []
    for d in data:
        labels.append(1)
    return tf.data.Dataset.from_tensor_slices((tf.constant(data), tf.constant(labels)))

point = tf.feature_column.numeric_column('points')
estimator = tf.estimator.DNNRegressor(feature_columns = [point],hidden_units = [100,100,100])

estimator.train(input_fn = input_evaluation_set)

我希望在具有 3 个隐藏层和 100 个神经元的深度神经网络上运行训练课程,以逼近“常数 1”函数; 相反,我得到错误“ValueError:特征应该是'Tensor's的字典。给定类型:类,'tensorflow.python.framework.ops.Tensor'

【问题讨论】:

    标签: python tensorflow machine-learning tensorflow-datasets tensorflow-estimator


    【解决方案1】:

    您的代码中的主要问题是您将数据集中的数据作为简单张量发送。但是它在数据集中输入的数据应该是字典,其键名与特征列中使用的键名相同。除此之外,我还在输入数据中添加了额外的维度。以下代码将起作用。

    import tensorflow as tf
    import numpy as np
    
    ### DEFINE NEW MAP FUNCTION
    def map_fn(d, l):
        return {'points': d}, l
    
    def input_evaluation_set():
        data = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
        labels = []
        for d in data:
            labels.append(1)
    
        ### CHANGE STARTS HERE
        data = np.array(data)
        data = np.expand_dims(data, axis=-1)
        labels = np.array(labels)
        labels = np.expand_dims(labels, axis=-1)
        ### CHANGE ENDS HERE
    
        dataset = tf.data.Dataset.from_tensor_slices((tf.constant(data), tf.constant(labels)))
    
        ### CREATE DICTIONARY PAIR IN INPUT DATA
        dataset = dataset.map(map_fn)
        return dataset
    
    point = tf.feature_column.numeric_column('points')
    estimator = tf.estimator.DNNRegressor(feature_columns = [point],hidden_units = [100,100,100])
    
    estimator.train(input_fn = input_evaluation_set)
    

    【讨论】:

    • 抱歉,这个解决方案在我的电脑上不起作用。它抛出另一个错误:ValueError:特征应该是'Tensor's的字典。给定类型:类 'NoneType'
    • 您能告诉我您使用的是哪个版本的 TensorFlow 吗?另外,您是否运行了与我给出的相同的代码,或者您在我的代码中添加了一些自己的逻辑?
    • 我安装了 tensorflow 1.14.0。我只是复制了你的代码,没有添加任何东西
    • 我在 TensorFlow 2.0.0-rc0 上测试过。 TensorFlow 1.x 有许多其他依赖问题,例如 estimator 属于 contrib 等等。我强烈建议你安装 TensorFlow 2.0 版本。您可以将其安装为pip install tensorflow==2.0.0-rc0。你不会有任何问题。
    • 现在我安装了 2.0.0-rc0 但我仍然得到同样的错误。我做错了什么?
    【解决方案2】:

    您需要在数据库上使用 .batch 才能获得正确的格式。

    以下内容在我的电脑上运行:

    import tensorflow as tf
    import numpy as np
    
    def basic_dataset(numPoints):
        data = np.linspace(0,1,numPoints)
        dataset = dict({'points': data})
        labels = []
        for d in data:
            labels.append(1)
        return tf.data.Dataset.from_tensor_slices((dataset, np.array(labels)))
    
    def input_train_set():
        dataset = basic_dataset(11)
        return dataset.repeat(100).shuffle(1000).batch(1)
    
    point = tf.feature_column.numeric_column('points')
    estimator = tf.estimator.DNNRegressor(feature_columns = [point],hidden_units = [100,100,100], label_dimension = 1)
    
    estimator.train(input_fn = input_train_set)
    

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2023-03-25
      • 2023-03-24
      • 2014-12-20
      • 2013-06-11
      • 2022-07-01
      相关资源
      最近更新 更多