Преобразовать значения тензора в TensorFlow в обычный массив Javascript - PullRequest
0 голосов
/ 07 февраля 2019

Я использовал функцию externalProduct в структуре TensorFlow.js на двух одномерных массивах (a, b), но мне трудно получить значения результирующего тензора в обычном формате javascript.

Даже после использования .dataSync и Array.from () я все еще не могу получить ожидаемый формат вывода.Результирующий внешний продукт между двумя одномерными массивами должен дать один двумерный массив, но вместо этого я получаю одномерный массив.

const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3, 4]);
const tensor = tf.outerProduct(b, a);
const values = tensor.dataSync();
const array1 = Array.from(values);

console.log (array1);

Ожидаемый результат - массив1= [[3, 6], [4, 8]], но я получаю array1 = [3, 6, 4, 8]

Ответы [ 4 ]

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

Начиная с версии tfjs 0.15.1, вы можете использовать await tensor.array() для получения вложенного массива.

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

вы можете взять свой values и сделать что-то вроде

const values = [3, 6, 4, 8];

let array1 = []

for (var i = 0; i < values.length; i += 2) {
  array1.push([values[i], values[i + 1]])
}

console.log(array1)
0 голосов
/ 08 февраля 2019

const a_const = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const b_const = [10, 11, 12, 13]
const am = tf.tensor1d(a_const);
const bm = tf.tensor1d(b_const);

const tensor = tf.outerProduct(bm, am);
console.log(tensor.print())

И используя функцию преобразования многомерного массива @edkeveked, таким образом представлен грубый метод.

Ожидаемый результат для этого случая

//Result from TensorFlow.js
Tensor
    [[10, 20, 30, 40, 50, 60, 70, 80 , 90 ],
     [11, 22, 33, 44, 55, 66, 77, 88 , 99 ],
     [12, 24, 36, 48, 60, 72, 84, 96 , 108],
     [13, 26, 39, 52, 65, 78, 91, 104, 117]]

//Results using the crude approach
ar_first [ [ 10, 20, 30, 40, 50, 60, 70, 80, 90 ],
  [ 11, 22, 33, 44, 55, 66, 77, 88, 99 ],
  [ 12, 24, 36, 48, 60, 72, 84, 96, 108 ],
  [ 13, 26, 39, 52, 65, 78, 91, 104, 117 ] ]
0 голосов
/ 08 февраля 2019

Версия <15 </strong>

Результатом tf.data или tf.dataSync всегда является плоский массив.Но можно использовать форму тензора, чтобы получить многомерный массив, используя map и Reduce .

const x = tf.tensor3d([1, 2 , 3, 4 , 5, 6, 7, 8], [2, 4, 1]);

x.print()

// flatten array
let arr = x.dataSync()

//convert to multiple dimensional array
shape = x.shape
shape.reverse().map(a => {
  arr = arr.reduce((b, c) => {
  latest = b[b.length - 1]
  latest.length < a ? latest.push(c) : b.push([c])
  return b
}, [[]])
console.log(arr)
})
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.14.1"> </script>
  </head>

  <body>
  </body>
</html>

Начиная с версии 0.15

Можно использовать tenor.array () или tensor.arraySync ()

...