2017-11-09 4 views
0

2D 컨볼 루션을위한 작은 맞춤 Keras 모델에 맞춤형 가중치를 설정하는 데 도움이 필요합니다.Keras 모델의 가중치 설정

X = [[[3, 2, -4], 
     [0, 5, 4], 
     [2, -1, -7], 
     [-7, 0, 1]], 
    [[-8, 9, 1], 
     [-3, 6, 0], 
     [0, -4, 2], 
     [5, 1, 1]]] 

이렇게 입력이 2 채널 만있는 4x3 이미지라고 생각할 수 있습니다. 그리고 제 커널은 다음과 같습니다 :

kernel = [[[2, 1], 
      [0, -1], 
      [0, -1]], 
      [[1, 2], 
      [2, -1], 
      [2, -2]]] 

그래서 2 차원 3x2 커널입니다. 하나의 보폭과 패딩, 손으로 차원 컨볼 루션을하는 수율 : 불행하게도

[[10, 14], 
[27, 16]] 

, 다음 Keras 코드 :

model = Sequential() 
conv2d = Conv2D(filters=1, kernel_size=(3,2), strides=1, input_shape=(2,4,3), use_bias=False) 
model.add(conv2d) 
layer = model.layers[0] 
layer.set_weights([np.array(kernel).reshape(3, 2, 2, 1)]) 
print(model.predict(np.array(X).reshape((1,) + np.shape(X)))) 

출력 :

[[19, -6], 
[-39, 16]] 

나는 할 수 없었다 Keras가 컨볼 루션을 위해 어떻게 커널을 구성하는지 알아 내십시오. 지금까지는 매우 직관력이 부족한 것처럼 보였지만 아마 뭔가 빠졌을 것입니다.

저는 Tensorflow 1.4.0과 함께 Keras 2.0.9를 백엔드로 사용하고 있습니다.

답변

3

케라의 커널은 channels_first을 사용하는 경우에도 (height, width, input_channels, output_channels) 모양을 따릅니다.

당신은 모양을 (3,2,2,1)

를 사용하지만 수동 계산 역 형태를 고려하고 생각에 맞아. 수동 계산에서는 (input_channels, height, width)을 사용하고 있습니다.

reshape 커널을 사용하면 이러한 치수를 올바르게 재정렬하지 않습니다. 변형은 배열을 "조 변경"하는 것과 동일하지 않습니다. Reshape는 어떤 종류의 재정렬도없이 단순히 데이터를 재 그룹화합니다.

가 keras에서 올바른 결과를 달성하기 위해, 당신은 제대로 축을 교체해야합니다

#start as (input_channels, height, width) = (2,3,2)  
kernel = np.array([[[2, 1], 
     [0, -1], 
     [0, -1]], 
     [[1, 2], 
     [2, -1], 
     [2, -2]]]) 

#change to (height, input_channels, width) = (3,2,2) 
kernel = kernel.swapaxes(0,1) 

#change to (height, width, input_channels) = (3,2,2) 
kernel = kernel.swapaxes(1,2) 

#add output_channels 
kernel = kernel.reshape((3,2,2,1))