【问题标题】:batch size is smaller than I specified in keras批量大小小于我在 keras 中指定的
【发布时间】:2017-09-07 16:14:51
【问题描述】:

我为一个包含 Keras 的 mat 文件的大型数据集编写了一个数据生成器。

这是我的代码,我尝试解决 3 个类的问题,它们的数据位于不同的文件夹(一、二、三)中,并且每批都会从这些文件夹中随机填充。

def generate_arrays_from_file(path,nc1,nc2,nc3):
    while True:
        for line in range(batch_size):
            Data,y=fetch_data(path,nc1,nc2,nc3)
            yield (Data, y)

def fetch_data(path,nc1,nc2,nc3):
    trainData = numpy.empty(shape=[batch_size,img_rows, img_cols ])
    y = []
    for line in range(batch_size):
        labelClass = random.randint(0, 2)
        if labelClass == 0:
            random_num = random.randint(1, nc1)
            file_name = path + '/' + 'one/one-' + str(random_num) + '.mat'
        elif labelClass == 1:
            random_num = random.randint(1, nc2)
            file_name = path + '/' + 'two/two-' + str(random_num) + '.mat'
        else:
            random_num = random.randint(1, nc3)
            file_name = path + '/' + 'three/three-' + str(random_num) + '.mat'

        matfile = h5py.File(file_name)
        x = matfile['data']
        x = numpy.transpose(x.value, axes=(1, 0))

        trainData[line,:,:]=x

        y.append(labelClass)

    trainData = trainData.reshape(trainData.shape[0], img_rows, img_cols, 1)

    return trainData,y

这段代码可以运行,但是 batch_size 设置为 16,但是 keras 的输出是这样的

  1/50000 [..............................] - ETA: 65067s - loss: 1.1666 - acc: 0.2500
    2/50000 [..............................] - ETA: 34057s - loss: 1.4812 - acc: 0.2188
    3/50000 [..............................] - ETA: 24202s - loss: 1.6554 - acc: 0.1875
    4/50000 [..............................] - ETA: 18799s - loss: 1.5569 - acc: 0.2344
    5/50000 [..............................] - ETA: 15611s - loss: 1.4662 - acc: 0.2625
    6/50000 [..............................] - ETA: 13863s - loss: 1.4563 - acc: 0.2500
    8/50000 [..............................] - ETA: 10978s - loss: 1.3903 - acc: 0.2734
    9/50000 [..............................] - ETA: 10402s - loss: 1.3595 - acc: 0.2778
   10/50000 [..............................] - ETA: 10253s - loss: 1.3333 - acc: 0.2875
   11/50000 [..............................] - ETA: 10389s - loss: 1.3195 - acc: 0.2784
   12/50000 [..............................] - ETA: 10411s - loss: 1.3063 - acc: 0.2760
   13/50000 [..............................] - ETA: 10360s - loss: 1.2896 - acc: 0.2788
   14/50000 [..............................] - ETA: 10424s - loss: 1.2772 - acc: 0.2768
   15/50000 [..............................] - ETA: 10464s - loss: 1.2660 - acc: 0.2750
   16/50000 [..............................] - ETA: 10483s - loss: 1.2545 - acc: 0.2852
   17/50000 [..............................] - ETA: 10557s - loss: 1.2446 - acc: 0.3015

似乎没有考虑 batch_size。你能说出为什么吗? 谢谢。

【问题讨论】:

    标签: keras


    【解决方案1】:

    train_generator(问题中未显示代码)中的每个 step 都是一个批次。

    所以:

    • 批量大小由generator 定义 - 但它没有显示在打印输出中。
    • 传递给fit_generator 的steps_per_epoch 参数是将从生成器中抽取多少批次。每个步骤(或批次)都打印在该输出中。
    • epochs 参数将定义重复所有内容的次数。

    在输出中很明显您选择了steps_per_epoch = 50000。因此,它假设您要训练 50000 个批次。它将从生成器中检索 50000 个批次。 (但批次的大小由生成器定义)。

    检查批量大小:

    有两种可能的方法来检查您的批量大小:

    • 从您的生成器中获取一个样本并检查其长度
    • 创建一个 callback 来打印日志

    来自生成器:

    generator = generate_arrays_from_file(path,nc1,nc2,nc3)
    generatorSampleX, generatorSampleY = generator.next() #or next(generator)
    print(generatorSampleX.shape)
    
    #this will set the generator to the second element, so, it would be good to create the generator again before giving it to training
    

    来自回调:

    from keras.callbacks import LambdaCallback
    
    callback = LambdaCallback(on_batch_end=lambda batch,logs:print(logs))
    model.fit_generator(........, callbacks = [callback])
    

    【讨论】:

    • 谢谢 Daniel,但是我得到了一个错误 generatorSampleX, generatorSampleY = generator.next() AttributeError: 'generator' object has no attribute 'next'
    • 第二个建议的输出是:{'loss': 1.0628247, 'acc': 0.3125, 'batch': 0, 'size': 16} 1/500 [..... .........................] - ETA:577s - 损失:1.0628 - acc:0.3125{'loss':1.2004553,'acc':0.4375 ,“批次”:1,“大小”:16} 2/500 [.......................] - ETA : 300s - loss: 1.1316 - acc: 0.3750{'loss': 1.7897727, 'acc': 0.4375, 'batch': 2, 'size': 16} 3/500 [............ ....................] - ETA:210s - 损失:1.3510 - acc:0.3958 {'loss':1.2571058,'acc':0.375,'batch':3 , '大小': 16}
    • 哦...也许是你的python版本,试试next(generator)。
    • 您的批量大小是'size': 16 -- 您可以自定义回调以仅打印您想要的内容,或者更好地格式化输出,甚至做其他事情。
    • print(generatorSampleX.shape) 的输出为 (16, 2, 850, 1),表示 batch_size 为 16
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2022-01-04
    • 2019-06-24
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多