如何在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)
额外注意事项
你的示例代码还有两个隐藏问题需要修正:
- 生成器内先执行
idx++再取值,会跳过数组第一个元素,还会在最后一次循环时访问超出数组边界的索引 tf.data.generator要求yield的返回值必须是Tensor类型,不能直接返回字符串,需要转换为张量后再返回
内容的提问来源于stack exchange,提问作者Stanley
相关产品推荐
相关产品推荐

