Gestión de memoria sobre tf.Model en TensorFlow.js

Gestión de memoria sobre tf.Model en TensorFlow.js

Soy un novato en TensorFlow.

La sección "Administración de memoria: dispose y tf.tidy" en https://js.tensorflow.org/tutorials/core-concepts.html dice que tenemos que administrar los recuerdos de forma especial.

Sin embargo, las clases en tfjs-layers (por ejemplo, tf.Model y Layer) no parecen tener dispose y tf.tidy no los acepta como valores devueltos.

Entonces mis preguntas son:

  • ¿tf.Model administra las memorias automáticamente?
  • Si no, ¿cómo puedo administrar los recuerdos correctamente?

Código de ejemplo:

function defineModel(
    regularizerRate: number,
    learningRate: number,
    stateSize: number,
    actionSize: number,
): tf.Model {
    return tf.tidy(() => { // Compile error here, I couldn't return model.
        const input = tf.input({
            name: "INPUT",
            shape: [stateSize],
            dtype: "int32" as any, // TODO(mysticatea): https://github.com/tensorflow/tfjs/issues/120
        })
        const temp = applyHiddenLayers(input, regularizerRate)
        const valueOutput = applyValueLayer(temp, regularizerRate)
        const policyOutput = applyPolicyLayer(temp, actionSize, regularizerRate)
        const model = tf.model({
            inputs: [input],
            outputs: [valueOutput, policyOutput],
        })

        // TODO(mysticatea): https://github.com/tensorflow/tfjs/issues/98
        model.compile({
            optimizer: tf.train.sgd(LEARNING_RATE),
            loss: ["meanSquaredError", "meanSquaredError"],
        })
        model.lossFunctions[1] = softmaxCrossEntropy

        return model
    })
}
Mostrar la mejor respuesta

Solo debe usar tf.tidy() cuando manipule tensores directamente.

Cuando está construyendo un modelo, todavía no está manipulando directamente los tensores, sino que está configurando la estructura de cómo encajan las capas. Esto significa que no necesita envolver la creación de su modelo en un tf.tidy().

Solo cuando llamas a "predecir()" o "ajustar()" nos ocupamos de valores de tensor concretos y necesitamos ocuparnos de la gestión de la memoria.

Cuando se llama a "predict()", devuelve un tensor, que debe desechar o rodear con un "tidy()".

En el caso de "fit()", internamente hacemos toda la gestión de la memoria por usted. El valor de retorno de "fit()" son números simples, por lo que no necesita envolverlo en un "tidy()".