【问题标题】:How to load MNIST via TensorFlow (including download)?如何通过 TensorFlow 加载 MNIST(包括下载)?
【发布时间】:2018-11-12 23:14:41
【问题描述】:

MNIST 的 TensorFlow 文档推荐了多种不同的方式来加载 MNIST 数据集:

文档中描述的所有方式都会在 TensorFlow 1.8 中引发许多已弃用的警告。

我目前加载 MNIST 和创建训练批次的方式:

class MNIST:
    def __init__(self, optimizer):
        ...
        self.mnist_dataset = input_data.read_data_sets("/tmp/data/", one_hot=True)
        self.test_data = self.mnist_dataset.test.images.reshape((-1, self.timesteps, self.num_input))
        self.test_label = self.mnist_dataset.test.labels
        ...

    def train_run(self, sess):
        batch_input, batch_output = self.mnist_dataset.train.next_batch(self.batch_size, shuffle=True)
        batch_input = batch_input.reshape((self.batch_size, self.timesteps, self.num_input))
        _, loss = sess.run(fetches=[self.train_step, self.loss], feed_dict={self.input_placeholder: batch_input, self.output_placeholder: batch_output})
        ...

    def test_run(self, sess):
        loss = sess.run(fetches=[self.loss], feed_dict={self.input_placeholder: self.test_data, self.output_placeholder: self.test_label})
        ...

我怎么能做完全一样的事情,只是用目前的方法?

我找不到这方面的任何文档。

在我看来,新方法是这样的:

train, test = tf.keras.datasets.mnist.load_data()
self.mnist_train_ds = tf.data.Dataset.from_tensor_slices(train)
self.mnist_test_ds = tf.data.Dataset.from_tensor_slices(test)

但是如何在我的train_runtest_run 方法中使用这些数据集?

【问题讨论】:

    标签: tensorflow mnist


    【解决方案1】:

    使用TF dataset API加载MNIST数据集的示例:


    创建一个 mnist 数据集以加载训练、有效和测试图像:

    您可以使用Dataset.from_tensor_slicesDataset.from_generator 为numpy 输入创建datasetDataset.from_tensor_slices 将整个数据集添加到计算图中,因此我们将使用 Dataset.from_generator 代替。

    #load mnist data
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
    
    def create_mnist_dataset(data, labels, batch_size):
      def gen():
        for image, label in zip(data, labels):
            yield image, label
      ds = tf.data.Dataset.from_generator(gen, (tf.float32, tf.int32), ((28,28 ), ()))
    
      return ds.repeat().batch(batch_size)
    
    #train and validation dataset with different batch size
    train_dataset = create_mnist_dataset(x_train, y_train, 10)
    valid_dataset = create_mnist_dataset(x_test, y_test, 20)
    

    可在训练和验证之间切换的可馈送迭代器

    handle = tf.placeholder(tf.string, shape=[])
    iterator = tf.data.Iterator.from_string_handle(
    handle, train_dataset.output_types, train_dataset.output_shapes)
    image, label = iterator.get_next()
    
    train_iterator = train_dataset.make_one_shot_iterator()
    valid_iterator = valid_dataset.make_one_shot_iterator()
    

    示例运行:

    #A toy network
    y = tf.layers.dense(tf.layers.flatten(image),1,activation=tf.nn.relu)
    loss = tf.losses.mean_squared_error(tf.squeeze(y), label)
    
    with tf.Session() as sess:
       sess.run(tf.global_variables_initializer())
    
       # The `Iterator.string_handle()` method returns a tensor that can be evaluated
       # and used to feed the `handle` placeholder.
       train_handle = sess.run(train_iterator.string_handle())
       valid_handle = sess.run(valid_iterator.string_handle())
    
       # Run training
       train_loss, train_img, train_label = sess.run([loss, image, label],
                                                     feed_dict={handle: train_handle})
       # train_image.shape = (10, 784) 
    
       # Run validation
       valid_pred, valid_img = sess.run([y, image], 
                                        feed_dict={handle: valid_handle})
       #test_image.shape = (20, 784)
    

    【讨论】:

    • 你没有显示你的“mnist”来自哪里。我假设 mnist = tf.contrib.learn.datasets.load_dataset("mnist") 但使用 tf 1.8 进行测试会引发大量已弃用的警告。
    • 您可以使用 `tf.logging` 来设置这些警告,也可以从 yann.lecun.com/exdb/mnist 下载 mint 文件并将其转换为 numpy 数组。
    • 当然可以,但这不是问题所在。如果某些东西被弃用,我通常假设有一个替代品,一种新的方法来执行弃用的方法。所以你是说他们只是在没有替换的情况下弃用了 MNIST 加载?如果是这样,那将是我最初问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2020-06-03
    • 2019-07-23
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多