我制作了如下的简单数据集。
x_data = [[0, 0],
[0, 1],
[1, 0],
[1, 1]]
y_data = [[0],
[1],
[1],
[0]]
我使用from_tensor_slices
对其进行切片:(我不知道张量切片函数的确切作用…)
dataset = tf.data.Dataset.from_tensor_slices((x_data, y_data)).batch(len(x_data))
当我使用print
函数打印数据集时,它显示如下:
<BatchDataset shapes: ((None, 2), (None, 1)), types: (tf.int32, tf.int32)>
当我使用for
循环打印时,它显示如下:
tf.Tensor(
[[0 0]
[0 1]
[1 0]
[1 1]], shape=(4, 2), dtype=int32)
tf.Tensor(
[[0]
[1]
[1]
[0]], shape=(4, 1), dtype=int32)
问题是:
在我的想法中,张量形状应该是(4,2)
和(4,1)
,因为矩阵的行是4。
为什么当我使用print
时,它显示(None,2)
和(None,1)
?
以及如何在没有for
循环的情况下打印张量的值?
1-什么是from_tensor_slices
?
- 使用
from_tensor_slices
时,它会根据输入张量创建张量流数据集
2-使用tensorflow数据集有什么好处?
- 它使您使用数据集所需的一切都变得非常简单。也就是说,你可以很容易地将它们制作成
shuffle
、batch
,通过map
对数据进行预处理,甚至可以像model.fit(dataset)
等轻松地输入到你的模型中
3-为什么print
函数显示BatchDataset
而不是值?
dataset
变量是BatchDataset
类中的一个对象(因为您像dataset=from_tensor_slices((x,y)).batch(bs)
一样定义它)。它不是一个python列表,渴望张量,numpy数组和。。。通过CCD_ 21函数查看其值
4-如何查看存储在tf数据集中的值?
- 您可以使用此类中的
take()
函数来访问其值:
one_batch = dataset.take(1) # it takes 1 batch of data from dataset
# each batch is a tuple (like what you passed in from_tensor_slices)
# you passed x and y. So, it returns a batch of x and y
for x,y in one_batch:
print(x.shape)
print(y.shape)
#(4,2) (batch_size, num_features)
#(4,1) (batch_size, labels_dim)
5-BatchDataset
对象变量中的(None,2)
和(None,1)
是什么?
- 是
x=(None,2)
和y=(None,1)
的大小。第一个维度是None
。形状中的None
意味着该数据集中x
的第一个维度(第一个维度是样本数)可以是任何东西,但第二个维度是2。对于CCD_ 31也是同样的规则
6-如何在没有for
循环的情况下打印值?
- 实际上,对于性能处理,它的作用就像生成器。不能一次打印所有值。可以逐个(逐批)访问其元素