簡體   English   中英

使用fit_generator時,Keras模型的批量大小為1

[英]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.

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