[英]Keras model is doing batch size of 1 when using fit_generator
當我使用我的批量生成器fit_generator時,它使用批量大小為1,它為每個時期執行1步增量。 我究竟做錯了什么。
我已經嘗試更改我的批處理生成器的批量大小參數但仍然相同。
我的批量生成器功能:
def batchGenerator(imgs, steerings, batchSize, isTraining):
while True:
batchImg = []
batchSteering = []
for i in range(batchSize):
randIndex = random.randint(0, len(imgs) - 1)
if isTraining:
img, steering = randomAugment(imgs[randIndex], steerings[randIndex])
else:
img = imgs[randIndex]
steering = steerings[randIndex]
img = imgPreprocess(img)
batchImg.append(img)
batchSteering.append(steering)
yield (np.asarray(batchImg), np.asarray(batchSteering))
這是我的fit_generator參數:
history = model.fit_generator(batchGenerator(X_train, y_train, 300, 1),
steps_per_epoch = 300,
epochs = 10,
validation_data = batchGenerator(X_valid, y_valid, 200, 0),
validation_steps = 200,
verbose = 1,
shuffle = 1)
當我運行這個時,批量大小似乎是1,因為每個時期它增加1.對於每個時期它做0 / 300,1 / 300,2 / 300,3 / 300等。
到底是怎么回事?
您的steps_per_epoch
應始終為訓練數據的長度除以batch_size
,即在此情況下為X_train.shape[0]//batch_size
。
此外,您使用隨機索引對數據進行混洗的方式,將意味着可能會多次選擇一些樣本,而不會選擇一些樣本。 您還可以考慮先對整個訓練集進行隨機抽樣,然后選擇連續批量的數據進行訓練。 我只是想指出這一點,如果你錯過了。
def batchGenerator(imgs, steerings, batchsize, isTraining):
while True:
start = 0
end = batchsize
while start < len(imgs):
x = imgs[start:end]
y = steerings[start:end]
if isTraining:
x , y = randomAugment(x, y)
yield x, y
start += batchsize
end += batchsize
也許嘗試這樣的事情。 如果有效,你可以稍后處理洗牌。
您的生成器沒有問題,您的代碼也很好。 解釋輸出的方式是錯誤的。
從文檔中,您可以看到
steps_per_epoch:整數或無。 在宣布一個紀元完成並開始下一個紀元之前的步驟總數(樣本批次)。 使用輸入張量(如TensorFlow數據張量)進行訓練時,默認的None等於數據集中的樣本數除以批量大小,如果無法確定,則為1。
通常, steps_per_epochs
設置為X_train.shape[0]//batch_size
在訓練時,訓練是針對steps_per_epochs
批次進行的,並且一個時期被視為已完成。 由於數據是以隨機順序獲取的,因此沒有其他方法可以告訴模型一個時期結束。
訓練時你可以看到0/300, 1/300, 2/300, 3/300
300/300
0/300, 1/300, 2/300, 3/300
300/300
等,直到300/300
。 這很正常。 這意味着您的模型經過300
步驟的培訓,每步的批量大小為300
(因為批量大小為300)
如果您給出批量大小,比如10,並且steps_per_epoch為100
您可以看到訓練1/100, 2/100
等等,直到100/100
,這意味着,您的模型經過100
步訓練,每一步基本上都是一批10
樣本
與fit
函數相比, fit_generator
的輸出是批次計數而不是訓練示例。 因此,增量為1意味着已經處理了一個批次。 使用steps_per_epoch
您可以定義每個紀元將處理的批次數。
根據定義,當每個訓練樣本被處理一次時,一個時期結束。 這就是為什么人們建議將steps_per_epoch設置為:
steps_per_epoch=number_of_examples//batch_size
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.