Почему model.fit требует двумерных тензоров? И почему model.predict не принимает скалярные тензоры? - PullRequest
1 голос
/ 07 ноября 2019

Я изучал TensorFlow.js, когда заметил, что model.fit должен принимать два аргумента: ввод и вывод и некоторые конфигурации. Но входные данные были двумерными тензорами, которые были записаны следующим образом:

let input = tf.tensor2d([1, 2, 3, 4, 5], [5, 1])

Это замечательно похоже на одномерный тензор, записанный следующим образом:

let input = tf.tensor1d([1, 2, 3, 4, 5])

И так как два-мерный тензор был на самом деле 5 на 1, я решил заменить его на одномерный тензор. Однако это полностью остановило работу программы. Так есть ли какой-нибудь код, который говорит, что входные данные должны быть двумерными? Если так, то почему?

По теме многомерных тензоров я также заметил, что model.predict не может принимать нульмерный тензор или скаляр. См. Ниже

Working Code:

model.predict(tf.tensor1d([6]))

Not Working Code:

model.predict(tf.scalar(6))

Если кто-нибудь сможет прояснить причину, стоящую за этими пределами, это будет с благодарностью.

1 Ответ

0 голосов
/ 08 ноября 2019

2D-тензор не является 1D-тензором. tf.tensor2d([1, 2, 3, 4, 5], [5, 1]) не tf.tensor1d([1, 2, 3, 4, 5]). Одно можно преобразовать в другое, но это не значит, что они равны.

model.fit принимает в качестве параметра тензор или ранг 2 или более. Этот тензор можно рассматривать как массив элементов, форма которых задается на входе модели. Модель inputShape является наименьшим из ранга 1, что делает параметр model.fit равным как минимум 2 (1 + 1, это всегда ранг inputShape + 1).

Так как model.fit и model.predict принимаетв качестве параметра тензор того же ранга, параметр model.predict - это тензор ранга 2 или более по той же причине, изложенной выше.

Однако, model.predict(tf.tensor1d([6])) работает. Это происходит потому, что внутренне tenorflow.js преобразует 1D-тензор в 2D-тензор. Начальный тензор формы [6] будет преобразован в тензор формы [6, 1].

model.predict(tf.tensor1d([6])) 
// will work because it is a 1D tensor 
// and only in the case where the model first layer inputShape is [1]

model.predict(tf.tensor2d([[6]])) 
// will also work
// One rank higher than the inputShape and of shape [1, ...InputShape]

model.predict(tf.scalar(6)) // will not work

const model = tf.sequential(
    {layers: [tf.layers.dense({units: 1, inputShape: [1]})]});
model.predict(tf.ones([3])).print(); // works
model.predict(tf.ones([3, 1])).print(); // works
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
  </head>

  <body>
  </body>
</html>

const model = tf.sequential(
    {layers: [tf.layers.dense({units: 1, inputShape: [2]})]});
model.predict(tf.ones([2, 2])).print(); // works
model.predict(tf.ones([2])).print(); // will not work
   // because [2] is converted to [2, 1]
   // whereas the model is expecting an input of shape [b, 2] with b an integer
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
  </head>

  <body>
  </body>
</html>
...