2017-12-30 41 views
0

Keras pretrained Inception V3 모델을 사용할 것입니다. 사전 처리 후 이미지 모양은 224 x 224 x 3입니다. 그러나 Keras Inception V3 모델에 대한 입력은 (?, 3,?,?)이며, 이는 일괄 처리 크기가 채널로 이어지는 것입니다. 그래서 나는 배열 모양을 바꿨다. 그러나 이것은 모든 일을 매우 느리게 만들고 기억을 자극합니다. 왜 그런지 모르겠습니다.numpy : 이미지 모양을 224 x 224 x 3에서 3 x 224 x 224로 변경하는 가장 빠른 방법

참고 : 이미지 모양이 224, 224, 3 인 경우 간단한 CNN에서 제대로 작동합니다. 그러나 3, 224, 224에 간단한 CNN을 먹이면 상황이 매우 느려지고 메모리 오버플로가 발생합니다. '0 INPUT_1'형상 = (?? 3) DTYPE = float32

tf.Tensor

def get_image_preprocessed(image_name): 
    im = Image.open(image_name) 
    im = np.asarray(im) 
    im = im/float(255) 
    im = im.reshape(3,224,224) #this changes 224,224,3 to 3,224,224 
    return im 

이 입력 텐서 형상이다

내 코드

추가 정보 :

모델 -

model = Sequential() 
model.add(Conv2D(32, (3, 3), input_shape=(3,224, 224), padding='same', activation='relu', kernel_constraint=maxnorm(3))) 
model.add(Dropout(0.2)) 
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Flatten()) 
model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3))) 
model.add(Dropout(0.5)) 
model.add(Dense(3, activation='softmax')) 

발전기 기능 - 당신이 이것에 대한 .transpose을 사용할 수 있습니다

def generator(save_dir_path, encoding_list, batch_size, image_size): 
    # Create empty arrays to contain batch of features and labels# 
    batch_features = np.zeros((batch_size, 3, image_size, image_size)) 
    batch_labels = np.zeros((batch_size,len(encoding_list))) 
    image_list= [file for file in os.listdir(save_dir_path) if (file.endswith('.jpeg') or file.endswith('.-'))] 
    while True: 
     for i in range(batch_size): 
      # choose random index in features 
      image_name= random.choice(image_list) 
      batch_features[i] = get_image_preprocessed(save_dir_path, image_name) 
      batch_labels[i] = np.asarray(get_encoding(encoding_list, image_name.split('_')[0])) 
     yield batch_features, batch_labels 
+0

이것은'transpose' 문제처럼 보이는이 아니라'reshape' 하나를 --Quoted. '3'은 채널을 계속 나타내며 '224,224'는 이미지 모양을 나타냅니다. – hpaulj

+0

나는 문제를 해결하지 못했습니다. 나는 여기에 더 많은 정보를 추가했다. – sjishan

+0

문제는 백엔드입니다. 이 모델을 올바르게 사용하려면 설명서를 읽어야합니다. – Nain

답변

1

:

그래서 지금부터
im = im.transpose(2,0,1) 

, 기존의 세 번째 지수 (2)가 첫 번째 인덱스, 오래된입니다 첫 번째 인덱스 (0)는 두 번째 인덱스이고 오래된 두 번째 인덱스 (1)는 세 번째 인덱스입니다.

따라서 im[i,j,k]에 액세스하는 경우 im[j,k,i]에 액세스하기 전에 전치 코드를 사용하는 것입니다.

+0

방금 ​​전조 해 봤는데 문제가 여전히 있습니다. 224,224,3을 사용할 때 약 300MB를 사용하지만 3,224,224를 사용할 때는 4.4GB를 사용합니다. 이건 미친 짓이야. – sjishan

+0

@sjishan : 그것은 불가능합니다. 왜냐하면'transpose'는 새로운 배열을 생성하지 않기 때문에 * 뷰 *를 생성합니다. 일반적으로 ~ 100 바이트 걸립니다. –

+0

안녕하세요.나는 그것을 알아 냈다. 이것은'전치 (transpose) '또는'재 형성 (reshape)'의 문제가 아니다. 224,224,3은 1,910,851 개의 매개 변수를 만듭니다. 3,224,224는 205,533,091 개의 매개 변수를 생성합니다. 그래서 그것은 그 기억을 넘치고 있습니다. – sjishan

0

reshapetranspose 이외의 다른 유사한 솔루션 : Numpy 라이브러리에 swapaxes. 다음 행은 첫 번째 축을 배열 im의 세 번째 축과 교체합니다. A는 ndarray 경우

im.swapaxes(0,2) 

는 다음의 뷰가 리턴되고; 그렇지 않으면 새로운 배열이 생성됩니다. 참조

numpy-1.13.0 Docs

에서

How does numpy.swapaxes work?