В модели отсутствует нелинейность, поскольку нет функций активации.Учитывая ввод rgb, модель должна предсказать наиболее вероятный цвет в 8 возможных значениях.Это проблема классификации.Модель, как определено в вопросе, выполняет регрессию, то есть она пытается предсказать числовое значение с учетом входных данных.
Для задачи классификации последний уровень должен предсказать вероятности.softmax
Функция активации в основном используется для последнего слоя в этом случае.Функция потерь должна быть categoricalCrossentropy
или binaryCrossEntropy
(если было предсказано только два цвета).
Рассмотрим следующую модель, предсказывающую 3 класса цветов: красный, зеленый и синий
const model = tf.sequential();
model.add(tf.layers.dense({units: 10, inputShape: [3], activation: 'sigmoid' }));
model.add(tf.layers.dense({units: 10, activation: 'sigmoid' }));
model.add(tf.layers.dense({units: 3, activation: 'softmax' }));
model.compile({ loss: 'categoricalCrossentropy', optimizer: 'adam' });
const xs = tf.tensor([
[255, 23, 34],
[255, 23, 43],
[12, 255, 56],
[13, 255, 56],
[12, 23, 255],
[12, 56, 255]
]);
// Labels
const label = ['red', 'red', 'green', 'green', 'blue', 'blue']
const setLabel = Array.from(new Set(label))
const ys = tf.oneHot(tf.tensor1d(label.map((a) => setLabel.findIndex(e => e === a)), 'int32'), 3)
// Train the model using the data.
model.fit(xs, ys, {epochs: 100}).then((loss) => {
const t = model.predict(xs);
pred = t.argMax(1).dataSync(); // get the class of highest probability
labelsPred = Array.from(pred).map(e => setLabel[e])
console.log(labelsPred)
}).catch((e) => {
console.log(e.message);
})
<html>
<head>
<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.3/dist/tf.min.js"> </script>
</head>
<body>
</body>
</html>