Keras fit_generator () для длинных сигналов - PullRequest
0 голосов
/ 19 марта 2020

Я хочу создать сеть LSTM, и у меня достаточно длинный сигнал, который я хочу использовать в качестве тренировочных данных

  • My X_train - это CSV-файл, который содержит 12 сигналов длиной 54 837 488
  • My y_train - это массив, содержащий кодированный сигнал One Hot ( 9 категорий ) с длина 54 837 488

Если я пытаюсь загрузить CSV-файл в виде фрейма данных или в виде массива в Python, я превышаю ограничение ОЗУ, поэтому моя мысль состоит в том, чтобы использовать fit_generator (). Я использовал это раньше при создании моделей изображений, но затем я просто использовал некоторые предварительно собранные генераторы, но я не могу найти какие-либо предварительно собранные генераторы для сигналов, поэтому я решил попробовать создать их самостоятельно.

def generate_data_to_model(y_train):
    while True:
        with open("/mypath/myData.csv") as f:
            for line in f:
                x= line.rstrip('\n').split(",")
                x= np.asarray(x)
                x=x[1:]
                x= x.reshape(1,1,12)
                yield (x, y_train[line])


model = Sequential()
model.add(LSTM(32, input_shape=(1, 12)))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(9, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer="Adam", metrics=['acc'])

model.fit_generator(generate_data_to_model(y_train),
                    steps_per_epoch=1, epochs=2, verbose=1)

Когда Я начинаю тренировку и получаю эту ошибку:

<ipython-input-29-33b2195fea44> in generate_data_to_model(y_train)
      8                 x= x.reshape(1,1,12)
 ---> 9                 yield (x, y_train[line])

только целые числа, ломтики (:), многоточие (...), numpy .newaxis (None) и целое число или логические массивы действительные индексы

1 Ответ

0 голосов
/ 20 марта 2020

Я нашел решение этой проблемы с помощью этой статьи . То, что я нашел действительно удобным, это сделать два генератора. Один для функций, или X, и один для меток, или y.

def generate_X():
    while True:
        with open("/mypath/myData.csv") as f:
            for line in f:
                x= line.rstrip('\n').split(",")
                x= np.asarray(x)
                x=x[1:]
                x= x.reshape(1,1,12)
                yield x

def generate_y():
    while True:
        for i in range(len(y_train)):
            y= y_train[i]
            yield y

А потом я go вперед и использую эти два генератора в качестве входных данных для моего третьего генератора, который будет составлять партии желаемый размер для fit_generator ()

def batch_generator(batch_size, gen_x,gen_y): 

    batch_features = np.zeros((batch_size,1, 12))
    batch_labels = np.zeros((batch_size,9))

    while True:
        for i in range(batch_size):
            batch_features[i] = next(gen_x)
            batch_labels[i] = next(gen_y)
        yield batch_features, batch_labels

И последнее, но не менее важное: теперь я могу использовать batch_generator при обучении моей модели

model.fit_generator(batch_generator(128, generate_X(), generate_y()),
                    steps_per_epoch=(len(y_train)/128), epochs=2, verbose=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...