比如说,我们有输入x
和标签y
:
iterator = tf.data.Iterator.from_structure((x_type, y_type), (x_shape, y_shape))
tf_x, tf_y = iterator.get_next()
现在我使用generate函数创建数据集:
def gen():
for ....: yield (x, y)
ds = tf.data.Dataset.from_generator(gen, (x_type, y_type), (x_shape, y_shape))
在我的图中,我使用tf_x
和tf_y
进行训练,这很好。但是现在我想做引用,在这里我没有标签y
。我做的一个解决方法是伪造一个y(比如tf.零(y d shape)),然后使用占位符初始化迭代器。你知道吗
x_placeholder = tf.placeholder(...)
y_placeholder = tf.placeholder(...)
ds = tf.data.Dataset.from_tensors((x_placeholder, y_placeholder))
ds_init_op = iterator.make_initializer(ds)
sess.run(ds_init_op, feed_dict={x_placeholder=x, y_placeholder=fake(y))})
我的问题是,有没有更干净的方法?在推断时间内没有假a y
?你知道吗
更新:
我做了一点实验,看起来缺少一个数据集操作unzip
:
import numpy as np
import tensorflow as tf
x_type = tf.float32
y_type = tf.float32
x_shape = tf.TensorShape([None, 128])
y_shape = tf.TensorShape([None, 10])
x_shape_nobatch = tf.TensorShape([128])
y_shape_nobatch = tf.TensorShape([10])
iterator_x = tf.data.Iterator.from_structure((x_type,), (x_shape,))
iterator_y = tf.data.Iterator.from_structure((y_type,), (y_shape,))
def gen1():
for i in range(100):
yield np.random.randn(128)
ds1 = tf.data.Dataset.from_generator(gen1, (x_type,), (x_shape_nobatch,))
ds1 = ds1.batch(5)
ds1_init_op = iterator_x.make_initializer(ds1)
def gen2():
for i in range(80):
yield np.random.randn(128), np.random.randn(10)
ds2 = tf.data.Dataset.from_generator(gen2, (x_type, y_type), (x_shape_nobatch, y_shape_nobatch))
ds2 = ds2.batch(10)
# my ds2 has two tensors in one element, now the problem is
# how can I unzip this dataset so that I can apply them to iterator_x and iterator_y?
# such as:
ds2_x, ds2_y = tf.data.Dataset.unzip(ds2) #?? missing this unzip operation!
ds2_x_init_op = iterator_x.make_initializer(ds2_x)
ds2_y_init_op = iterator_y.make_initializer(ds2_y)
tf_x = iterator_x.get_next()
tf_y = iterator_y.get_next()
DataSetsAPI的目的是避免将值直接提供给会话(因为这会导致数据首先流向客户端,然后流向设备)。你知道吗
我看到的所有usedatasetsapi示例也都使用estimator API,在这里您可以为训练和推理提供不同的输入函数。你知道吗
相关问题 更多 >
编程相关推荐