我在Python 2.7中使用Keras。我正在制作自己的数据生成器来计算火车的批次。我对基于此模型seen here的data_generator有一些疑问:
class DataGenerator(keras.utils.Sequence):
def __init__(self, list_IDs, ...):
#init
def __len__(self):
return int(np.floor(len(self.list_IDs) / self.batch_size))
def __getitem__(self, index):
indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
# Find list of IDs
list_IDs_temp = [self.list_IDs[k] for k in indexes]
# Generate data
X, y = self.__data_generation(list_IDs_temp)
return X, y
def on_epoch_end(self):
'Updates indexes after each epoch'
self.indexes = np.arange(len(self.list_IDs))
if self.shuffle == True:
np.random.shuffle(self.indexes)
def __data_generation(self, list_IDs_temp):
#generate data
return X, y
好的,这是我的几个问题:
您能证实我对功能顺序的看法吗?这是 :
- __init__
- loop for each epoc :
- loop for each batches :
- __len_
- __get_item__ (+data generation)
- on_epoch_end
如果您知道一种调试生成器的方法,我想知道的话,断点和打印将无法使用。
而且,我的处境很糟糕,但我认为每个人都有问题:
例如,我有200个数据(还可以有200个标签),并且我希望批量大小为64。如果我想的很好,__ len_将给出200/64 = 3(而不是3125)。那么1个时代将完成3个批次?其余的数据呢?我有一个错误,因为我的数据量不是批处理大小的倍数...
第二个例子,我有200个数据,我想要一批256个?在这种情况下,我该怎么做才能适应发电机?我考虑过检查batch_size是否优于我的数据量,以便用1个批处理提供CNN,但是该批处理没有预期的大小,所以我认为这会出错?
谢谢您的阅读。我更喜欢使用伪代码,因为我的问题更多是关于理论,而不是编码错误!
最佳答案
__len__:返回批次数
__getitem__:返回第i批
通常,您永远不会在模型体系结构中提及批次大小,因为它是训练参数而不是模型参数。因此可以在训练时具有不同的批次大小。
例
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)
输出:
Epoch 1/1016/16 [==============================] - 0s 2ms/step - loss: 0.6774 - acc: 0.6097
如您所见,它已经在一个时期内运行了16个批次,即
13*15+5=200