Скалярный выход Tensorflow JS - PullRequest
0 голосов
/ 21 февраля 2019

Используя последовательную модель, как взять массив двумерных входных данных (трехмерный вход) и сделать так, чтобы модель выполняла прогнозирование для каждого 2-мерного входного сигнала, чтобы получить скаляр?Форма ввода (доски): [153, 8, 8].Форма выхода (результаты): [153].

Модель:

const model = tf.sequential();
model.add(tf.layers.dense({units: 8, inputShape: [8]}));
model.add(tf.layers.dense({units:1, activation: 'sigmoid'}));

// Prepare the model for training: Specify the loss and the optimizer.
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

const xs = tf.tensor(boards);
const ys = tf.tensor(results);


model.fit(xs, ys, {batchSize: 8, epoch: 10000}).then(() => {
});
model.predict(tf.tensor(brokenFen)).print();

console.log(JSON.stringify(model.outputs[0].shape));

Вывод:

Tensor
    [[1],
     [1],
     [1],
     [1],
     [1],
     [1],
     [1],
     [1]]
[null,1]

Желаемый вывод:

Tensor
[1]

Если у вас есть какие-либо дополнительные вопросы, lmk.

1 Ответ

0 голосов
/ 24 февраля 2019

Немного теории ...

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

| feature 1 | feature 2 | ... | feature n | Label |
|----------:|----------:|----:|-----------|------:|
|    x11    |    x12    | ... |    x1n    |   y1  |
|    x21    |    x22    | ... |    x2n    |   y2  |
|    ...    |    ...    |  .. |    ...    |  ...  |

На рисунке выше данные имеют n особенностей, соответствующих n измерениям, а метка имеет одно измерение - дляради простоты и подойдет вопрос.Запись построенной модели (первый слой) должна соответствовать размеру объектов, а вывод (последний слой) должен соответствовать размеру меток.При обучении и прогнозировании мы даем модели несколько разных образцов n1, n2.Количество образцов дает соответствует размеру партии.Модель вернет то же количество элементов формы, что и размер метки.


Модель имеет следующий inputShape: [8], что указывает на то, что у нас есть 8 функций.Последний слой имеет units:1, предполагая, что метка имеет размер 1. Что происходит, когда мы прогнозируем значения?

const model = tf.sequential();

// first layer
model.add(tf.layers.dense({units: 8, inputShape: [8], activation: 'sigmoid' }));
// second layer
model.add(tf.layers.dense({units: 1}));

model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
console.log(model.predict(tf.ones([3, 8])).shape) // [3, 1] 3 elements predicted
console.log(model.predict(tf.ones([1, 8])).shape) // [1, 1] single element predicted
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.15.1"> </script>
  </head>

  <body>
  </body>
</html>

Как и предполагалось, метка предсказывается из трехмерных значений.В этом случае inputShape будет 3 вместо 8. Если tf.tensor(brokenFen) имеет форму [b, ...inputShape], будут b значения результатов.Если вы хотите иметь одно значение, рассмотрите возможность установки b на 1, увеличив размер tf.expandims или используя tf.reshape одного элемента формы inputShape - в данном случае 3.

...