为什么我会收到错误:当使用tf.grad()实现FGSM时,Tensor会被释放?

问题描述 投票:0回答:2

我正在尝试使用tensorflow.js在MobileNet上实现快速梯度符号方法(FGSM),但是在使用tf.grad()计算梯度时,我在最新版本(1.0.1)上遇到了问题。

代码在tfjs版本0.13.0及更低版本下工作正常,但是更新到任何更高版本会导致以下错误:

core.js:15723 ERROR Error: Uncaught (in promise): Error: Tensor is disposed. Error: Tensor is disposed.
at e.throwIfDisposed (tf-core.esm.js:17)
at e.greaterEqual (tf-core.esm.js:17)
at Object.$x (tf-core.esm.js:17)
at n (tf-core.esm.js:17)
at backpropagateGradients (tf-core.esm.js:17)
at tf-core.esm.js:17
at tf-core.esm.js:17
at e.scopedRun (tf-core.esm.js:17)
at e.tidy (tf-core.esm.js:17)
at e.gradients (tf-core.esm.js:17)
at resolvePromise (zone.js:831)
at zone.js:896
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:17289)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
at drainMicroTaskQueue (zone.js:601)
at push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask (zone.js:502)
at ZoneTask.invoke (zone.js:487)
at timer (zone.js:2281)

调用tf.grad(lossFunction)时发生错误:

任何帮助/见解表示赞赏!

完整代码:

let canvas = <HTMLCanvasElement> document.getElementById('canvas')

let img = tf.browser.fromPixels(canvas, 3) //let img = tf.fromPixels(canvas, 3)
let img4 = tf.browser.fromPixels(canvas, 4) //let img4 = tf.fromPixels(canvas, 4)

let model = mobilenet.load().then(model =>
{
    var output = model.classify(img, 3).then(predictions =>
    {
        let tbuffer = tf.buffer([1000])
        var labelClasses = IMAGENET_CLASSES 

        let targetClass = predictions[0].className
        Object.keys(labelClasses).forEach(function(key) 
        {
            if (labelClasses[key].valueOf() == targetClass.valueOf()) 
            {
                tbuffer.set(1, parseInt(key));
            }
        })          

        const oneHotLabels = tbuffer.toTensor()

        const getModelLogits = x => model.infer(x)
        const lossFunction = x => tf.losses.softmaxCrossEntropy(oneHotLabels, getModelLogits(x).as1D())
        const gradientFunction = tf.grad(lossFunction)
        var gradient = gradientFunction(img)


        // scale the gradient and apply to original image
        var perturbation = this.scaleGradient(gradient, 50)
        const zeroes = new Uint8Array(224*224).fill(0)
        let alphaChannel = tf.tensor3d(zeroes, [224, 224, 1]) 
        let perturbationWithAlpha = tf.concat([perturbation, alphaChannel], 2)  
        var adversarialImage = tf.add(tf.cast(img4,'float32'), perturbationWithAlpha)

        // Draw adversarial image to canvas
        var context = canvas.getContext("2d")
        let imgArray = Uint8ClampedArray.from(adversarialImage.dataSync());
        let imgData = context.createImageData(this.imgHeight, this.imgWidth);
        imgData.data.set(imgArray);
        context.putImageData(imgData, 0, 0);            

    }) 
})  

这里有完整的回购:https://github.com/BenMcFadyen/tfjsFGSM https://github.com/BenMcFadyen/tfjsFGSM/blob/master/src/app/app.component.ts

FGSM代码最初来自:https://github.com/jaxball/advis.js

full trace

successful execution on tensorflow/[email protected], tensorflow-models/[email protected]

deep-learning tensorflow.js pre-trained-model
2个回答
1
投票

我重现了错误并手动验证了https://github.com/tensorflow/tfjs-core/pull/1604修复它。修复将在下一个TF.js版本(1.0.2)中发布,我们计划在本周末推出。

即使MobileNet现在是tf.GraphModel而不是tf.LayersModel,渐变仍然有效,因为该库非常渴望并且可以即时计算渐变。


2
投票

tensorflow-models/[email protected]是一个tf.LayersModel,它提供渐变,因此可以重新训练。但是,为了从TF-Hub提供MobileNet V2,tensorflow-models/[email protected]被改为tf.GraphModel中的https://github.com/tensorflow/tfjs-models/pull/161。 GraphModels不提供渐变,因此您的代码不再有效。

我认为你有几条可能的前进道路:

  1. 如果满足您的需求,请坚持使用工作版本(tensorflow-models/[email protected]应该使用高达0.15.3的tfjs,尽管这会产生弃用警告)。
  2. PR#156的fork tensorflow / tfjs-models在那里构建了mobilenet包。这与0.2.2相同,只是它可以与tfjs> 1.0.0一起使用。
  3. 从头开始fork tensorflow / tfjs-models,并将模型加载部分恢复为使用tf.loadLayersModel()和#161中删除的BASE_PATH。 (这只能让你获得V1)。
  4. 获得Keras .h5格式的MobileNet V2(例如,来自here)并使用TF.js converter获得tf.LayersModel
© www.soinside.com 2019 - 2024. All rights reserved.