簡體   English   中英

Tensorflow:批處理整個數據集(MNIST教程)

[英]Tensorflow: Batching whole dataset (MNIST Tutorial)

遵循本教程: 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_sizes將破壞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)這樣的函數對我來說很方便。

請注意,您如何 for循環中調用shufflebatch 錯了 TF中的Dataset以函數式編程的方式工作,因此您實際上是在定義用於預處理數據以饋入模型的管道。 在某種程度上,您給出了一個回答“給定原始數據,我應該執行哪些操作(地圖等)操作才能獲得可輸入到我的神經網絡的批處理”的問題的食譜?

現在,您正在為每個批次修改該管道! 發生的是第一次迭代,批處理大小為[32 3600] 在下一次迭代中,此形狀的元素再次被批處理為[32 32 3600] ,依此類推。

TF網站上有很棒的教程 ,您可以在其中找到更多有關Dataset的工作方式的信息,但是這里有一些建議可以解決您的問題。

  • 在代碼中的“步驟2”之后,將混洗移至右側。 然后,您將對整個數據集進行混洗,以便您的批次將包含大量示例。 還要增加buffer_size參數,它的工作方式可能與您假定的方式不同 通常,最好盡早進行洗牌,因為如果您有大型數據集,這可能是一個緩慢的操作-數據集的洗牌部分必須讀入內存。 在這里,無論您是混洗文件名和標簽,還是混洗讀取的圖像和標簽,都沒有關系-但后者將有更多工作要做,因為那時數據集更大。

  • 在開始訓練循環之前,將批處理和迭代器生成器移至最后一步。

  • 不要將feed_dictDataset迭代器一起使用,以將Dataset輸入到模型中。 而是根據iterator.get_next()的輸出定義模型,並省略feed_dict參數。 通過此問答查看更多詳細信息: Tensorflow:從大於2 GB的numpy數組創建minibatch

我在創建張量流數據集時遇到了很多問題。 因此,我決定使用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,高度,寬度,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饋入模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM