通常这个错误会在使用tensorflow的Dataset类时出现。这时候需要使用.map()
或.batch()
方法对Dataset对象做一些处理,使其支持下标操作。举例来说,如果你在使用Dataset对象时出现了这个错误:
import tensorflow as tf
x_train = tf.data.Dataset.from_tensor_slices(x_train).batch(32)
y_train = tf.data.Dataset.from_tensor_slices(y_train).batch(32)
train_dataset = tf.data.Dataset.zip((x_train, y_train))
first_sample = train_dataset[0] # 报错:'DatasetV1Adapter object is not subscriptable'
那么你可以改成这样:
import tensorflow as tf
x_train = tf.data.Dataset.from_tensor_slices(x_train).batch(32)
y_train = tf.data.Dataset.from_tensor_slices(y_train).batch(32)
train_dataset = tf.data.Dataset.zip((x_train, y_train))
train_dataset = train_dataset.map(lambda x, y: (x, y))
first_sample = train_dataset.batch(1).take(1)[0] # 不报错
在这里,我们首先对每个元素进行了.map(lambda x, y: (x, y))
操作,这样每个元素都是一个tuple,就可以用下标取出元素了。具体地,我们使用了.batch(1)
将Dataset对象转换成batch为1的Dataset对象,然后使用.take(1)
取出1个batch,最后再用下标取出这个tuple元素中的第一个元素,即第一个样本。