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>