【问题标题】:Tensorflow: Batching whole dataset (MNIST Tutorial)Tensorflow:批处理整个数据集(MNIST 教程)
【发布时间】:2018-08-17 14:02:33
【问题描述】:

跟随本教程:https://www.tensorflow.org/versions/r1.3/get_started/mnist/pros

我想自己解决一个带有标签图像的分类问题。由于我没有使用 MNIST 数据库,因此我花了几天时间在 tensorflow 中创建自己的数据集。它看起来像这样:

#variables
batch_size = 50
dimension = 784
stages = 10

#step 1 read Dataset
filenames = tf.constant(filenamesList)
labels = tf.constant(labelsList)

#step 2 create Dataset
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))

#step 3: parse every image in the dataset using `map`
def _parse_function(filename, label):
    #convert label to one-hot encoding
    one_hot = tf.one_hot(label, stages)

    #read image file
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_image(image_string, channels=3)
    image = tf.cast(image_decoded, tf.float32)

    return image, one_hot

#step 4 final input tensor
dataset = dataset.map(_parse_function)
dataset = dataset.batch(batch_size) #batch_size = 100

iterator = dataset.make_one_shot_iterator()
images, labels = iterator.get_next()

images = tf.reshape(images, [batch_size,dimension]).eval()
labels = tf.reshape(labels, [batch_size,stages]).eval()

for _ in range(10):
    dataset = dataset.shuffle(buffer_size = 100)
    dataset = dataset.batch(batch_size)
    iterator = dataset.make_one_shot_iterator()
    images, labels = iterator.get_next()

    images = tf.reshape(images, [batch_size,dimension]).eval()
    labels = tf.reshape(labels, [batch_size,stages]).eval()

    train_step.run(feed_dict={x: images, y_:labels})

不知何故,使用 更高的 batch_size 会破坏 python。我正在尝试做的是在每次迭代中用新批次训练我的神经网络。这就是为什么我也使用 dataset.shuffle(...)。使用 dataset.shuffle 也会破坏我的 Python。

我想做的(因为随机播放中断)是批处理整个数据集。通过评估 ('.eval()') 我将得到一个 numpy 数组。然后我将使用 numpy.random.shuffle(images) 对数组进行洗牌,然后挑选一些第一个元素来训练它。

例如

for _ in range(1000):
    images = tf.reshape(images, [batch_size,dimension]).eval()
    labels = tf.reshape(labels, [batch_size,stages]).eval()

    #shuffle
    np.random.shuffle(images)
    np.random.shuffle(labels)

    train_step.run(feed_dict={x: images[0:train_size], y_:labels[0:train_size]})

但随之而来的问题是我无法对整个数据集进行批处理。看起来数据太大了,python 无法使用。 我应该如何以不同的方式解决这个问题?

由于我没有使用 MNIST 数据库,因此没有像 mnist.train.next_batch(100) 这样对我很方便的函数。

【问题讨论】:

    标签: python tensorflow dataset mnist tensorflow-datasets


    【解决方案1】:

    注意你是如何调用 shufflebatch inside 你的 for 循环的?这是错误的。 TF 中的Datasets 以函数式编程的方式工作,因此您实际上是在定义一个管道来预处理数据以馈送到您的模型中。在某种程度上,您给出了一个回答“给定这些原始数据,我应该执行哪些操作(地图等)来获得可以输入到我的神经网络中的批次?”这个问题的配方。

    现在您正在为每个批次修改该管道!发生的情况是第一次迭代,批量大小是[32 3600]。下一次迭代,这个形状的元素被批处理再次,到[32 32 3600],等等。

    有一个很棒的tutorial on the TF website,您可以在其中了解更多Datasets 的工作原理,但这里有一些建议可以解决您的问题。

    • 将改组移到代码中“第 2 步”之后的右侧。然后,您将洗牌整个数据集,以便您的批次将有很好的示例混合。还要增加buffer_size 参数,这适用于different way than you probably assume。尽早洗牌通常是一个好主意,因为如果你有一个大数据集,这可能是一个缓慢的操作——数据集的洗牌部分必须被读入内存。在这里,您是否打乱文件名和标签,或读取的图像和标签并不重要 - 但后者将有更多工作要做,因为到那时数据集更大。

    • 将批处理和迭代器生成器移到最后一步,就在开始训练循环之前。

    • 不要使用 feed_dictDataset 迭代器将数据输入到模型中。相反,根据iterator.get_next() 的输出定义您的模型并省略feed_dict 参数。从此问答中查看更多详细信息:Tensorflow: create minibatch from numpy array > 2 GB

    【讨论】:

    • 感谢您的回复。我从我的 for 循环中删除了 shuffle 和 batch。我只是不明白stackoverflow.com/questions/49053569/… 是如何解决我的问题的。我想在我的内部 for 循环中执行与 MNIST 教程中相同的操作。
    • 例如挑选我的数据集的随机图片并将其输入占位符。然后重复该步骤。评估 (.eval()) 将使我的图像、标签成为 Numpy 数组,在那里我可以将它们提供给我的占位符。
    • @ManhKhôiDuong 使用Dataset API 的全部意义在于使用占位符和feed_dict 向模型提供数据。
    • 我在您提供给我的链接中找不到“模型”的 tensorflow 类。
    • @ManhKhôiDuong 是的,您必须使用自己的模型定义。链接的答案仅显示了如何使用Dataset的正确原理。
    【解决方案2】:

    我在创建 tensorflow 数据集方面遇到了很多问题。所以我决定使用 OpenCV 来导入图片。

    import opencv as cv
    imgDataset = []
    for i in range(len(files)):
        imgDataset.append(cv2.imread(files[i]))
    imgDataset = np.asarray(imgDataset)
    

    imgDataset 的形状是 (num_img, height, width, col_channels)。获取第i张图片应该是imgDataset[i]。

    改组数据集并只获取它的批次可以这样完成:

    from sklearn.utils import shuffle
    X,y = shuffle(X, y)
    X_feed = X[batch_size]
    y_feed = y[batch_size]
    

    然后你将 X_feed 和 y_feed 输入到你的模型中

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 1970-01-01
      • 2018-11-05
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多