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

如何在TensorFlow.js的tf.data.generator中传入自定义参数解决this指向错误

你的推测完全正确,问题出在类方法的this指向丢失:直接将dgg.dataGenerator作为参数传入tf.data.generator时,方法脱离了原实例的执行上下文,内部的this不再指向实例对象,因此无法读取this.test属性。

可用解决方案

  • 方案1:用bind绑定实例上下文
    直接将类方法绑定到实例后再传入即可:
let trainDs = tf.data.generator(dgg.dataGenerator.bind(dgg));
  • 方案2:用箭头函数包裹调用
    在箭头函数内部调用实例的生成器方法,天然继承外层执行上下文,无需手动绑定this:
let trainDs = tf.data.generator(() => dgg.dataGenerator());
  • 方案3:用闭包存储自定义变量(无需依赖类this)
    如果不想处理this指向问题,也可以直接用工厂函数通过闭包持有自定义变量:
// 生成器工厂函数,通过闭包存储外部变量
function createGenerator(testData) {
  return function* () {
    let len = testData.length
    let idx = 0
    while (idx < len) {
      console.log(idx + 1)
      // 注意:tf.data.generator要求返回值为tf.Tensor类型,不能直接返回字符串
      yield tf.tensor1d([testData[idx]])
      idx++
    }
  }
}

const generator = createGenerator(['hi', 'hi2', 'hi3'])
const trainDs = tf.data.generator(generator)

额外注意事项

你的示例代码还有两个隐藏问题需要修正:

  1. 生成器内先执行idx++再取值,会跳过数组第一个元素,还会在最后一次循环时访问超出数组边界的索引
  2. tf.data.generator要求yield的返回值必须是Tensor类型,不能直接返回字符串,需要转换为张量后再返回

内容的提问来源于stack exchange,提问作者Stanley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:15:01