Я создал генератор для ввода его в функцию fit_generator
кератов.Генератор создает несколько случайных значений.Вот как я это сделал:
class DataGenerator(object):
def __init__(self, X_Y_file_path, batch_size, N):
self.X_Y_file_path = X_Y_file_path
self.batch_size = size
self.N = N
def initialize_zeros(self):
X = np.zeros((self.batch_size, 1), dtype='int32')
Y = np.zeros((self.batch_size, 1), dtype='int32')
Y_neg = np.zeros((self.batch_size, self.N))
return X, Y, Y_neg
def generate(self):
while True:
i = 0
X, Y, Y_neg = initialize_zeros()
for row in load_data_per_line(self.X_Y_file_path): # load_data_per_line is generator function which goes each line at a time from one file.
x, y = row
y_neg = random.sample(id_list, self.N) # a list of id to pick randomly
X[i] = x
Y[i] = y
Y_neg[i] = y_neg
if i == self.batch_size:
yield ([X, Y_neg], Y) # Y_neg goes as input in the model.(not important here. just mentioning)
X, Y, Y_neg = initialize_zeros()
i = 0
Так что это мой генератор.Тем не менее, с тем же примером данных, кажется, работает правильно.
Мне было интересно, как я могу реализовать в этом генераторе функцию тасования для перемешивания после каждой эпохи?
В поиске битов я узнал о последовательности , которую вы можете переопределить on_epoch_end
метод, но не ясно, как я могу реализовать вышеупомянутый генератор с наследованием Sequence
.Любая помощь по этому поводу?(кстати, вышеуказанная функция «безопасна» для использования use_multiprocessing
в fit_generator
?)
Редактировать
X_Y_file_path
- это один файл (с известной длиной).load_data_per_line
- это функция генератора, которая выдает по одной на строку.