Как вы реализуете Softmax с Tensorflow. JS - PullRequest
1 голос
/ 23 марта 2020

Используя Tensorflow. JS, я пытаюсь запустить модель машинного обучения с последним плотным слоем, используя функцию активации softmax. Когда я пытаюсь запустить его, я получаю:

Ошибка при проверке цели: ожидал, что dens_Dense2 будет иметь форму [, 1], но получил массив с формой [3,2].

Если я закомментировав функцию подгонки и запустив ее, я получаю обратно массив 1x2 (как и ожидалось, поскольку у меня есть 2 единицы на последнем слое, и я вхожу только в один тест.

Кроме того, когда я изменяю переменные y к этому массиву: [[1,2,3]], он тренируется (но я не думаю, что это правильно, так как ys не правильной формы последнего слоя (2).

Любой совет или помощь будет оценена, чтобы восполнить мой пробел в знаниях.

var tf = require('@tensorflow/tfjs');

let xs = tf.tensor([
  [1,2],
  [2,1],
  [0,0]
]);

let ys = tf.tensor([
  [1,2],
  [2,1],
  [1,1]
]);

async function createModel () {


  const model = tf.sequential();
  model.add(tf.layers.dense({inputShape: [2], units: 32, activation: "relu"}));
  model.add(tf.layers.dense({units: 2}));
  model.compile({loss: "sparseCategoricalCrossentropy",optimizer:"adam"});

  //await model.fit(xs, ys, {epochs:1000});

  model.predict(tf.tensor([[1,2]])).print();
}

createModel();

1 Ответ

2 голосов
/ 25 марта 2020

Вот активация softmax на последнем слое:

  const model = tf.sequential();
  model.add(tf.layers.dense({inputShape: [2], units: 32, activation: "relu"}));
  model.add(tf.layers.dense({units: 2, activation:'softmax'}));
  model.compile({loss: "sparseCategoricalCrossentropy",optimizer:"adam"});

  model.predict(tf.tensor([[1,2]])).print();

Для ошибки:

Ошибка при проверке цели: ожидается, что dens_Dense2 будет иметь форму [, 1], но получил массив с формой [3,2].

Вы можете рассмотреть ответ, данный здесь

Ваша ошибка связана с функцией потерь sparseCategoricalCrossentropy которые ожидают метки как tensor1d. Если вы измените эту функцию потери на categoricalCrossentropy, она будет работать. Обе потери делают одно и то же, но способ кодирования меток отличается. Но, как и в этом вопросе, метки не кодируются ни для categoricalCrossentropy, ни для sparseCategoricalCrossentropy.

  • При использовании sparseCategoricalCrossentropy метки являются 1d-тензором, где значение является индексом категории
  • При использовании categoricalCrossentropy метки являются 2-мерным тензором, он же горячая кодировка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...