Tensorflow.js SymbolicTensor不被接受为输入

时间:2019-01-29 19:55:55

标签: javascript node.js tensorflow tensorflow.js

我正在尝试在Tensorflow.js中重现A2C算法,我想我已经成功地为演员和评论家重现了模型。

但是,我正在使用一种热编码,以便将当前状态作为模型的输入提供,在此之前,我正在使用tf.input()函数设置输入,该函数返回SymbolicTensor (对我而言,其行为与Python API中的tf.placeholder相同)。

tf.oneHot函数仅接受tf.Tensor对象作为第一个参数,我在文档中看不到任何解决方法。我本以为tf.SymbolicTensor是从tf.Tensor继承的,但事实并非如此。

class A2CAgent {
    constructor(state_size, action_size) {
        this.render = false;
        this.state_size = state_size;
        this.action_size = action_size;
        this.value_size = 1;

        this.discount_factor = 0.99;
        this.actor_learningr = 0.001;
        this.critic_learningr = 0.005;

        this.actor = this.build_actor();
        #this.critic = this.build_critic();

    }

    build_actor() {
        const model = tf.sequential();

        this.state = tf.input({name:"state", dtype:'int32', shape:[]});
        let one_hot = tf.oneHot(this.state, this.state_size); //Pb ne prend pas de placeholder
        model.add(tf.layers.dense({
            units: 24,
            activation: 'relu',
            kernelInitializer:'glorotUniform',
            inputDim:tf.expandDims(one_hot, 0),
        }));

        model.add(tf.layers.dense({
            units: this.action_size,
            activation:'softmax',
            kernelInitializer:'glorotUniform',
        }));

        model.summary();

        model.compile({
            optimizer: tf.train.adam(this.actor_learningr),
            loss:tf.losses.softmaxCrossEntropy
        });

        return model;
    }
}

我希望这段代码能很好地执行,但我得到了这个错误:

Error: Argument 'indices' passed to 'oneHot' must be a Tensor or TensorLike, but got 'SymbolicTensor'

关于如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

tf.oneHot带有多个参数,但是2个必需的indicesdepth的类型分别为tensor1dnumber。 要创建密集层,无需传递onehot编码张量,尤其是在使用顺序模型时。您可能必须为模型提供一个单张量,但只有在训练过程中将模型与特征和标签数据配合时,才会发生。

tf.js没有类似于tensorflow的占位符的方法,该方法首先在会话中执行图形之前先构建图形。您可以参考此answer,突出显示两种实现之间的区别

另外,请注意inputDim应该是数字而不是张量