В следующем коде:
@tf.function
def get_x_y(dataset,count=1):
X = tf.TensorArray(tf.float32,count)
Y = tf.TensorArray(tf.float32,count)
idx = tf.Variable(0,dtype=tf.int32)
for batch in dataset.take(count):
max_x,max_y,max_z = batch.shape
x = tf.slice(batch,[0,0,0],[-1,max_y-1,-1])
y = tf.slice(batch,[0,1,0],[-1,-1,-1 ])
y = tf.argmax(y,-1)
y = tf.cast(y,tf.float32)
X = X.write(idx.numpy(),x)
Y = Y.write(idx.numpy(),y)
idx.assign_add(1)
return X.stack(),Y.stack()
Вывод при использовании декоратора wihtout tf.function
соответствует ожидаемому, однако с декоратором tf.function
возникает следующая ошибка:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-56-2306b6173e70> in <module>()
----> 1 print(get_x_y(dataset))nt
8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
966 except Exception as e: # pylint:disable=broad-except
967 if hasattr(e, "ag_error_metadata"):
--> 968 raise e.ag_error_metadata.to_exception(e)
969 else:
970 raise
TypeError: in user code:
<ipython-input-55-4a32428fa07d>:8 get_x_y *
x = tf.slice(batch,[0,0,0],[-1,max_y-1,-1])
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
Ожидаемый результат - это кортеж из 2 (тензорA, тензорB) фигур (count,batch_size,batch_seq_len,vocab_size)
и (count,batch_size,batch_seq_len)
соответственно, с
count = argument provided to the function
batch_size = 128
batch_seq_len = ?, max_len(seq_i) for all seq in batch
vocab_size = 78
Например, ожидаемый результат, когда функция не украшена tf.function
:
(<tf.Tensor: shape=(1, 128, 262, 78), dtype=float32, numpy=
array([[[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]],
[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]],
[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]],
...,
[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]],
[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]],
[[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]]]], dtype=float32)>, <tf.Tensor: shape=(1, 128, 262), dtype=float32, numpy=
array([[[ 7., 53., 69., ..., 0., 0., 0.],
[15., 21., 5., ..., 0., 0., 0.],
[15., 77., 5., ..., 0., 0., 0.],
...,
[15., 77., 5., ..., 0., 0., 0.],
[15., 77., 5., ..., 0., 0., 0.],
[15., 77., 5., ..., 0., 0., 0.]]], dtype=float32)>)
Кто-нибудь знает, почему? Я подозреваю, что это потому, что набор данных имеет форму <MapDataset shapes: (128, None, 78), types: tf.float32>
, однако я не понимаю, почему max_y
равно None
, потому что форма пакета известна до цикла?