gpt4 book ai didi

python - 有没有一种简单的方法可以在 tensorflow 中将 tf.data.Dataset.from_generator 中的特性与自定义 model_fn(Estimator) 结合使用

转载 作者:太空狗 更新时间:2023-10-29 21:45:13 27 4
gpt4 key购买 nike

我正在为我的训练数据使用 tensorflow 数据集 api,为 tf.data.Dataset.from_generator api 使用 input_fn 和生成器

def generator():
......
yield { "x" : features }, label


def input_fn():
ds = tf.data.Dataset.from_generator(generator, ......)
......
feature, label = ds.make_one_shot_iterator().get_next()
return feature, label

然后我使用如下代码为我的 Estimator 创建了一个自定义 model_fn:

def model_fn(features, labels, mode, params):
print(features)
......
layer = network.create_full_connect(input_tensor=features["x"],
(or layer = tf.layers.dense(features["x"], 200, ......)
......

训练时:

estimator.train(input_fn=input_fn)

但是,代码不起作用,因为函数 model_fn 的 features 参数是这样的:

Tensor("IteratorGetNext:0", dtype=float32, device=/device:CPU:0)

代码 "features["x"]"会失败并告诉我:

......"site-packages\tensorflow\python\ops\array_ops.py", line 504, in _SliceHelper end.append(s + 1) TypeError: must be str, not int

如果我将 input_fn 更改为:

input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": np.array([[1,2,3,4,5,6]])},
y=np.array([1]),

代码继续,因为 features 现在是一个字典。

我搜索了 estimator 的代码,发现它使用了一些函数,例如

features, labels = self._get_features_and_labels_from_input_fn(
input_fn, model_fn_lib.ModeKeys.TRAIN)

从 input_fn 中检索特征和标签,但我不知道为什么它通过使用不同的数据集实现传递给我(model_fn)两种不同数据类型的特征,如果我想使用我的生成器模式,那么如何使用它类型(IteratorGetNext)的功能?

感谢您的帮助!

[更新]

我对代码做了一些修改,

def generator():
......
yield features, label

def input_fn():
ds = tf.data.Dataset.from_generator(generator, ......)
......
feature, label = ds.make_one_shot_iterator().get_next()
return {"x": feature}, label

然而,在 tf.layers.dense 仍然失败,现在它说

"Input 0 of layer dense_1 is incompatible with the layer: its rank is undefined, but the layer requires a defined rank."

虽然特征是一个字典:

'x': tf.Tensor 'IteratorGetNext:0' shape=unknown dtype=float64

在正确的情况下,它是:

'x': tf.Tensor 'random_shuffle_queue_DequeueMany:1' shape=(128, 6) dtype=float64

我从

学到了类似的用法

https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html

def my_input_fn(file_path, perform_shuffle=False, repeat_count=1):
def decode_csv(line):
......
d = dict(zip(feature_names, features)), label
return d

dataset = (tf.data.TextLineDataset(file_path)

但是对于将迭代器返回到自定义 model_fn 的生成器情况,没有官方示例。

最佳答案

根据examples on how to use from_generator ,生成器返回要放入数据集中的,而不是特征字典。相反,您在 input_fn 中构建字典.

按如下方式更改代码应该可以正常工作:

def generator():
......
yield features, label

def input_fn():
ds = tf.data.Dataset.from_generator(generator, ......)
......
feature, label = ds.make_one_shot_iterator().get_next()
return {"x": feature}, label

回复更新:

您的代码失败是因为 Dataset.from_generator 的迭代器生成的张量没有静态 shape已定义(因为生成器原则上可以返回不同形状的数据)。假设您的数据确实始终具有相同的形状,您可以调用 feature.set_shape(<the_shape_of_your_data>)之前return来自 input_fn (有关执行此操作的正确方法,请参阅编辑打击)。

编辑:

正如您在评论中指出的那样, tf.data.Dataset.from_generator() 有第三个参数设置输出张量的形状,所以不是feature.set_shape()只需将形状传递为 output_shapesfrom_generator() .

关于python - 有没有一种简单的方法可以在 tensorflow 中将 tf.data.Dataset.from_generator 中的特性与自定义 model_fn(Estimator) 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com