Python 如何找到tf.Dataset的len()
我已经开始使用作为将数据加载到keras模型中的一种方法,因为它们似乎比keras的ImageDataGenerator快得多,并且比阵列上的训练更节省内存 有一种想法是,我无法理解,那就是我似乎找不到访问数据集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_列
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是的,这是正确的。