1)两者之间的主要区别是from_tensor_slices
中的嵌套元素在第0级必须具有相同的维数:
# exception: ValueError: Dimensions 10 and 9 are not compatible
dataset1 = tf.data.Dataset.from_tensor_slices(
(tf.random_uniform([10, 4]), tf.random_uniform([9])))
# OK, first dimension is same
dataset2 = tf.data.Dataset.from_tensors(
(tf.random_uniform([10, 4]), tf.random_uniform([10])))
2)第二个区别( 这里解释)是tf.Dataset的输入是列表时。例如:
dataset1 = tf.data.Dataset.from_tensor_slices(
[tf.random_uniform([2, 3]), tf.random_uniform([2, 3])])
dataset2 = tf.data.Dataset.from_tensors(
[tf.random_uniform([2, 3]), tf.random_uniform([2, 3])])
print(dataset1) # shapes: (2, 3)
print(dataset2) # shapes: (2, 2, 3)
在上面, from_tensors
创建3D张量,而from_tensor_slices
合并输入张量。如果您具有不同图像通道的不同来源,并希望将它们串联为一个RGB图像张量,则此方法很方便。
3)在前面的答案中提到的from_tensors
将输入张量转换为一个大张量:
import tensorflow as tf
tf.enable_eager_execution()
dataset1 = tf.data.Dataset.from_tensor_slices(
(tf.random_uniform([4, 2]), tf.random_uniform([4])))
dataset2 = tf.data.Dataset.from_tensors(
(tf.random_uniform([4, 2]), tf.random_uniform([4])))
for i, item in enumerate(dataset1):
print('element: ' + str(i + 1), item[0], item[1])
print(30*'-')
for i, item in enumerate(dataset2):
print('element: ' + str(i + 1), item[0], item[1])
输出:
element: 1 tf.Tensor(... shapes: ((2,), ()))
element: 2 tf.Tensor(... shapes: ((2,), ()))
element: 3 tf.Tensor(... shapes: ((2,), ()))
element: 4 tf.Tensor(... shapes: ((2,), ()))
-------------------------
element: 1 tf.Tensor(... shapes: ((4, 2), (4,)))
0
我有一个表示为NumPy形状的矩阵的数据集
(num_features, num_examples)
,我希望将其转换为TensorFlow类型tf.Dataset
。我正在努力理解这两种方法之间的区别:
Dataset.from_tensors
和Dataset.from_tensor_slices
。什么是正确的,为什么?TensorFlow文档( link )表示,这两种方法都接受张量的嵌套结构,尽管在使用
from_tensor_slices
,张量在第0维上应具有相同的大小。