Python 当批量大小不为';与数据量不匹配

Python 当批量大小不为';与数据量不匹配,python,tensorflow,machine-learning,keras,data-generation,Python,Tensorflow,Machine Learning,Keras,Data Generation,我在Python2.7中使用Keras。我正在制作自己的数据生成器来计算火车的批次。我对基于此模型的数据发生器有一些疑问: 好的,下面是我的几个问题: 你能证实我对函数调用顺序的看法吗?这是: - __init__ - loop for each epoc : - loop for each batches : - __len_ - __get_item__ (+data generation) - on_epoch_end 如果您知道调试生成器

我在Python2.7中使用Keras。我正在制作自己的数据生成器来计算火车的批次。我对基于此模型的数据发生器有一些疑问:

好的,下面是我的几个问题:

你能证实我对函数调用顺序的看法吗?这是:

- __init__
- loop for each epoc :
    - loop for each batches :
        - __len_
        - __get_item__ (+data generation)
    - on_epoch_end
如果您知道调试生成器的方法,我想知道,断点和打印不适用于此

此外,我的处境很糟糕,但我认为每个人都有问题:

例如,我有200个数据(和200个标签ok),例如,我希望批大小为64。如果我想得好的话,len会给出200/64=3(而不是3125)。那么1个历元将分3批完成?其余的数据呢?我有一个错误,因为我的数据量不是批量大小的倍数

第二个例子,我有200个数据,我想要一批256个?在这种情况下,我需要做什么来调整我的发电机?我曾考虑检查批次大小是否优于我向CNN提供1个批次的数据量,但该批次将没有预期的大小,因此我认为它会出错


谢谢你的阅读。我更喜欢使用伪代码,因为我的问题更多的是关于理论而不是编码错误

Keras在python环境中使用了生成器,如果您无法调试它,原因就在别处

cf:

\uuuu len\uuuu
:提供小批量的数量

\uuuu getitem\uuuu
:给出第i个小批量

您不必知道何时何地调用它们,但更像是这样:

- __init__
- __len_
- loop for each epoc :
    - loop for each batches :
        - __get_item__
    - on_epoch_end
至于小批量大小,您有两个(经典)选择,通过再次从集合中拾取条目来截断或填充。 如果您在每个历元随机排列列车组,随着时间的推移,某些项目不会过度曝光或曝光不足

  • __len_uu;:返回批次数
  • __getitem\返回第i批
通常,您在模型体系结构中从不提及批处理大小,因为它是一个训练参数,而不是模型参数。因此,在培训过程中使用不同的批量是可以的

例子
从keras.models导入
从keras.layers导入稠密、二维、平坦
从keras.utils导入到_category
进口干酪
#创建模型
模型=顺序()
#添加模型层
添加(Conv2D(64,内核大小=3,激活=relu,输入形状=(10,10,1)))
model.add(展平())
model.add(密集(2,activation='softmax'))
compile(优化器='adam',loss='classifical_crossentropy',metrics=['accurity'])
类数据生成器(keras.utils.Sequence):
定义初始大小(自、X、y、批次大小):
self.X=X
self.y=y
self.batch\u size=批次大小
定义(自我):
l=int(len(self.X)/self.batch\u大小)
如果l*self.batch\u尺寸
输出:

1/10纪元
16/16[===================================================-0秒/步-损耗:0.6774-acc:0.6097


正如您所见,它在一个时期内运行了16个批次,即
13*15+5=200

这个问题的调试方面听起来像是我最近试图发布的问题,但没有得到答案。我最终找到了答案,我认为这是一个简单的原则,初学者很容易错过。如果下面是tensorflow gpu,则不能在keras源代码级别中断/调试。keras代码被“翻译”到gpu上运行。我想如果在cpu上运行tensorflow,可能会中断,但不,这也不可能。有很多方法可以在tensorflow级别上调试/中断gpu,但这已经超出了高级keras的简单性。

感谢您的回答,这很清楚。在您的示例中,如果“(index+1)*self.batch_size”是X数组中的索引,那么在X=self.X[…]行发生了什么?(如果在len函数期间添加l+=1,那么最后一批5必须是这种情况?@Alexy它将返回元素,直到数组结束。它不会给出任何错误。检查
np.arange(10)[5:20]
将返回
[5,6,7,8,9]
你让我开心!我将尝试将其适应我的情况,谢谢,因为它是一个多处理任务,无法调试ok。好的,我喜欢有两种不同的场景,谢谢!
- __init__
- __len_
- loop for each epoc :
    - loop for each batches :
        - __get_item__
    - on_epoch_end
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
from keras.utils import to_categorical
import keras

#create model
model = Sequential()
#add model layers
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(10,10,1)))
model.add(Flatten())
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
class DataGenerator(keras.utils.Sequence):
    def __init__(self, X, y, batch_size):
        self.X = X
        self.y = y
        self.batch_size = batch_size

    def __len__(self):
        l = int(len(self.X) / self.batch_size)
        if l*self.batch_size < len(self.X):
            l += 1
        return l

    def __getitem__(self, index):
        X = self.X[index*self.batch_size:(index+1)*self.batch_size]
        y = self.y[index*self.batch_size:(index+1)*self.batch_size]
        return X, y

X = np.random.rand(200,10,10,1)
y = to_categorical(np.random.randint(0,2,200))
model.fit_generator(DataGenerator(X,y,13), epochs=10)