2016-01-08 2 views
2

Привет, я пытаюсь увеличить глубину существующих сверточных сетей в keras. Ниже существующая сеть:Глубокая сверкающая нейронная сеть в Keras

model = Sequential() 

model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols))) 
model.add(Activation('relu')) 
model.add(Convolution2D(32, nb_conv, nb_conv)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 
model.add(Dropout(0.25)) 

model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid')) 
model.add(Activation('relu')) 
model.add(Convolution2D(64, nb_conv, nb_conv)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 
model.add(Dropout(0.25)) 

model.add(Flatten()) 
model.add(Dense(512)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(256)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(nb_classes)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='adadelta') 

Я пытаюсь добавить глубину сети путем добавления в нескольких свертках слоев, как показано ниже:

model = Sequential() 

model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols))) 
model.add(Activation('relu')) 
model.add(Convolution2D(32, nb_conv, nb_conv)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 
model.add(Dropout(0.25)) 

model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid')) 
model.add(Activation('relu')) 
model.add(Convolution2D(64, nb_conv, nb_conv)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 
model.add(Dropout(0.25)) 

model.add(Convolution2D(128, nb_conv, nb_conv, border_mode='valid')) 
model.add(Activation('relu')) 
model.add(Convolution2D(128, nb_conv, nb_conv)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 
model.add(Dropout(0.25)) 

model.add(Flatten()) 
model.add(Dense(512)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(256)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(nb_classes)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='adadelta') 

Keras дает мне ошибку. Я не уверен, что не так, но похоже, что тензорная форма неправильная. Ниже приведена ошибка.

This could be a known bug in CUDA, please see the GpuCorrMM() documentation. 

Apply node that caused the error: GpuCorrMM{valid, (1, 1)}(GpuContiguous.0, GpuContiguous.0) 
Toposort index: 181 
Inputs types: [CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D)] 
Inputs shapes: [(128, 128, 2, 2), (128, 128, 3, 3)] 
Inputs strides: [(512, 4, 2, 1), (1152, 9, 3, 1)] 
Inputs values: ['not shown', 'not shown'] 
Outputs clients: [[GpuElemwise{Add}[(0, 0)](GpuCorrMM{valid, (1, 1)}.0, GpuReshape{4}.0)]] 

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'. 
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

Мой входной сигнал 28 на 28 пикселей. Может ли кто-нибудь указать мне, что не так с моей моделью?

ответ

1

Ответ, скорее всего, связан с размером изображения. Размер моего изображения - 28х28. Когда мы выполняем свертку и объединение (без нулевого заполнения), размер карт функций уменьшится. Поэтому количество уровней свертки и пула будет ограничено в зависимости от размера входного изображения.

Следующей формула из http://cs231n.github.io/convolutional-networks/

особенности карты размерности = К * ((Ш-Ж + 2P)/S + 1), , где W - объемный размер входных, F воспринимающего размера поля Conv слоя нейроны, S - походка, с которым они применяются, P - сумма заполнения нулей используются на границе, к - глубина ко слоя

не Позволяют не беспокоиться о глубине ко слоя на данный момент , Мы просто хотим рассчитать высоту и ширину результирующих карт функций после каждой операции [CONV -> CONV -> POOL].

Для первой сети сверху я применил [CONV -> CONV -> POOL] дважды. Позволяет рассчитать полученную карту объектов.

Учитывая, Р = 3, p = 0, S = 1, W = 28 на выходе первой [CONV -> CONV -> POOL] операции:

[CONV] 

функция карты размерности = Ш-Ж + 2P)/S + 1 = (28 - 3 + 0)/1 = 26

[CONV] 

функция карты размерности = Ш-Ж + 2P)/S + 1 = (26-3 + 0)/1 = 23

[POOL] 

применение пула o Результаты peration в 23/2 = 11

Это означает, что после первой [CONV -> CONV -> POOL] операции, карта функции теперь 11х11 пикселей

Позволяют применить вторую [CONV -> CONV -> POOL] операции на параметрическом 11х11 карты. Мы обнаружим, что в итоге получим функциональную карту 2x2 пикселей.

Теперь, если мы попытаемся применить третью операцию [CONV -> CONV -> POOL] как то, что я хотел сделать во второй сети. Мы обнаружили, что размер карты характеристик 2x2 слишком мал для другой операции [CONV -> CONV -> POOL].

Я думаю, это причина ошибки.

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

2

Я отвечаю на это, потому что у меня недостаточно комментариев для комментариев. Формула для расчета объема вывода имеет небольшую проблему. K * ((W-F + 2P)/S + 1) должно быть (K * ((W-F + 2P)/S)) + 1.

Смежные вопросы