Как обработать большое изображение в Керасе?

Я работаю над проблемой машинного обучения на Keras. Моя цель - обучить модель, чей вклад (4214, 22311) матрица и выход (22311,) вектор.

Такие двумерные данные можно рассматривать как ввод изображений, но большинство классификаторов изображений работают только с небольшим изображением с формой (200, 200), например.

Я попробовал несколько способов построить модель на Keras, такую ​​как CNN, двунаправленный LSTM или простая нейронная сеть (плоская и плотная). Но ни один из них не работает.

я получил killed без завершения одной эпохи. Поэтому мне интересно, какая структура может обрабатывать такой большой вклад.

1 ответ

Решение

Существует высокая вероятность того, что он может работать в полностью сверточной модели, где вы должны исключить пространственные измерения до того, как произойдет выравнивание / уплотнение. Но поскольку было бы слишком много сверток с одними и теми же данными, это, кажется, не самая лучшая идея...

И поскольку вы хотите получить результат с 22311 результатами, вероятно, подход LSTM (учитывая, что одна другая переменная является первой) будет наиболее полезным....

Модель LSTM:

С первой попытки вы можете попробовать модель LSTM без сохранения состояния.

Но не работайте так, как если бы последние измерения были объектами (20000 объектов создадут путь ко многим параметрам)!!! Работайте так, как если бы они были временными шагами.

Преобразование функций по шагам может затруднить понимание модели. С другой стороны, если вы этого не сделаете, ваша память всегда будет взорваться. Но если эти разные данные являются первым шагом, есть большая вероятность, что все последующие (и повторяющиеся) данные приобретают дополнительное значение.

Итак, во-первых, мы меняем только одну функцию:

inp = Input((4214,1))
out = Lambda(yourFunction, output_shape=(4214,22312))(inp)
out = Reshape((4214,22312,1))(out)

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

out = TimeDistributed(LSTM(cells,return_sequences=True))(out)

#you may add more

Давайте держать return_sequences = Trueпотому что вы хотите очень похожее количество шагов в конце вашей модели.

В какой-то момент давайте свернем измерение 4214, поместив его в конце, как если бы это были временные шаги (или даже если бы это были объекты - рискованно, но намного менее рискованно, чем 23312 объектов). Здесь, так как они независимы, Bidirectional Обертка может пригодиться:

out = Permute((2,1,3))(out)

1 - если вы выбрали 4214 шагов:

#you can use one or more layers with return_sequences=True before this one
out = TimeDistributed(Bidirectional(LSTM(cells,return_sequences=False)))(out)

2 - если вы выбрали 4214 функции:

#remove the last dimension which was 1
out = Reshape((22312,4214))  

#no need to care about they being a sequence, no TimeDistributed, no Bidirectional. 
out = LSTM(cells,return_sequences=True)(out)
    #the return_sequences=True here relates to the 22312 steps   

#but you need to go back to 1 feature per step:
out = Reshape((22312,1))(out)

Теперь измерение 4214 рухнуло, теперь все выглядит как последовательность (batchSize, 22312, 1), Поскольку мы больше не 4D, а 3D, мы можем отказаться от оболочки TimeDistributed:

out = LSTM(cells,return_sequences=True)(out)

В конце используйте лямбда-слой, чтобы отбросить первый элемент этой последовательности (просто, чтобы соответствовать желаемому результату):

out = Lambda(lambda x: x[:,1:,:], output_shape=(22311,1))(out)
out = Reshape((22311,))(out)

model = Model(inp,out)
Другие вопросы по тегам