You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras调用model.fit训练遇GPU显存不足,分块调用fit()训练是否有效?

问题解答

核心疑问回复

  1. 多次调用fit()的权重保留问题:
    只要你是对同一个模型实例hypermodel调用fit()方法,模型权重会持续保留并迭代更新,不会在两次调用之间重置,这一点完全符合框架设计逻辑,不用担心权重丢失的问题。
  2. 当前调整后方案的合理性:
    你通过手动分块加载数据、调用后删除变量+垃圾回收的方式,确实解决了最初的显存溢出报错,该方案可以正常运行,但存在训练逻辑缺陷和优化空间。

原始报错原因

你最初遇到的Dst tensor is not initialized报错本质是GPU显存不足:你直接切片读取全量加载在内存中的数据集时,TensorFlow会尝试将整块切片对应的数据一次性拷贝到GPU,加上你设置的批次参数不合理,导致GPU显存被占满后无法完成张量初始化。你后续添加np.ndarray.copy、用完即删变量、触发垃圾回收的操作,避免了内存中冗余数据被误传输到GPU,同时释放了每轮迭代占用的GPU显存,因此解决了崩溃问题。


当前方案的问题与优化建议

  • 训练逻辑缺陷:你现在的代码是对每一个数据块都训练best_epoch轮,相当于小块数据被重复训练多次,会导致模型在局部数据上过拟合,泛化能力下降。正确的逻辑应该是外层循环控制总训练轮数(即best_epoch),内层循环遍历所有数据块,每个数据块每次只训练1轮:
for epoch in range(best_epoch):
    print(f"[INFO] Epoch {epoch+1}/{best_epoch}")
    for i in range(0,sizeDS,size4train):
        startindex = i
        endIndex = min(i + size4train, sizeDS) # 避免索引越界
        xTrain = np.ndarray.copy(trainImages[startindex:endIndex])
        yCoord = np.ndarray.copy(trainCoordinates[startindex:endIndex])
        yClass = np.ndarray.copy(trainClasses[startindex:endIndex])
        yTrain = (yCoord,yClass)
        hypermodel.fit(x = xTrain, y = yTrain,
                   validation_data=(testImages, (testCoordinates, testClasses)),
                   epochs=1, # 单个数据块仅训练1轮
                   batch_size = 8,
                   verbose='auto')
        del xTrain, yTrain, yCoord, yClass
        gc.collect()
  • 更推荐的实现方式:无需手动分块管理内存,直接使用TensorFlow内置的tf.data.Dataset流水线加载数据,框架会自动完成分批、预加载、显存调度,代码更简洁也更稳定,同时避免手动分块可能带来的逻辑错误。

内容的提问来源于stack exchange,提问作者L. Arturo Torres-Romero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:54:01