2017-09-12 6 views
1

Keras documentation에 따라에 Gabor 커널을 사용하여 사용자 정의 초기화 프로그램을 만들려고합니다.가보 필터가있는 Keras 커널 초기화 프로그램

나는 쉽게 실행하고 코드를 디버깅하기 위해이 예제를 작성 중이다. (나는이 커널은 CNN의 학습 단계로 변경됩니다 알고

Using Theano backend. 
Train on 80 samples, validate on 20 samples 
Epoch 1/5 
Traceback (most recent call last): 
File "/home/naor/Desktop/workspace/reflux_analyze/core/tests/test.py", 
line 104, in <module> 
train_model(model, X_train, X_test, y_train, y_test) 
File "/home/naor/Desktop/workspace/reflux_analyze/core/tests/test.py", line 98, in train_model 
validation_data=(X_test, y_test)) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/keras/models.py", line 867, in fit 
initial_epoch=initial_epoch) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/keras/engine/training.py", line 1598, in fit 
validation_steps=validation_steps) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/keras/engine/training.py", line 1183, in _fit_loop 
outs = f(ins_batch) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/keras/backend/theano_backend.py", line 1222, in __call__ 
return self.function(*inputs) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/theano/compile/function_module.py", line 898, in __call__ 
storage_map=getattr(self.fn, 'storage_map', None)) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/theano/gof/link.py", line 325, in raise_with_op 
reraise(exc_type, exc_value, exc_trace) 
File "/home/naor/Desktop/workspace/reflux_analyze/local/lib/python2.7/site-packages/theano/compile/function_module.py", line 884, in __call__ 
self.fn() if output_subset is None else\ 
ValueError: Input dimension mis-match. (input[0].shape[1] = 3, input[1].shape[1] = 32) 
Apply node that caused the error: Elemwise{Add}[(0, 0)](CorrMM{valid, 
(1, 1), (1, 1)}.0, InplaceDimShuffle{x,0,x,x}.0) 
Toposort index: 73 
Inputs types: [TensorType(float32, 4D), TensorType(float32, (True, 
False, True, True))] 
Inputs shapes: [(32, 3, 169, 198), (1, 32, 1, 1)] 
Inputs strides: [(401544, 133848, 792, 4), (128, 4, 4, 4)] 
Inputs values: ['not shown', 'not shown'] 
Outputs clients: [[Elemwise{Composite{(i0 * (i1 + Abs(i1)))}} 
(TensorConstant{(1, 1, 1, 1) of 0.5}, Elemwise{Add}[(0, 0)].0), 
Elemwise{Composite{((i0 * i1) + (i0 * i1 * sgn(i2)))}}[(0, 1)] 
(TensorConstant{(1, 1, 1, 1) of 0.5}, MaxPoolGrad{ignore_border=True, 
mode='max', ndim=2}.0, Elemwise{Add}[(0, 0)].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. 

Process finished with exit code 1 

하지만 난 슬로우하는의 가보 커널에서 시작하려는 : 나는 그것을 실행할 때

import random 
from cv2.cv2 import CV_64F 
import keras.backend as K 
import numpy as np 
from keras.layers import Conv2D 
from sklearn.model_selection import train_test_split 
from sklearn.utils import shuffle 
from keras.utils import np_utils 
from keras.layers.convolutional import MaxPooling2D 
from keras.layers.core import Dense, Dropout, Activation, Flatten 
from keras.models import Sequential 
import cv2 
from theano import shared 


images_size = 100 
img_rows = 200 
img_cols = 200 
nb_channel = 3 


def custom_gabor(shape, dtype=None): 
    total_ker = [] 
    for i in xrange(shape[3]): 
     kernels = [] 
     for j in xrange(shape[2]): 
      kernels.append(
      cv2.getGaborKernel(ksize=(shape[0], shape[1]), sigma=1, 
      theta=1, lambd=0.5, gamma=0.3, psi=(3.14) * 0.5, 
      ktype=CV_64F)) 
     total_ker.append(kernels) 
    np_tot = shared(np.array(total_ker)) 
    return K.variable(np_tot, dtype=dtype) 


def build_model(): 
    model = Sequential() 
    # Layer 1 
    model.add(Conv2D(32, (3, 3), kernel_initializer=custom_gabor, 
             input_shape=(nb_channel, img_rows, img_cols))) 
    model.add(Activation('relu')) 
    # Layer 2 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Conv2D(32, (3, 3), kernel_initializer=custom_gabor)) 
    model.add(Activation('relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 

    # Layer 3 
    model.add(Conv2D(32, (3, 3), kernel_initializer=custom_gabor)) 
    model.add(Activation('relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 

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

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

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
    return model 


def make_dummy_data_set(): 
    img_matrix = [] 
    for i in xrange(images_size): 
     img_matrix.append([random.random() for _ in xrange(img_rows*img_cols*nb_channel)]) 

    img_matrix = np.array(img_matrix) 
    label = np.array([random.randint(0, 1) for _ in xrange(images_size)]) 

    data, label = shuffle(img_matrix, label, random_state=7) # random_state=2 
    X_train, X_test, y_train, y_test = train_test_split(data, label, test_size=0.2, random_state=7) 

    # reshape the data 
    X_train = X_train.reshape(X_train.shape[0], nb_channel, img_rows, img_cols) 
    X_test = X_test.reshape(X_test.shape[0], nb_channel, img_rows, img_cols) 

    X_train = X_train.astype('float32') 
    X_test = X_test.astype('float32') 

    # convert class vectore to binary class matrices 
    y_train = np_utils.to_categorical(y_train, 2) 
    y_test = np_utils.to_categorical(y_test, 2) 

    return X_train, X_test, y_train, y_test 


def train_model(model, X_train, X_test, y_train, y_test): 
    model.fit(X_train, 
       y_train, 
       batch_size=32, 
       epochs=5, 
       verbose=1, 
       validation_data=(X_test, y_test)) 


if __name__ == "__main__": 
    model = build_model() 
    X_train, X_test, y_train, y_test = make_dummy_data_set() 
    train_model(model, X_train, X_test, y_train, y_test) 

나는 "입력 치수가 일치하지 않습니다"오류를 얻을 오직 실제 부분) 그리고 내 데이터는 그림이 아닌 무작위 ... ...

감사합니다.

+0

당신이'channels_first'에 keras에 표준'data_format'을 변경 한 크기를 커널과 관련된, 크기 1

  • 3에게 커널과 관련된? 'channels_last'를 디폴트로 사용합니다. 'cannels_last'에서 필터 모양은'(kernel_rows, kernel_columns, input_channels, output_channels)'이어야합니다. 'channels_first'의 올바른 모양이 무엇인지 잘 모르겠습니다. –

  • +0

    그래, 내 keras.json는 다음과 같습니다 : { "엡실론"1E-07, "floatx": "float32" "image_data_format": "channels_first" "백엔드": "theano" "image_dim_ordering": "th" } 제발 도와주세요. 나는 이것에 정말로 매달 렸습니다. – Naor88

    +0

    다음을 인쇄 해주십시오. - gabor없이 모델을 정의하고 인쇄하십시오 :'model.layers [1] .get_weights [0] .shape' (레이어 [1]이 첫 번째 컨볼 루션 레이어라는 것을 확인하십시오.) –

    답변

    1

    오류 메시지의 입력 모양에서 (32,3,169,198)이 입력 이미지임을 식별 할 수 있습니다.

    • 32 개의 이미지 (배치 크기), 3 개의 채널, 측면 169,198입니다.

    그러면 다른 모양으로 가정합니다. (1,32,1,1)은 필터 모양입니다.

    필터의 출력 모양은 32이어야합니다. 좋아요, 거기에 32가 있지만 올바른 위치에 있는지 잘 모르겠습니다. (다른 주석에서 물어 본 모양의 인쇄물을 얻 자마자이 치수의 순서를 업데이트 할 수 있습니다. 그러나 지금은 중요한 코드를 실행 중이므로 설정을 변경할 수 없습니다.

    다른 차원은 모두 잘못되었습니다. 레이어

  • 3 들어오는 입력 채널과 관련하여 길쌈 층
  • 3 (nb_channel)에서 32 세포 (출력 채널)에 관한,

    • 32 : 필터와 같이 형성되어야 2
  • +1

    도움에 감사드립니다! 문제는 custom_gabor 리턴의 모양이었고, 정확하게는 cv2.getGaborKernel이 반환하는 크기가 우리가 pass_size 변수를 통해 예상했던 것에서 차이가 나는 것입니다. 고정 된 코드를 다른 주석에 추가하겠습니다. – Naor88

    2
    def custom_gabor(shape, dtype=None): 
        total_ker = [] 
        for i in xrange(shape[0]): 
         kernels = [] 
         for j in xrange(shape[1]): 
         # gk = gabor_kernel(frequency=0.2, bandwidth=0.1) 
         tmp_filter = cv2.getGaborKernel(ksize=(shape[3], shape[2]), sigma=1, theta=1, lambd=0.5, gamma=0.3, psi=(3.14) * 0.5, 
              ktype=CV_64F) 
          filter = [] 
          for row in tmp_filter: 
           filter.append(np.delete(row, -1)) 
          kernels.append(filter) 
           # gk.real 
         total_ker.append(kernels) 
        np_tot = shared(np.array(total_ker)) 
        return K.variable(np_tot, dtype=dtype)