[英]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循環中調用shuffle
和batch
? 錯了 TF中的Dataset
以函數式編程的方式工作,因此您實際上是在定義用於預處理數據以饋入模型的管道。 在某種程度上,您給出了一個回答“給定原始數據,我應該執行哪些操作(地圖等)操作才能獲得可輸入到我的神經網絡的批處理”的問題的食譜?
現在,您正在為每個批次修改該管道! 發生的是第一次迭代,批處理大小為[32 3600]
。 在下一次迭代中,此形狀的元素再次被批處理為[32 32 3600]
,依此類推。
TF網站上有很棒的教程 ,您可以在其中找到更多有關Dataset
的工作方式的信息,但是這里有一些建議可以解決您的問題。
在代碼中的“步驟2”之后,將混洗移至右側。 然后,您將對整個數據集進行混洗,以便您的批次將包含大量示例。 還要增加buffer_size
參數,它的工作方式可能與您假定的方式不同 。 通常,最好盡早進行洗牌,因為如果您有大型數據集,這可能是一個緩慢的操作-數據集的洗牌部分必須讀入內存。 在這里,無論您是混洗文件名和標簽,還是混洗讀取的圖像和標簽,都沒有關系-但后者將有更多工作要做,因為那時數據集更大。
在開始訓練循環之前,將批處理和迭代器生成器移至最后一步。
不要將feed_dict
與Dataset
迭代器一起使用,以將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.