我正在尝试编写一个自定义模型,并在其中编写自定义train_step
函数
我正在从自定义数据生成器创建一个'tf.data.Dataset',如
tds = tf.data.Dataset.from_generator(tdg.__iter__,args=None,output_types = (tf.float32,tf.int32),output_shapes = (tf.TensorShape([16,64,64,3]),tf.TensorShape([16])))
tds = tds.batch(1)
在自定义DataGenerator中,__iter__
方法定义为
def __iter__(self):
for item in (self[i] for i in range(len(self))):
yield item
但是,当我尝试检索train_step
函数中的数据时,使用x,y = data
时,我得到Tensor("IteratorGetNext:0", shape=(None, 16, 64, 64, 3), dtype=float32)
和Tensor("IteratorGetNext:1", shape=(None, 16), dtype=int32)
作为输出
如果我运行print(x[0])
,那么Tensor("strided_slice:0", shape=(16,), dtype=int32)
我没有获得具有numpy()
属性的Tensor
这到底是怎么回事?
3条答案
按热度按时间jyztefdp1#
这适用于tf.data
fslejnso2#
你可以测试类似的东西--你的结构中需要一些形状的修正probably--我不知道你的代码),或者根据你的任务进行修正:
虽然奇怪的结果似乎对我(增加准确性增加损失-这是正常的吗??):
HERE可以看到简短的示例...主要在类dataGenerator中init&getitem&len方法很重要...其他方法(iter,on_epoch_end)需要在您自己的最小可重现示例中进行测试...可以添加on_epoch_end检查
附言
或者您可以将您的类重构为 simple gen_function,而不是class -e.g.-但我怀疑它在训练中是否能正常工作(尽管这里gen-function似乎可以正常工作)
hkmswyz63#
我认为你可能没有正确定义你的生成器。你通过定义
__iter__
方法来定义一个 iterable,但是这可能不是必需的。我的理解是生成器是迭代器,但是***迭代器不是生成器***。要在一个类中实现一个生成器,我想你可能需要这样的东西: