首页 > 解决方案 > 为什么当我使用 tf.print 时张量形状不同?

问题描述

我制作了如下所示的简单数据集。

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循环的情况下打印张量的值?

标签: pythontensorflow

解决方案


1- 是什么from_tensor_slices

  • 当你使用它时,它会根据你的输入张量from_tensor_slices创建一个张量流数据集。

2-使用张量流数据集有什么好处?

  • 它使您需要对数据集执行的所有操作都非常简单。即,您可以轻松地制作它们shufflebatch预处理数据map,甚至可以轻松地输入您的模型等model.fit(dataset)

3- 为什么print函数BatchDataset不显示值?

  • dataset变量是BatchDataset类中的一个对象(因为您将其定义为dataset=from_tensor_slices((x,y)).batch(bs))。它不是一个 python 列表、渴望张量、numpy 数组和......按print函数查看其值。

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-对象变量中的(None,2)(None,1)是什么?BatchDataset

  • 它是 和 的x=(None,2)大小y=(None,1)。第一个维度是NoneNone在形状中,表示x该数据集中的第一个维度(第一个维度是样本数)可以是任何东西,但第二个维度是 2。对于y.

6-如何在没有for循环的情况下打印值?

  • 实际上,对于性能处理,它就像generators一样。您不能一次打印所有值。您可以逐个访问其元素(逐批)。

推荐阅读