【问题标题】:Model is not learning模型不学习
【发布时间】:2019-09-20 10:44:08
【问题描述】:

我正在尝试在来自我的网络摄像头的图像上训练一个张量流 js 模型。基本上我正在尝试重新创建 pac-man 张量流游戏。该模型没有收敛,并且在训练后几乎没用。我有一种感觉,我是如何准备数据的。

从画布中抓取图像

function takePhoto(label) {
  let canv = document.getElementById("canv")
  let cont = canv.getContext("2d")
  cont.drawImage(video, 0, 0, width, height)

  let data = tf.browser.fromPixels(canv, 3)
  data.toFloat().div(tf.scalar(127)).sub(tf.scalar(1))
  return data
}

function addExample(label){
      let data = takePhoto()

      addData(train_data => train_data.concat(data))
      addLabel(train_labels => train_labels.concat(labels[label]))
    }

训练功能

export async function train_model(image,label){
    let d = tf.stack(image)

    let l = tf.oneHot(tf.tensor1d(label).toInt(),4)

    let data = await model.fit(d,l,{epochs:10,batchSize:label[0].length,callbacks:{
        onBatchEnd: async  (batch, logs) =>{ 
            console.log(logs.loss.toFixed(5))
        }
    }})
    return data
}

型号

export function buildModel(){
    model = tf.sequential({layers:[ 
        tf.layers.conv2d({inputShape:[width,height,3],
                            kernelSize:3,
                            filters:5, 
                            activation :"relu"}),
        tf.layers.flatten(),
        tf.layers.dense({units:128, activation:"relu",useBias:true}),
        tf.layers.dense({units:32, activation:"relu"}),
        tf.layers.dense({units:4, activation:"softmax"})
    ]})
    model.compile({metrics:["accuracy"], loss:"categoricalCrossentropy", optimizer:"adam",learningRate:.00001})
    console.log(model.summary())
}

预测

export async function predict(img){

    let pred = await tf.tidy(() => {

        img = img.reshape([1,width,height, 3]);

        const output = model.predict(img);

        let predictions = Array.from(output.dataSync());
        return predictions
    })
    return pred
}

回调会打印损失,但它们不会收敛到任何东西,并且预测会偏离(随机)

【问题讨论】:

    标签: tensorflow image-processing data-processing tensorflow.js


    【解决方案1】:

    使用的模型是否正确?

    需要问的第一个问题是使用的模型是否正确。问题的模型使用卷积层和密集层的混合。但是该模型并没有真正遵循 CNN 的结构,而卷积层后面总是跟着池化层。是模型不学习的原因吗?没必要……

    在分类问题中,有不同的图像分类方法,每种方法各有优缺点。 FCNN 没有达到很好的准确度,而 CNN 可以。但是训练 CNN 模型的计算成本可能很高。这就是迁移学习发挥作用的地方。

    pacman 示例使用迁移学习。因此,如果您想复制该示例,请考虑遵循 tfjs 示例的 github 代码。这里的模型只使用一个卷积层。关于如何写CNN networkstransfer-learning models,tensorflow官网有很好的教程。


    您使用了多少数据来训练您的模型?

    深度学习模型通常需要大量数据。因此,除非该模型已经看到很多被标记的图像,否则它的准确率非常低也就不足为奇了。需要多少数据主要是艺术和设计问题,而不是科学问题。但一般来说,数据越多,预测的模型越好。


    调整模型

    即使是一个好的模型也需要调整其参数 - 时期数、批量大小、学习率、优化器、损失函数...更改这些参数并观察它们如何解释准确性是获得良好准确性的一个步骤。

    需要指出的是,作为model.compile的参数传递的对象中没有learning rate这样的东西

    【讨论】:

    • 谢谢,我改变了模型,得到了一些稍微好一点的结果。我试图避免使用他们的模型并尝试创建自己的模型。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多