当前位置: 首页 > 面试题库 >

TypeError:不支持使用带有估算器input_fn的数据集调用

闽经纬
2023-03-14
问题内容

我正在尝试将Iris教程(https://www.tensorflow.org/get_started/estimator)转换为从.png文件而不是.csv中读取训练数据。它可以使用,numpy_input_fn但是当我用制作时却不能Dataset。我认为input_fn()返回的是错误的类型,但实际上并不清楚它应该是什么以及如何制作它。错误是:

  File "iris_minimal.py", line 27, in <module>
    model_fn().train(input_fn(), steps=1)
    ...
    raise TypeError('unsupported callable') from ex
TypeError: unsupported callable

TensorFlow版本为1.3。完整的代码:

import tensorflow as tf
from tensorflow.contrib.data import Dataset, Iterator

NUM_CLASSES = 3

def model_fn():
    feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]
    return tf.estimator.DNNClassifier([10, 20, 10], feature_columns, "tmp/iris_model", NUM_CLASSES)

def input_parser(img_path, label):
    one_hot = tf.one_hot(label, NUM_CLASSES)
    file_contents = tf.read_file(img_path)
    image_decoded = tf.image.decode_png(file_contents, channels=1)
    image_decoded = tf.image.resize_images(image_decoded, [2, 2])
    image_decoded = tf.reshape(image_decoded, [4])
    return image_decoded, one_hot

def input_fn():
    filenames = tf.constant(['images/image_1.png', 'images/image_2.png'])
    labels = tf.constant([0,1])
    data = Dataset.from_tensor_slices((filenames, labels))
    data = data.map(input_parser)
    iterator = data.make_one_shot_iterator()
    features, labels = iterator.get_next()
    return features, labels

model_fn().train(input_fn(), steps=1)

问题答案:

我注意到您的代码段中存在一些错误:

  • train方法接受输入 功能 ,所以它应该是input_fn,不input_fn()
  • 这些功能应作为字典,例如{'x': features}
  • DNNClassifier使用SparseSoftmaxCrossEntropyWithLogits损失函数。 稀疏 意味着它采用序数类表示形式,而不是单项表示形式,因此无需进行转换(此问题解释了tf中交叉熵损失之间的区别)。

请尝试以下代码:

import tensorflow as tf
from tensorflow.contrib.data import Dataset

NUM_CLASSES = 3

def model_fn():
    feature_columns = [tf.feature_column.numeric_column("x", shape=[4], dtype=tf.float32)]
    return tf.estimator.DNNClassifier([10, 20, 10], feature_columns, "tmp/iris_model", NUM_CLASSES)

def input_parser(img_path, label):
    file_contents = tf.read_file(img_path)
    image_decoded = tf.image.decode_png(file_contents, channels=1)
    image_decoded = tf.image.resize_images(image_decoded, [2, 2])
    image_decoded = tf.reshape(image_decoded, [4])
    label = tf.reshape(label, [1])
    return image_decoded, label

def input_fn():
    filenames = tf.constant(['input1.jpg', 'input2.jpg'])
    labels = tf.constant([0,1], dtype=tf.int32)
    data = Dataset.from_tensor_slices((filenames, labels))
    data = data.map(input_parser)
    data = data.batch(1)
    iterator = data.make_one_shot_iterator()
    features, labels = iterator.get_next()
    return {'x': features}, labels

model_fn().train(input_fn, steps=1)


 类似资料:
  • 回溯(最近调用的最后一次): 文件“”,第1行,在runfile('/experient.py',wdir='/tensorflow')中 文件“C:\users\hp\anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”,第710行,在runfile execfile(文件名,命名空间)中 文件“C:\users\hp\a

  • 我正试图创建一个也支持负数的计算器,并最终创建一个lisp风格的树。 我这样定义lexer规则: 我对每个操作都有一个规则,例如: 但是当我尝试输入表达式:时,出来的lisp树是。 为什么它忽略 ?

  • 井。我交叉编译了android的qemu,当我使用用户模式运行程序时,它显示有一个不受支持的ioctl调用。例如,我运行: 它给了我 因此,我认为我可能想要做的是手动添加ioctl调用。但问题是我只知道cmd号码,我怎么能弄清楚我应该添加什么?谢谢!

  • 问题内容: 每当我运行这个程序我都会得到这个 我该怎么做才能将pyc除以tpy? 问题答案: 通过将它们变成整数: 在python 3中,该函数返回一个字符串。总是。这是对Python 2的更改;该功能已重命名为。

  • 问题内容: 当我运行该函数时,它会引发以下错误,这是为什么呢? 问题答案: 显然,您正在传递给函数。可能是用python2.x编写的(返回列表时)。使用python3.x时,返回一个行为更像a而不是a的对象。因此,无法对其进行索引。 解决方案是将(或简单地)传递给。

  • 问题内容: 我有这个查询: 我收到以下错误: some_id是一个整数,但我想选择具有some_id = 1的指标(或任何我决定放入变量的#)。 问题答案: 这会将参数转换为可索引的列表。假设您的方法像我想的那样工作,这应该工作。 发生错误是因为该方法中的某个地方,它可能试图遍历该输入或直接对其进行索引。可能是这样的: 通过使其成为列表(或可迭代的),您就可以像这样将其索引到第一个元素中。 您还可