Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TensorflowJS模型不';不能正确预测多类数据_Tensorflow_Machine Learning_Tensorflow.js - Fatal编程技术网

TensorflowJS模型不';不能正确预测多类数据

TensorflowJS模型不';不能正确预测多类数据,tensorflow,machine-learning,tensorflow.js,Tensorflow,Machine Learning,Tensorflow.js,作为一个初学者,我尝试用tensorflowJS构建一个非常简单的多类分类器,它可以预测我的视力方向 步骤1:我在浏览器中创建了数据集来训练我的模型,在那里我将网络摄像头渲染的眼睛图像存储在HTML5画布上。我使用箭头键将图像标记为0=左、1=正常和2=右。为了训练模型,在传递给方法之前,我使用tf.onHot()转换这些标签 // data collection let imageArray = []; let labelArray = []; let collectData = (lab

作为一个初学者,我尝试用tensorflowJS构建一个非常简单的多类分类器,它可以预测我的视力方向

步骤1:我在浏览器中创建了数据集来训练我的模型,在那里我将网络摄像头渲染的眼睛图像存储在HTML5画布上。我使用箭头键将图像标记为0=左、1=正常和2=右。为了训练模型,在传递给方法之前,我使用tf.onHot()转换这些标签

// data collection 
let imageArray = [];
let labelArray = [];

let collectData = (label) => {
    const img = tf.tidy(() => {
        const captureImg = getImage();
        //console.log(captureImg.shape)
        return captureImg;
    })
    imageArray.push(img)
    labelArray.push(label) //--- labels are 0,1,2
}

// label conversion  
let labelSet = tf.oneHot(tf.tensor1d(labelArray, 'int32'), 3);
第2步:我使用了使用tensorflowJS构建的自定义模型,而不是加载任何经过训练的模型

let createModel = () => {
        const model = tf.sequential();
        let config_one = {
            kernelSize: 3,
            filters: 40,
            strides: 1,
            activation: 'relu',
            inputShape: [imageHeight, imageWidth, imageChannels]
        }
        model.add(tf.layers.conv2d(config_one));

        let config_two = {
            poolSize: [2, 2],
            strides: [2, 2],
        }
        model.add(tf.layers.maxPooling2d(config_two));

        model.add(tf.layers.flatten());
        model.add(tf.layers.dropout(0.2));

        // Two output values x and y
        let congfig_output = {
            units: 3,
            activation: 'tanh',
        }
        model.add(tf.layers.dense(congfig_output));

        // Use ADAM optimizer with learning rate of 0.0005 and MSE loss
        let config_compile = {
            optimizer: tf.train.adam(0.00005),
            loss: 'categoricalCrossentropy',
        }
        model.compile(config_compile);

        tf.memory()

        return model;
    }
问题:我现在面临几个问题

  • 当我使用均方作为损失函数,adam学习率为0.000005时,我的模型开始预测,但它只预测眼睛的两种状态正常和左/右,所以要进行多类分类,我将损失函数改为分类交叉熵,但结果仍然相同或有时最差

  • 我尝试了其他超参数组合,但没有成功。我遇到的最糟糕的情况是我的损失函数只反复显示了三个常量值

  • 如果我在编译配置中传递了太多数据或使用了其他类型的优化器,比如sgd或其他任何东西,我的浏览器就会崩溃。当我在google上快速搜索时,我发现我可以使用tf.memory()来检查任何可能导致浏览器崩溃的内存泄漏,但这一行没有在控制台中记录任何内容

  • 我正在调整代码中的各种值和参数,并训练模型,这使得它有时可以工作,部分工作,大部分时间甚至不工作。这一切都是偶然的。最后,我学习了编译方法中用于损失函数的参数和con2d输入层中的激活函数,但其他内容仍然令人困惑,例如-历元数、批量大小、adam中的学习速率等等

  • 我理解或我认为我理解这些-内核大小、过滤器、跨步、输入形状,但仍然不知道如何确定层数、各种超参数等

  • 编辑-这是我根据建议更新代码后得到的结果。我仍然不知道正确的分类。我正在接受至少1000多张图片的训练

    A.我仍然会因为固定的valeus而再次遭受损失

    B.精度也在重复1、0.5和0

    function getImage() {
            return tf.tidy(function () {
                const image = tf.browser.fromPixels($('#eyes')[0]);
                const batchedImage = image.expandDims(0);
                const norm = batchedImage.toFloat().div(tf.scalar(255)).sub(tf.scalar(1));
                return norm;
            });
        }
    
    这里是控制台输出

    示例图像-


    对我来说,最明显的错误是输出层的激活功能,您使用的是
    tanh
    您应该使用
    softmax
    。接下来,您的学习率很低,请尝试将其设置为
    0.001
    ,这是一个很好的默认值

    您也可能不需要退出,因为您还没有得到任何结果来证明模型是过度拟合的。您还可以在此基础上添加更多卷积层,请尝试下面的示例

    model.add(tf.layers.conv2d({
        inputShape: [28, 28, 1],
        kernelSize: 5,
        filters: 8,
        strides: 1,
        activation: 'relu',
    }));
    
    model.add(tf.layers.maxPooling2d({
        poolSize: [2, 2],
        strides: [2, 2],
    }));
    
    model.add(tf.layers.conv2d({
        kernelSize: 5,
        filters: 16,
        strides: 1,
        activation: 'relu',
    }));
    
    model.add(tf.layers.maxPooling2d({
        poolSize: [2, 2],
        strides: [2, 2],
    }));
    
    model.add(tf.layers.flatten());
    
    model.add(tf.layers.dense({
        units: 3,
        activation: 'softmax',
    }));
    
    const LEARNING_RATE = 0.001;
    const optimizer = tf.train.adam(LEARNING_RATE);
    
    model.compile({
        optimizer: optimizer,
        loss: 'categoricalCrossentropy',
        metrics: ['accuracy'],
    });
    

    谢谢你的回复。我试过你的建议,可惜没用。我已经用控制台输出更新了我的问题。请检查。好的。在将图像传递到模型之前,您是否已将图像从值
    0-255
    标准化为
    0-1
    ?是的,我已标准化。使用update getImage code()检查问题是否可以包含每个类的图像样本?完成。我为三个标签添加了示例图像。