模型没有学习

Model is not learning

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

正在从 canvas

抓取图像
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
}

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

模型用对了吗?

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

在分类问题中,有不同的图像分类方法,每种方法各有利弊。 FCNN 没有达到很好的精度,CNN 做到了。但是训练 CNN 模型的计算量可能很大。这就是迁移学习发挥作用的地方。

pacman 示例使用迁移学习。因此,如果您想复制该示例,请考虑遵循 tfjs 示例的 github 代码。这里的模型只使用了一个卷积层。 CNN networks and transfer-learning models.

的写法tensorflow官网上有很好的教程

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

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


调整模型

即使是一个好的模型也需要对其参数进行调整——轮数、批次大小、学习率、优化器、损失函数...更改这些参数并观察它们如何影响准确性是获得良好准确性的一个步骤.

需要指出的是,作为 model.compile

的参数传递的对象中没有 learning rate 这样的东西