python - 为什么当我使用 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
循环的情况下打印张量的值?
解决方案
1- 是什么from_tensor_slices
?
- 当你使用它时,它会根据你的输入张量
from_tensor_slices
创建一个张量流数据集。
2-使用张量流数据集有什么好处?
- 它使您需要对数据集执行的所有操作都非常简单。即,您可以轻松地制作它们
shuffle
,batch
预处理数据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)
。第一个维度是None
。None
在形状中,表示x
该数据集中的第一个维度(第一个维度是样本数)可以是任何东西,但第二个维度是 2。对于y
.
6-如何在没有for
循环的情况下打印值?
- 实际上,对于性能处理,它就像generators一样。您不能一次打印所有值。您可以逐个访问其元素(逐批)。
推荐阅读
- twitter-bootstrap - 如何更新使用 v-model 和 bootstrap datetimepicker 绑定的现有数据?
- servicestack - PocoDynamo 使用表达式扫描项目计数
- angular - 仅在打开扩展面板时如何在 Angular 中触发事件
- reactjs - React sortable hoc - onClick 如何改变状态
- python - 在 pandas 的汇总中创建多列
- javascript - DataTypes.DECIMAL 可能导致错误:Sequelize 自动迁移命令中的“未知列”
- javascript - JavaScript 似乎做浮点错误(与 C 相比)
- scala - 如何在when中执行窗口功能?
- cluster-computing - 请求高性能集群计算框架
- sql - 如何按值过滤 SQL 列,例如 -1 并将表连接到另一个表