Python Keras fit_发电机问题
我随后为我的Keras模型创建了一个自定义生成器。以下是一个MWE,显示了我面临的问题:Python Keras fit_发电机问题,python,keras,generator,Python,Keras,Generator,我随后为我的Keras模型创建了一个自定义生成器。以下是一个MWE,显示了我面临的问题: import sys, keras import numpy as np import tensorflow as tf import pandas as pd from keras.models import Model from keras.layers import Dense, Input from keras.optimizers import Adam from keras.losses imp
import sys, keras
import numpy as np
import tensorflow as tf
import pandas as pd
from keras.models import Model
from keras.layers import Dense, Input
from keras.optimizers import Adam
from keras.losses import binary_crossentropy
class DataGenerator(keras.utils.Sequence):
'Generates data for Keras'
def __init__(self, list_IDs, batch_size, shuffle=False):
'Initialization'
self.batch_size = batch_size
self.list_IDs = list_IDs
self.shuffle = shuffle
self.on_epoch_end()
def __len__(self):
'Denotes the number of batches per epoch'
return int(np.floor(len(self.list_IDs) / self.batch_size))
def __getitem__(self, index):
'Generate one batch of data'
# Generate indexes of the batch
#print('self.batch_size: ', self.batch_size)
print('index: ', index)
sys.exit()
def on_epoch_end(self):
'Updates indexes after each epoch'
self.indexes = np.arange(len(self.list_IDs))
print('self.indexes: ', self.indexes)
if self.shuffle == True:
np.random.shuffle(self.indexes)
def __data_generation(self, list_IDs_temp):
'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)
X1 = np.empty((self.batch_size, 10), dtype=float)
X2 = np.empty((self.batch_size, 12), dtype=int)
#Generate data
for i, ID in enumerate(list_IDs_temp):
print('i is: ', i, 'ID is: ', ID)
#Preprocess this sample (omitted)
X1[i,] = np.repeat(1, X1.shape[1])
X2[i,] = np.repeat(2, X2.shape[1])
Y = X1[:,:-1]
return X1, X2, Y
if __name__=='__main__':
train_ids_to_use = list(np.arange(1, 321)) #1, 2, ...,320
valid_ids_to_use = list(np.arange(321, 481)) #321, 322, ..., 480
params = {'batch_size': 32}
train_generator = DataGenerator(train_ids_to_use, **params)
valid_generator = DataGenerator(valid_ids_to_use, **params)
#Build a toy model
input_1 = Input(shape=(3, 10))
input_2 = Input(shape=(3, 12))
y_input = Input(shape=(3, 10))
concat_1 = keras.layers.concatenate([input_1, input_2])
concat_2 = keras.layers.concatenate([concat_1, y_input])
dense_1 = Dense(10, activation='relu')(concat_2)
output_1 = Dense(10, activation='sigmoid')(dense_1)
model = Model([input_1, input_2, y_input], output_1)
print(model.summary())
#Compile and fit_generator
model.compile(optimizer=Adam(lr=0.001), loss=binary_crossentropy)
model.fit_generator(generator=train_generator, validation_data = valid_generator, epochs=2, verbose=2)
我不想乱洗我的输入数据。我以为这已经得到了处理,但在我的代码中,当我在\uuu get\u item\uuu
中打印出索引时,我得到了随机数。我想要连续的数字。请注意,我试图使用sys.exit
inside\uu getitem\uuu
终止进程,以查看发生了什么
我的问题是:
为什么索引不连续?我怎样才能解决这个问题
当我在终端使用屏幕上运行这个时,为什么它不响应Ctrl+C
您可以使用fit\u generator
方法的shuffle
参数连续生成批。从安装发电机()
:
洗牌:布尔值。是否在每个历元开始时洗牌批次的顺序。仅用于Sequence
(keras.utils.Sequence
)的实例。当steps\u per\u epoch
不是None
时无效
只需将shuffle=False传递给fit\u生成器
:
model.fit_generator(generator=train_generator, shuffle=False, ...)
我认为您可以通过将shuffle=False
传递到fit_generator
方法来实现这一点?您好,谢谢您的回复。我在\uuuu init\uuuuu
中默认这么做,后来我测试了索引值是否被中的if语句在\u epoch\u end
中乱序。我发现if语句中的东西没有被执行,我认为这意味着shuffle确实是错误的。您希望批量索引连续生成,对吗?这就是fit\u生成器的shuffle=False
参数。你试过了吗?是的,请看上面的评论。对不起,我不明白。在我的机器上,当我在fit\u generator
调用中设置shuffle=False
时(不是在\uuuuu init\uuuuuu
方法中),我会得到连续的索引。好的,请让我检查我的理解:fit\u generator
没有被覆盖,它属于Keras,并且有自己的参数。我使用DataGenerator
所做的是创建我自己的生成器(train\u generator和valid\u generator),以创建供Keras使用的数据片段。但是为什么这意味着我需要在调用fit_生成器
时指定shuffle=False
,而不是在我自己的生成器中指定呢?@StatsSorceressfit_生成器
已经实现,这样它就可以使用给定的索引值调用序列
的getitem
方法。因此,fit_生成器
为您提供要生成的批次的索引。将shuffle=False
传递给fit_生成器
将强制它按顺序给出批索引,即0、1、2、3、。。。