2016-05-01 29 views
8

Mam problem ze znalezieniem prawidłowego odwzorowania ciężarów w celu przekształcenia gęstej warstwy w splotową warstwę.Python keras, jak przekształcić gęstą warstwę w warstwę splotową

Jest to fragment z ConvNet że pracuję nad:

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Flatten()) 
model.add(Dense(4096, activation='relu')) 

Po MaxPooling, wejście jest od kształtu (512,7,7). Chciałbym przekształcić gęstą warstwę na splotowego warstwy, aby wyglądać tak:

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Convolution2D(4096, 7, 7, activation='relu')) 

Ja jednak nie wiem jak trzeba przekształcić ciężary w celu prawidłowego odwzorowywania spłaszczone wagi do (4096,512,7,7) struktura, która jest potrzebna dla warstwy splotowej? W tej chwili ciężary warstwy gęstej mają wymiar (25088,4096). Muszę jakoś zmapować te 25088 elementów do wymiaru (512,7,7), zachowując prawidłowe odwzorowanie ciężarów na neurony. Do tej pory próbowałem różnych sposobów przekształcania, a następnie transpozycji, ale nie byłem w stanie znaleźć poprawnego mapowania.

Przykładem tego, co staram byłoby to:

weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2)) 

ale nie odwzorowywać ciężarów poprawnie. Sprawdziłem, czy mapowanie jest prawidłowe, porównując wyniki dla obu modeli. Jeśli zrobione poprawnie, oczekuję, że wynik będzie taki sam.

Odpowiedz

6

Nadal szukasz rozwiązania? Oto ona:

new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1] 

w przypadku:

weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1] 

Najtrudniejsze jest Filtry conv Rzut [:,:, :: - 1, :: - 1]. Theano ma splot nie korelacyjny (w przeciwieństwie do caffe np.). Stąd w Keras filtrów typu:

1 0 
0 0 

stosowane do matrycy:

1 2 3 4 5 
6 7 8 9 0 
1 2 3 4 5 

skutkuje Matrix

7 8 9 0 
2 3 4 5 

nie to, jak można by się spodziewać z korelacji:

1 2 3 4 
6 7 8 9 

Aby działało jak oczekiwane, musisz obrócić filtry o 180 stopni. Właśnie rozwiązałem ten problem dla siebie, mam nadzieję, że będzie to pomocne dla ciebie lub dla innych. Twoje zdrowie.