Randy Ruan
Randy Ruan

Reputation: 81

zip like function in Tensorflow? Tensorflow tensor operation

My question is about the tensor operation in Tensorflow. Let's say:

import tensorflow as tf
import numpy as np

a = tf.Variable(np.random.random([10, 3, 3]))
b = tf.Variable(np.random.random([10, 3, 3]))

def some_function(m,n):
    # just as an example
    return tf.add(m, n)

This works in Tensorflow but it requires to know the dimension in advanced. However, it is very likely that the first dimension of the Tensor is None.

c = []
for i in range(10):
    c.append(some_function(a[i], b[i]))
c = tf.stack(c)

So I wonder if there is a zip-like function in Tensorflow? Then we can do:

# TypeError: zip argument #1 must support iteration
c = []
for i, j in zip(a,b):
    c.append(some_function(i,j))
c = tf.stack(c)

Maybe we can use some function like tf.map_fn or tf.scan? But I am not sure. Really thank you, guys.

Upvotes: 8

Views: 15341

Answers (3)

For those of you using JavsScript, this is @bachr's answer in tensorflow.js (node):

const a =  tf.tensor([1, 3, 5, 7])
const b = tf.tensor([2, 4, 6, 8])
const zip = tf.transpose(tf.stack([a, b]))
zip.print()
// Tensor
//    [[1, 2],
//     [3, 4],
//     [5, 6],
//     [7, 8]]

Upvotes: 0

bachr
bachr

Reputation: 6006

You can use tf.transpose like this

>>> a = tf.constant([1, 2, 3])
>>> b = tf.constant([4, 5, 6])
>>> tf.transpose([a, b])
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[1, 4],
       [2, 5],
       [3, 6]], dtype=int32)>

Upvotes: 7

Akshay Agrawal
Akshay Agrawal

Reputation: 922

Tensor objects are not iterable, which explains why your third code sample fails. So, to answer your question, there is no zip-like function in TensorFlow.

You can indeed use tf.map_fn to apply a function to a sequence of tensors. The problem you pose in your example code can be solved in the following fashion:

def some_function(tensor):
  return tf.reduce_sum(tensor)

c = tf.stack([a, b], axis=1)
d = tf.map_fn(some_function, c, dtype=tf.float32)

yields a Tensor d whose value is [20., 6., 6.].

Upvotes: 11

Related Questions