2016-08-02 7 views
0

Я пытаюсь работать с nolearn и использовать ConcatLayer для объединения нескольких входов. Он отлично работает, если каждый вход имеет тот же тип и форму. У меня есть три разных типа входов, которые в конечном итоге приведут к одному скалярному выходному значению.Пытается использовать ConcatLayer с различными входами формы

  • Первый вход представляет собой изображение размеров (288,1001)

  • Второй вход представляет собой вектор длиной 87

  • В-третьих, одно значение скалярной

Я использую Conv2DLayer (ы) на первом входе. Второй вход использует Conv1DLayer или DenseLayer (не уверен, что было бы лучше, так как я не могу получить его достаточно далеко, чтобы видеть, что происходит) Я даже не уверен, как третий вход должен быть настроен, так как это только один значение, которое я хочу передать в сеть.

Код взрывает на ConcatLayer с: «Несовпадение: входные формы должны быть одинаковыми, за исключением оси конкатенации»

Было бы бесконечно благодарен, если кто-то может выписать супер простую структуру сети который может принимать эти типы входов и выводить одно скалярное значение. Я весь день гулял и просто не мог понять этого.

Подгонка функция выглядит следующим образом, если это полезно знать, как вы можете видеть, я ввод словаря с элементом для каждого типа ввода:

X = {'base_input': X_base, 'header_input': X_headers, 'time_input':X_time} 
net.fit(X, y) 

ответ

1

трудно правильно ответить на этот вопрос , потому что - это зависит. Не имея информации о том, что вы пытаетесь сделать и какие данные вы работаете, мы играем в игру угадывания здесь, и поэтому я должен вернуться к общим советам.

Во-первых, это вполне разумно, что ConcatLayer жалуется. Просто не имеет смысла добавлять скаляр в значения пикселя изображения. Поэтому вы должны думать о том, чего вы на самом деле хотите. Скорее всего, это объединение информации из трех источников.

Вы правы, предлагая обработать изображение с помощью двумерных сверток и данных последовательности с 1D свертками. Если вы хотите создать скалярное значение, вы, возможно, захотите использовать плотные слои позже, чтобы сконденсировать информацию. Таким образом, было бы естественно оставить низкоуровневую обработку трех ветвей независимой, а затем конкатенировать их позже.

Что-то вдоль линий:

Image -> conv -> ... -> conv -> dense -> ... -> dense -> imValues 
Timeseries -> conv -> ... -> conv -> dense ... -> dense -> seriesValues 
concatLayer([imValues, seriesValues, Scalar] -> dense -> ... -> dense with num_units=1 

Еще реже разумным вариантом было бы, чтобы добавить информацию в низкоуровневой обработки изображения. Это может иметь смысл, если локальная обработка намного проще, учитывая знание скалярных/временных рядов.

Эта архитектура может выглядеть следующим образом:

concatLayer(seriesValues, scalar) -> dense -> ... -> reshape((-1, N, 1, 1)) 
    -> Upscale2DLayer(Image.shape[2:3]) -> globalInformation 
concatLayer([globalInformation, Image]) -> 2D conv filtersize=1 -> conv -> ... -> conv 

Обратите внимание, что вы почти наверняка хотите идти с первым вариантом.

Одна несвязанная вещь, которую я заметил, является огромным размером вашего входного изображения. Вы должны уменьшить его (изменение размера/патчи). Если у вас нет гигантской загрузки данных и не хватает памяти и вычислительной мощности, в противном случае вы либо переработаете, либо потеряете оборудование.

+0

По какой-то причине мне не приходило в голову, что я могу переделать с помощью DenseLayer. Полагаю, я думал, что у библиотеки будет способ слияния, но при дальнейшем размышлении я понял, что такой процесс, вероятно, не может быть обобщен с разумными дефолтами. Который тогда сделал это очевидным, я должен был бы предоставить слои, необходимые для изменения. Спасибо за ваш очень полезный ответ! – Beaker