如何正确组合tf.data.Dataset和tf.estimator.DNNRegressor

时间:2019-09-06 13:42:53

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

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

在tensorflow页面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的字典。给定类型:class,'tensorflow.python.framework.ops.Tensor'

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

您需要在数据库上使用.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)