Я играю с TensorflowJS и меня удивляют (плохие) результаты, которые я получил. Вот проблема, над которой я работаю: у вас есть 2D-квадрат от верхнего левого (0,0) до нижнего правого (1,1). Каждый угол имеет цвет в RGB следующим образом:

верхний левый: черный

верхний правый: красный

внизу справа: зеленый

внизу слева: синий

Я хочу вывести цвет на точку, которая находится в квадрате.

Я установил простую модель Tensorflow. После простого тренинга я проверил его в правом нижнем углу … и вместо того, чтобы приблизиться к чему-то близкому к зеленому, я получил плохие результаты. Не могли бы вы сказать мне, где я делаю что-то не так? Благодарность

async function test() { tf.setBackend('cpu'); const model = tf.sequential(); model.add(tf.layers.dense({units: 3, inputShape: [2] })); model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); const xs = tf.tensor([0,0, 1,0, 1,1, 0,1 ], [4, 2]); const ys = tf.tensor([ [ 0, 0, 0 ], // black [ 1, 0, 0 ], // red [ 0, 1, 0 ], // green [ 0, 0, 1 ], // blue ], [4, 3]); await model.fit(xs, ys, {epochs: 5000}); const input = tf.tensor([1,1], [1, 2]); console.log(model.predict(input).dataSync()); } 

Мои результаты:

 Float32Array(3) [0.25062745809555054, 0.7481716275215149, 0.2501324415206909] 

Модель использует линейную активацию, которая может выводить правильные результаты, только если объекты и метки линейно зависят ( y = ax b ). Необходимо использовать другую активацию.

Зачастую модель нуждается в точной настройке, а это означает, что необходимо использовать другой набор параметров, пока не будет найдена модель с наилучшей точностью — это называется тонкой настройкой. Ниже приведена модель с набором параметров, которая имеет низкую точность. Следует помнить, что это не «набор» параметров. Это набор параметров « а ». Посмотрите этот ответ о том, как точно настроить модель.

 (async() ={amp}gt; { const model = tf.sequential(); model.add(tf.layers.dense({units: 18, inputShape: [2]})); model.add(tf.layers.dense({units: 14, activation: 'relu6'})); model.add(tf.layers.dense({units: 3, activation: 'relu6'})); const xs = tf.tensor([0,0, 1,0, 1,1, 0,1 ], [4, 2]); const ys = tf.tensor([ [ 0, 0, 0 ], // black [ 1, 0, 0 ], // red [ 0, 1, 0 ], // green [ 0, 0, 1 ], // blue ], [4, 3]); const optimizer = tf.train.sgd(0.000001) model.compile({loss: 'meanSquaredError', optimizer: 'adam'}); await model.fit(xs, ys, { epochs: 500, callbacks: {onEpochEnd: (epoch, logs) ={amp}gt; console.log(logs.loss)} }); const input = tf.tensor([1,1], [1, 2]); console.log(model.predict(input).dataSync()); })() 
 {amp}lt;script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"{amp}gt; {amp}lt;/script{amp}gt; 

Даже если приведенная выше модель имеет низкую точность, что приводит к лучшему прогнозированию, решаемая здесь проблема, по-видимому, не является проблемой регрессии. Если цель состоит в том, чтобы просто выбрать цвет из трех, у нас есть проблема классификации. Разница будет заключаться в том, что на последнем уровне будет иметься слой softmax activation а функция потерь будет представлять собой binaryCrossentropy (соответственно categoricalCrossentropy binaryCrossentropy ) для 2 (соответственно более 2) единиц на последнем уровне.

 (async() ={amp}gt; { const model = tf.sequential(); model.add(tf.layers.dense({units: 18, inputShape: [2]})); model.add(tf.layers.dense({units: 14, activation: 'relu6'})); model.add(tf.layers.dense({units: 4, activation: 'softmax'})); const xs = tf.tensor([0,0, 1,0, 1,1, 0,1 ], [4, 2]); const ys = tf.oneHot([0, 1, 2, 3], 4) // 0 for black // 1 for red // 2 for green // 3 for blue ys.print() model.compile({loss: 'categoricalCrossentropy', optimizer: 'sgd'}); await model.fit(xs, ys, { epochs: 100, callbacks: {onEpochEnd: (epoch, logs) ={amp}gt; console.log(logs.loss)} }); const input = tf.tensor([1,1], [1, 2]); const output = model.predict(input) output.print() output.argMax(1).print(); // result will be 2 for green })() 
 {amp}lt;script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"{amp}gt; {amp}lt;/script{amp}gt;