【问题标题】:Get raw output from tensorflow js model从 tensorflow js 模型获取原始输出
【发布时间】:2020-05-04 20:38:42
【问题描述】:

我正在通过一个简单的卷积网络连接到 MNIST 数据集。我想手动告诉程序完成该过程中的每个步骤,即遍历每个 Epoch 和批次,而不使用 model.fit(我想更好地了解 tensorflow 的内部工作原理)。

目前我有:

let EPOCHS = 10;    
let batches = Math.floor(TRAIN_DATA_SIZE/BATCH_SIZE);

      for (let i = 0; i < EPOCHS; i++){
        for (let j = 0; i < batches; i++){
          let inputs = await getNextTrain(BATCH_SIZE,TRAIN_DATA_SIZE, data);

          let inputXs = inputs[0];
          let inputYs = inputs[1];

          let output = await model.evaluate(inputXs,inputYs);

遍历每个 Epoch 和每个批次以进行 traian。但是 model.evalutate() 不返回网络的输出值,只返回定义的损失/指标。您是否可以为此添加特定指标以返回网络的输出

我想要的是代表网络认为每个输入的输出是什么的 10 元素数组(或张量)(使用 MNIST 所以希望概率网络认为每个输出是数字 0-9)

【问题讨论】:

  • model.predict?
  • model.predict 只会返回一个全为 0 的张量,除了模型认为正确的输出为 1。我想在它选择它认为的那个之前看看所有的概率是多少
  • 不应该。您的网络中是否有一层将其输入的最大值设置为 1,其余设置为零?
  • 最后一层是dense layer,带有softmax激活函数。我不相信这会更新它以将最大值设置为 1,其余设置为 0
  • 做了更多的测试,我很确定在所有输出都为 1 或如此接近 1 之前,我非常不走运,我认为这是一个舍入错误。现在看到 model.predict 的输出分布很广

标签: javascript tensorflow


【解决方案1】:

您可以在内部循环中调用 model.fit 并设置以下参数 epoch=1 initial_epoch=i \\ So that it trains only the current epoch and batch. 'i' being outer loop variable. x=inputXs y=inputYs

这将相应地更新模型中的所有权重。然后,您可以调用 model.evaluate 或 model.predict 或 model.get_layer 来获取您想要查看的信息。由于您现在拥有每个层的信息,您可以通过仅根据需要评估特定层来独立检查它们的输出值(参考您提到的行以查看所有概率......等等)

随着更新的变化:

let EPOCHS = 10;
let batches = Math.floor(TRAIN_DATA_SIZE/BATCH_SIZE);

  for (let i = 0; i < EPOCHS; i++){
    for (let j = 0; i < batches; i++){
      let inputs = await getNextTrain(BATCH_SIZE,TRAIN_DATA_SIZE, data);

      let inputXs = inputs[0];
      let inputYs = inputs[1];
      model.fit(..on above mentioned params..);

      model.evaluate() // To get loss and metric values.
      model.predict()  // To the final output of the model for input samples given.
      model.get_layer() //To get info about a particular layer and then retrieve the required info. Refer https://keras.io/layers/about-keras-layers/

      // For example to know the 1st layer's output : model.layers[0].output;

`

【讨论】:

  • 关于这个的事情是我特别不想像 model.fit 那样更新权重/偏差。但我很确定 model.get_layer() 可能是我正在寻找的。谢谢
  • 我尝试使用 model.get_layers[0].output,但出现错误:未捕获(承诺中)类型错误:无法读取未定义的属性 '0' 你必须调用另一个预先发挥作用? (目前只在此之前调用model.predict)
  • 这是一个指示功能。它只是演示了这个过程。有关 js 中的确切函数名称,请参阅 js.tensorflow.org/api/latest/#tf.LayersModel.getLayerjs.tensorflow.org/api/latest/#class:layers.Layer。以js为例,model.getLayer(0)
  • 啊,好吧。最后,我决定使用 model.predict()。问题实际上出在我建立的模型上,我没有正确地创建权重,所以每个输出基本上都是 0,所以 softmax 函数正在放大它以使其一个输出具有 1 的概率,而所有其他输出都在0
  • 酷。希望答案有所帮助。
猜你喜欢
  • 2019-05-16
  • 2021-04-26
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2019-04-28
  • 2018-10-09
相关资源
最近更新 更多