2017-04-02 26 views
1

2つの畳み込みレイヤー(簡潔にConv1とConv2)があり、各レイヤーのすべての出力をプロットしたい場合は、この質問に対して次のコードを記述しました(自己完結型です)。 Conv1はすべて正常ですが、私はConv2について何か不足しています。Keras畳み込みレイヤ出力の可視化

私は4つの5x5フィルタを持つConv1に1x1x25x25(numイメージ、numチャネル、height、width(私の慣例、TFまたはTheano convention)イメージ)を供給しています。つまり、その出力形状は4x1x1x25x25(numフィルタ、num画像、numチャンネル、height、width)で、4つのプロットになります。

この出力は、6x3フィルタを持つConv1に供給されています。したがって、Conv2の出力は6x(4x1x1x25x25)でなければなりませんが、そうではありません!むしろ6x1x1x25x25です。つまり、6x4ではなく6つのプロットしかないのですが、なぜですか?以下の機能はまた、彼らは

(1, 1, 25, 25, 4) 
------------------- 
(1, 1, 25, 25, 6) 
------------------- 

ある各出力の形状を出力しますが、

(1, 1, 25, 25, 4) 
------------------- 
(1, 4, 25, 25, 6) 
------------------- 

右すべきですか?

import numpy as np 
#%matplotlib inline #for Jupyter ONLY 
import matplotlib.pyplot as plt 

from keras.models  import Sequential 
from keras.layers  import Conv2D 
from keras   import backend as K 

model = Sequential() 

# Conv1 
conv1_filter_size = 5 
model.add(Conv2D(nb_filter=4, nb_row=conv1_filter_size, nb_col=conv1_filter_size, 
       activation='relu', 
       border_mode='same', 
       input_shape=(25, 25, 1))) 

# Conv2 
conv2_filter_size = 3 
model.add(Conv2D(nb_filter=6, nb_row=conv2_filter_size, nb_col=conv2_filter_size, 
       activation='relu', 
       border_mode='same')) 

# The image to be sent through the model 
img = np.array([ 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.]], 
[[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[1.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.]], 
[[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[1.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[0.],[1.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.]], 
[[1.],[1.],[0.],[1.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[1.],[1.]], 
[[1.],[1.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.]], 
[[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[0.],[0.],[0.],[0.],[0.],[0.],[0.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]], 
[[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.],[1.]]]) 

def get_layer_outputs(image): 
    '''This function extracts the numerical output of each layer.''' 
    outputs = [layer.output for layer in model.layers] 
    comp_graph = [K.function([model.input] + [K.learning_phase()], [output]) for output in outputs] 

    # Feeding the image 
    layer_outputs_list = [op([[image]]) for op in comp_graph] 

    layer_outputs = [] 
    for layer_output in layer_outputs_list: 
     print(np.array(layer_output).shape, end='\n-------------------\n') 
     layer_outputs.append(layer_output[0][0]) 

    return layer_outputs 

def plot_layer_outputs(image, layer_number): 
    '''This function handels plotting of the layers''' 
    layer_outputs = get_layer_outputs(image) 

    x_max = layer_outputs[layer_number].shape[0] 
    y_max = layer_outputs[layer_number].shape[1] 
    n  = layer_outputs[layer_number].shape[2] 

    L = [] 
    for i in range(n): 
     L.append(np.zeros((x_max, y_max))) 

    for i in range(n): 
     for x in range(x_max): 
      for y in range(y_max): 
       L[i][x][y] = layer_outputs[layer_number][x][y][i] 


    for img in L: 
     plt.figure() 
     plt.imshow(img, interpolation='nearest') 

plot_layer_outputs(img, 1) 

答えて

0

畳み込み層の出力は、複数のチャンネルの1つの画像としてバンドルされています。これらは、カラーチャネルとは対照的に、フィーチャチャネルと考えることができます。例えば、畳み込みレイヤーにFの数のフィルタがある場合、入力画像のチャンネル数にかかわらず、Fチャンネル数の画像を出力します。これは、Conv2が6x4ではなく6つのフィーチャマップを生成する理由です。 より詳細には、畳み込みフィルタはすべての入力チャネル上で畳み込みを行い、その畳み込みの線形結合はその活性化関数に供給される。

+0

ご参考までにご意見がございましたら、お気軽にご連絡ください。 – Miladiouss

関連する問題