tf.data.Dataset数据集的制作及使用的多输入问题

tf.data.Dataset数据集的制作及使用

在tf.keras中,我们可以将numpy多维数组数据集整个放入训练接口进行训练,例如model.fit(train_x,train_y,…)。但如果数据集过大,是很难一次放入存储空间的,例如几十G以上的数据。对于大型数据集的高效处理,tf为我们提供了一个高效数据集处理类型tf.data.Dataset。

例如,我们常用from_tensor_slices把numpy多维数组数据集train_x,train_y打包为tf.data.Dataset,例如:

tf.data.Dataset.from_tensor_slices((train_x,train_y)) 

from_tensor_slices实际上是将其中的多个tensors沿其第一个维度切片,返回一个含有N个样本的数据集(其中每个tensor的第一个维度要一样,且设为N)。上述的用法中,例如MNIST数据集中(train_x,train_y)实际上是两个第一维度为60000维的tensors组成了一个tuple。而对组成tuple的tensors的切片结果为tuple组成的列表,例如上述结果为[(x1,y1),(x2,y2),…,(xn,yn)]。

如果我们想做出有两个输入的网络,需要形状为[((x11,x12),y1),((x21,x22),y2)…,((xn1,xn2),yn)]这样的数据该怎么办?我们知道用zip函数可以打包元组,tf.data.Dataset也提供了类似的方法tf.data.Dataset.zip。多输入数据集也就可以通过分别通过tf.data.Dataset.from_tensor_slices 建立dataset_x1_x2和dataset_y,再将他们用tf.data.Dataset.zip打包即可得到。

但是如果只是先用slice将X和Y进行切片,再直接zip的话,即

 x_train = tf.data.Dataset.from_tensor_slices((x_train_l,x_train_r))
    y_train = tf.data.Dataset.from_tensor_slices(y_train)
    train_datasets = tf.data.Dataset.zip((x_train,y_train))

会报这样的错:
ValueError: Input 0 of layer seq1 is incompatible with the layer: expected axis -1 of input shape to have value 196 but received input with shape (196, 1)

这是因为tf.data.Dataset.zip之后没有用.batch()做成BatchDataset,所以迭代的结构不对,只是
train_datasets=tf.data.Dataset.zip(xxx)
此时结构为:
ZipDataset shapes: (((196,), (196,)), ()), types: ((tf.float32, tf.float32), tf.uint8)

此时ZipDataset没有batch信息,所以不知道怎么迭代取batch,也就没有batch这个维度。
这个迭代结构和keras model的输入是不一样的。看看结构图,input1,2的结构是(None,196),所以输入不匹配。

要输入匹配,必须加上batch维度,最简单就是调用dataset的batch()方法构建成BatchDataset
train_datasets=tf.data.Dataset.zip(xxx).batch(64)

BatchDataset shapes: (((None, 196), (None, 196)), (None,)), types: ((tf.float32, tf.float32), tf.uint8)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值