簡體   English   中英

Python keras如何將密集層轉換為卷積層

[英]Python keras how to transform a dense layer into a convolutional layer

我在找到權重的正確映射時遇到問題,以便將密集層轉換為卷積層。

這是我正在研究的ConvNet的摘錄:

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'))

在MaxPooling之后,輸入的形狀(512,7,7)。 我想將密集層轉換為卷積層,使其看起來像這樣:

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

但是,我不知道如何重新塑造權重以便將扁平權重正確映射到卷積層所需的(4096,512,7,7)結構? 現在,致密層的重量具有尺寸(25088,4096)。 我需要以某種方式將這些25088元素映射到(512,7,7)維度,同時保留權重到神經元的正確映射。 到目前為止,我已經嘗試了多種重塑方式然后進行轉置,但我無法找到正確的映射。

我一直在嘗試的一個例子是:

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

但它沒有正確映射權重。 我通過比較兩個模型的輸出來驗證映射是否正確。 如果正確完成,我希望輸出應該是相同的。

仍在尋找解決方案? 這里是:

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

在你的情況下:

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

棘手的部分是轉換flipping [:,:,:: - 1,:: - 1]。 Theano確實卷積不相關(與caffe不同)。 因此,在Keras過濾器中:

1 0
0 0

應用於矩陣:

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

結果矩陣:

7 8 9 0 
2 3 4 5

不是這個,正如人們所期望的那樣:

1 2 3 4
6 7 8 9

為了使工作按預期工作,您需要將濾鏡旋轉180度。 剛剛為我自己解決了這個問題,希望這對你或他人都有幫助。 干杯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM