Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 在大数据集上训练模型的最佳实践是什么_Python_Tensorflow_Deep Learning_Tensorflow2.0_Tensorflow2.x - Fatal编程技术网

Python 在大数据集上训练模型的最佳实践是什么

Python 在大数据集上训练模型的最佳实践是什么,python,tensorflow,deep-learning,tensorflow2.0,tensorflow2.x,Python,Tensorflow,Deep Learning,Tensorflow2.0,Tensorflow2.x,我需要在需要比GPU更多内存的数据集上训练模型。将数据集提供给模型的最佳实践是什么 以下是我的步骤: 首先,我使用批处理大小加载数据集 BATCH\u SIZE=32 builder=tfds.builder('mnist') builder.download_和_prepare() 数据集=builder.as\u数据集(批量大小=批量大小) 第二步我准备数据 原始序列记录的(1): 列车图像,列车标签=记录['image'],记录['label'] 打印(序列图像.形状) train\u

我需要在需要比GPU更多内存的数据集上训练模型。将数据集提供给模型的最佳实践是什么

以下是我的步骤:

  • 首先,我使用批处理大小加载数据集
  • BATCH\u SIZE=32
    builder=tfds.builder('mnist')
    builder.download_和_prepare()
    数据集=builder.as\u数据集(批量大小=批量大小)
    
  • 第二步我准备数据
  • 原始序列记录的
    (1):
    列车图像,列车标签=记录['image'],记录['label']
    打印(序列图像.形状)
    train\u images=train\u images.numpy().astype(np.float32)/255.0
    列车标签=tf.keras.utils.to\u分类(列车标签)
    
  • 然后我把数据输入模型
  • history=model.fit(序列图像、序列标签、历元数=NUM\u历元、验证分割=0.2)
    
    但在步骤2中,我为第一批准备了数据,却错过了其余批,因为model.fit超出了循环范围(据我所知,它只适用于第一批中的一个)。
    另一方面,我不能删除take(1)并在循环下移动model.fit方法。因为是的,在这种情况下,我将处理所有批次,但同时在每次迭代结束时调用model.fill,在这种情况下,它也无法正常工作

    那么,我应该如何更改代码,以便能够使用model.fit适当地处理大型数据集呢?你能指出这篇文章,任何文件,或只是建议如何处理它吗?谢谢

    更新
    在我下面的帖子(方法1)中,我描述了一种解决问题的方法——有没有其他更好的方法,或者这只是解决问题的一种方法

    您可以将整个数据集传递给
    fit
    进行培训。如中所示,第一个参数的可能值之一是:

    • 数据集。应返回
      (输入,目标)
      (输入,目标,样本权重)
      的元组
    因此,您只需将数据集转换为该格式(包含输入和目标的元组),并将其传递给
    fit

    BATCH\u SIZE=32
    builder=tfds.builder('mnist')
    builder.download_和_prepare()
    数据集=builder.as\u数据集(批量大小=批量大小)
    原始列车ds=数据集['train']
    列车数据集拟合=原始列车ds.map(
    lambda x:(tf.cast.dtypes(x['image'],tf.float32)/255.0,x['label']))
    历史=model.fit(训练数据集拟合,历代=NUM历代)
    
    这样做的一个问题是,它不支持
    验证\u split
    参数,但如中所示,它已经为您提供了进行数据拆分的功能。因此,您只需获取测试分割数据集,如上所述对其进行转换,并将其作为
    validation\u data
    传递给
    fit

    方法1 谢谢@jdehesa我更改了代码:

  • load dataset—实际上,在dataset迭代器的第一次调用“next”之前,它不会将数据加载到内存中。即使这样,我认为迭代器将加载一部分数据(批处理),其大小等于批处理大小
  • raw\u-train\ds,raw\u-validation\u-ds=builder.as\u数据集(拆分=[“train[:90%],“train[10%:]”,批次大小=批次大小)
    
  • 将所有必需的转换收集到一个方法中
  • def准备_数据(x):
    列车图像,列车标签=x['image'],x['label']
    #TODO:调整图像大小
    train_images=tf.cast(train_images,tf.float32)/255.0
    #train\u labels=tf.keras.utils.to\u category(train\u labels,num\u classes=num\u classes)
    列车标签=tf.one\u热(列车标签,数量类)
    返回(列车图像、列车标签)
    
  • 使用方法td.data.dataset.map将这些转换应用于批处理(dataset)中的每个元素
  • train\u dataset\u fit=raw\u train\u ds.map(准备数据)
    
  • 然后将这个数据集输入model.fit——据我所知,model.fit将迭代数据集中的所有批处理
    train\u dataset\u fit=raw\u train\u ds.map(准备数据)
    历史=model.fit(训练数据集拟合,历代=NUM历代)
    
    我不能使用lambda,因为我需要使用
    train\u labels=tf.keras.utils.to\u category(train\u labels)
    并调整图像大小和其他转换。。。。(((