【发布时间】:2018-10-07 18:26:38
【问题描述】:
我正在使用 tf.keras API 构建我的 CNN 模型,并使用 tf.Dataset API 为我的模型创建输入管道。来自tf.keras.datasets的mnist数据集用于测试并通过执行代码在内存中准备:
(train_images,train_labels),(test_images,test_labels) = tf.keras.datasets.mnist.load_data()
还有一些与我的 keras 模型兼容的预处理:
Train_images = np.expand_dims(train_images,3).astype('float')/255.0
Test_images = np.expand_dims(test_images,3).astype('float')/255.0
Train_labels = tf.keras.utils.to_categorical(train_labels)
Test_labels = tf.keras.utils.to_categorical(test_labels)
这些数据以数组的形式存储在内存中,创建 Dataset 对象有两个选项。第一个是简单地使用tf.data.Dataset.from_tensor_slices:
image = tf.data.Dataset.from_tensor_slices((Train_images,Train_labels))
并将这个结果对象输入到 model.fit():
model.fit(x=image,steps_per_epoch=1000)
或通过以下方式输入此数据集的迭代器:
iterator = image.make_one_shot_iterator()
model.fit(x=iterator,steps_per_epoch=1000)
这两个选项都可以正常工作,因为这里名为 image 的数据集是使用内存中的数据创建的。但是,根据这里的Importing Data,我们可能希望避免这样做,因为它会多次复制数据并占用内存。所以另一种选择是基于tf.placeholder 以及可初始化的迭代器创建这样一个数据集对象:
X = tf.placeholder(tf.float32,shape = [60000,28,28,1])
Y = tf.placeholder(tf.float32,shape = [60000,10])
image2 = tf.data.Dataset.from_tensor_slices((X,Y))
iterator2 = image.make_initializable_iterator()
with tf.Session() as sess:
sess.run(iterator2.initializer,feed_dict={X:Train_images,Y:Train_labels}
sess.run(iterator2.get_next())
这种迭代器在使用tf.Session() 时可以正常工作,同时在内存中提供数据并避免数据的多个副本。但我找不到让它与keras.model.fit() 一起工作的方法,因为你不能真正调用iterator.initializer 或在那里提供任何数据。有没有办法使用这种迭代器?
【问题讨论】:
标签: python tensorflow keras