tfds.load是一种方便的方法,它是构建和加载tf.data.Dataset的最简单方法。
设置download = True将下载并准备数据。 只要构bulider name和data_dir保持不变,使用download = True多次调用load是安全的。 已经下载好的数据将被重用。
mnist_train = tfds.load(name="mnist", split=tfds.Split.TRAIN)
assert isinstance(mnist_train, tf.data.Dataset)
mnist_train
如果想获取dataset中的“image”和“label”直接使用
dataset=tfds.load(name='cifar10',split=tfds.Split.TRAIN)
image=datasetp['image']
是不可以的吗,会报错:
TypeError:'DatasetV1Adapter' object is not subscriptable
如果打印dataset信息:
print(dataset)
<DatasetV1Adapter shapes:{image:(32,32,3),label:(),types:{image:tf.uint8,label:tf,int64}}>
ds_train, ds_test = tfds.load(name="mnist", split=["train", "test"])
# Build your input pipeline
ds_train = ds_train.shuffle(1000).batch(128).prefetch(10)
for features in ds_train.take(1):
image, label = features["image"], features["label"]
为了方便那些在程序中需要简单NumPy数组的用户,可以使用 tfds.as_numpy 返回一个生成NumPy数组记录的生成器tf.data.Dataset。这允许您使用tf.data接口构建高性能输入管道,同时也可以使用您希望的模型组件。
train_ds = tfds.load("mnist", split=tfds.Split.TRAIN)
train_ds = train_ds.shuffle(1024).batch(128).repeat(5).prefetch(10)
for example in tfds.as_numpy(train_ds):
numpy_images, numpy_labels = example["image"], example["label"]
您还可以tfds.as_numpy结合使用batch_size=-1从返回的tf.Tensor对象中获取NumPy数组中的完整数据集:
train_ds = tfds.load("mnist", split=tfds.Split.TRAIN, batch_size=-1)
numpy_ds = tfds.as_numpy(train_ds)
numpy_images, numpy_labels = numpy_ds["image"], numpy_ds["label"]
请注意,库仍然需要tensorflow作为内部依赖项。
画出cifar10 的图像
dataset=tfds.load(name='cifar10',split=tfds.Split.TRAIN)
for example in tfds.as_numpy(train_ds):
numpy_images, numpy_labels = example["image"], example["label"]
plt.imshow(image.astype(np.uint8))
plt.show()
参考: https://github.com/tensorflow/datasets
参考: https://www.oipapio.com/question-4880172
dataset.map() 的运行机制需要看源码再去理解
def change(record):
img=record['image']
label=record['label']
img=tf.cast(img,tf.float32)
img=tf,random(img,[24,24,3])
...#各种图片处理..
return dict(image=img, label=label)
dataset=tfds.load(name='cifar10',split=tfds.Split.TRAIN)
print(dataset)
dataset=dataset.map(change)
print(dataset)
打印结果:
<DatasetV1Adapter shapes:{image:(32,32,3),label:(),types:{image:tf.uint8,label:tf,int64}}>
<DatasetV1Adapter shapes:{image:(24,24,3),label:(),types:{image:tf.tf.float32,label:tf,int64}}>
为什么change函数里面可以直接通过record调用record [‘image’]和recor [‘label’] ???