Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到tf.Dataset的len()_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 如何找到tf.Dataset的len()

Python 如何找到tf.Dataset的len(),python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我已经开始使用作为将数据加载到keras模型中的一种方法,因为它们似乎比keras的ImageDataGenerator快得多,并且比阵列上的训练更节省内存 有一种想法是,我无法理解,那就是我似乎找不到访问数据集len()的方法。Keras'ImageDataGenerator有一个名为n的属性,我用于此目的。这使得我的代码非常难看,因为我需要硬编码scripy各个部分的长度(例如,找出一个历元有多少次迭代) 我能解决这个问题吗 示例脚本: #生成器 def生产序列发生器(批量大小): (x_列

我已经开始使用作为将数据加载到keras模型中的一种方法,因为它们似乎比keras的ImageDataGenerator快得多,并且比阵列上的训练更节省内存

有一种想法是,我无法理解,那就是我似乎找不到访问数据集
len()
的方法。Keras'
ImageDataGenerator
有一个名为
n
的属性,我用于此目的。这使得我的代码非常难看,因为我需要硬编码scripy各个部分的长度(例如,找出一个历元有多少次迭代)

我能解决这个问题吗

示例脚本:

#生成器
def生产序列发生器(批量大小):
(x_列,y_列),(_,)=tf.keras.mnist.load_data()
x_列=x_列。重塑((-1,28,28,1))
x_列=x_列A型(np.32)/225。
y_train=tf.keras.utils.to_categorical(y_train,10)
ds=tf.data.Dataset.from_张量_切片((x_序列,y_序列))
ds=ds.shuffle(缓冲区大小=len(x\u列))
ds=ds.repeat()
ds=ds.batch(批次大小=批次大小)
ds=ds.预取(缓冲区大小=1)
返回ds
模型=…#创建tf.keras模型
批量大小256
gen=制造列发电机(批量大小)
#训练
模型拟合(发电机,历元=50,每历元步数=60000/批次尺寸+1)#发电机硬编码尺寸
tl;博士 不幸的是,
tf.data.Dataset
是一个生成器,没有找到其大小的固有方法

但是 一般来说,当您使用
.from_tensor_slices()
时,您可以通过在此方法中添加的参数来了解其大小,在您的示例中是
x\u train
。您唯一的问题是您正在函数中创建它

为了绕过这个问题,你可以做一个简单的修改,那就是自己添加一个
\uu\len\uu
属性!我发现最简单的方法是:

ds.\uuuuuuuuuuuuuuuuuuuu类=类型(ds.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在您的情况下,它看起来像这样:

def制造列表列生成器(批量大小):
(x_列,y_列),(_,)=tf.keras.mnist.load_data()
x_列=x_列。重塑((-1,28,28,1))
x_列=x_列A型(np.32)/225。
y_train=tf.keras.utils.to_categorical(y_train,10)
ds=tf.data.Dataset.from_张量_切片((x_序列,y_序列))
ds=ds.shuffle(缓冲区大小=len(x\u列))
ds=ds.repeat()
ds=ds.batch(批次大小=批次大小)
ds=ds.预取(缓冲区大小=1)
ds.\uuuuu类=类型(ds.\uuuuu类\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回ds
gen=制造列发电机(批量大小)
model.fit(gen,epochs=50,每epoch步数=len(gen)//批量大小+1)#生成器的硬编码大小
为什么要这样做? 我在过去做过,它非常有用。您希望生成器具有
len()
的原因有很多。例如:

  • 如果要将生成器放在单独的模块中并导入它
  • 如果生成器将由不知道用于创建它的数据的其他人使用

您需要
len
作为步骤,对吗?@M.Innat是的,这是正确的。