Tensorflow.js: ошибка удаления тензором при использовании tanh или sigmoid, но не функция активации relu

В 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/[email protected]/dist/tf.js">
    </script>

</head>

<body>
</body>

</html>


person Brett L    schedule 03.10.2019    source источник


Ответы (1)


Проблема не связана со слоем активации. Скорее всего, вы повторно используете тензор, который уже был удален в обратном вызове tf.tidy.

Вот простая последовательная модель с использованием tanh и sigmoid слоев активации.

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]);
}
person edkeveked    schedule 04.10.2019
comment
Я удалил все tf.tidy обратные вызовы и dispose вызовы из своего кода, но проблема все еще возникает. Интересно, что проблема исчезает, когда я использую model.fit вместо optimizer.minimize. Я предоставил для запуска полный фрагмент кода, возможно, это поможет прояснить ситуацию. - person Brett L; 04.10.2019
comment
Интересно, следует ли мне опубликовать это как ошибку на странице Tensorflow.js Github. - person Brett L; 10.10.2019