【问题标题】:Tensorflow.js: Tensor disposed error when using tanh or sigmoid, but not relu activation functionTensorflow.js:使用 tanh 或 sigmoid 时张量处理错误,但不是 relu 激活函数
【发布时间】:2020-02-02 04:43:39
【问题描述】:

在 TensorFlow.js 中,我创建了一个具有 3 个密集层的顺序神经网络,当我将激活函数设置为“relu”时,它可以工作,但是当我尝试“tanh”或“sigmoid”时,它会抛出错误,“错误:张量被处置”。

我做了一个模型总结,以验证更改激活函数不会改变网络结构或参数编号。我还尝试注释掉我正在使用的tf.tidy

这是我的模型:

const myModel = tf.sequential();

myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'tanh' }));
myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'relu' }));
myModel.add(tf.layers.dense({ units: 1 }));

'tanh' 切换为'relu' 可以解决问题,但我不知道为什么。

这是我的训练代码:

optimizer.minimize(() => {
    let inputs = tf.tensor2d(x_vals);
    let predictions = myModel.predictOnBatch(inputs);
    let totalLoss = tf.losses.meanSquaredError(tf.tensor2d(y_vals), predictions);
    return totalLoss;
});

完整代码片段(运行需要一秒钟):

x_vals = [
    [1],
    [2],
    [3],
    [4],
    [5]
];

y_vals = [
    [1],
    [2],
    [3],
    [4],
    [5]
];

const optimizer = tf.train.adam(.005);


const myModel = tf.sequential();

myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'tanh' }));
myModel.add(tf.layers.dense({ units: 64, activation: 'relu' }));
myModel.add(tf.layers.dense({ units: 1 }));

myModel.summary();


optimizer.minimize(() => {
    let inputs = tf.tensor2d(x_vals);
    let predictions = myModel.predictOnBatch(inputs);
    let totalLoss = tf.losses.meanSquaredError(tf.tensor2d(y_vals), predictions);
    return totalLoss;
});


curveY = [];

for (let i = 0; i < x_vals.length; i++) {
    curveY.push(myModel.predict(tf.tensor([
        x_vals[i]
    ])).dataSync());
}


console.log(curveY);
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.js">
    </script>

</head>

<body>
</body>

</html>

【问题讨论】:

    标签: tensorflow neural-network tensorflow.js activation-function


    【解决方案1】:

    该问题与激活层无关。很可能您正在重用已在 tf.tidy 回调中处理的张量。

    这是一个使用tanhsigmoid 激活层的简单顺序模型

    const model = tf.sequential({
        layers: [
          tf.layers.dense({ units: 64, inputShape: [1], activation: 'tanh' }),
          tf.layers.dense({ units: 64, inputShape: [1], activation: 'sigmoid' }),
          tf.layers.dense({ units: 1 })
        ]
    });
    model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
    for (let i = 1; i < 5 ; ++i) {
      const h = await model.fit(tf.ones([8, 1]), tf.ones([8, 1]), {
          batchSize: 4,
          epochs: 3
      });
      console.log("Loss after Epoch " + i + " : " + h.history.loss[0]);
    }
    

    【讨论】:

    • 我从我的代码中删除了所有tf.tidy 回调和dispose 调用,但我仍然遇到同样的问题。有趣的是,当我使用 model.fit 而不是 optimizer.minimize 时,问题就消失了。我提供了完整的代码 sn-p 运行,也许这将有助于澄清。
    • 我想知道我是否应该将它作为一个错误发布在 Tensorflow.js Github 页面上。
    猜你喜欢
    • 2020-12-05
    • 2015-11-09
    • 2017-01-14
    • 2018-08-08
    • 2017-03-30
    • 1970-01-01
    • 2019-11-16
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多