2

나는 tensorflow 백엔드가있는 keras를 사용하여 두 클래스의 이미지 분류 코드를 작성하고 있습니다. 내 이미지는 컴퓨터의 폴더에 저장되어 있으며 이러한 이미지를 내 keras 모델의 입력으로 제공하려고합니다. flow(x,y) 또는 flow_from_directory(directory)을 사용해야하지만 flow(x,y)에는 flow_from_directory(directory)을 사용하므로 길이 작업 인 레이블도 제공해야합니다. load_img은 입력 이미지를 하나만 가져옵니다. 내 이미지는 20 * 40, 55 * 43 .....와 같이 가변 크기이지만 here은 고정 된 target_size가 필요하다는 것을 언급합니다. this 솔루션에서 input_shape=(1, None, None) 또는 input_shape = (없음, 없음, 3) (채널 마지막 및 컬러 이미지)를 사용하여 컨볼 루션 계층에 입력으로 가변 크기 이미지를 제공 할 수 있지만 fchollet은 평평한 레이어에는 유용하지 않으며 my 모델은 회선 및 평평한 레이어로 구성됩니다. 이 게시물에서는 moi90 만 다른 배치를 시도하지만 모든 배치는 같은 크기의 이미지를 가져야한다고 제안하지만 내 데이터가 매우 분산되어 있기 때문에 같은 크기의 이미지를 그룹화 할 수 없습니다. 나는 그것이 때문이 아니라 img_dim_orderingbackend입니다하지만 때문에 this의 내가이 확신keras에서 가변 크기 이미지를 입력하는 방법

Traceback (most recent call last): 

    File "<ipython-input-8-4e22d22e4bd7>", line 23, in <module> 
    model.add(Flatten()) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/models.py", line 489, in add 
    output_tensor = layer(self.outputs[0]) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/engine/topology.py", line 622, in __call__ 
    output_shape = self.compute_output_shape(input_shape) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/layers/core.py", line 478, in compute_output_shape 
    '(got ' + str(input_shape[1:]) + '. ' 

ValueError: The shape of the input to "Flatten" is not fully defined (got (None, None, 16). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model. 

: 이제

from __future__ import print_function 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D 
from keras import backend as K 
import numpy as np 
from keras.preprocessing.image import ImageDataGenerator 

input_shape = (None,None,3) 

model = Sequential() 
model.add(Conv2D(8, kernel_size=(3, 3), 
       activation='relu', 
       input_shape=input_shape)) 
model.get_weights() 
model.add(Conv2D(16, (3, 3), activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(32, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(2, activation='softmax')) 

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

train_datagen = ImageDataGenerator() 
test_datagen = ImageDataGenerator() 
train_generator = train_datagen.flow_from_directory('/data/train', target_size=input_shape, batch_size=1,class_mode='binary') 
validation_generator = test_datagen.flow_from_directory('/data/test',target_size=input_shape,batch_size=1,class_mode='binary') 
model.fit_generator(train_generator,steps_per_epoch=1,epochs=2,validation_data=validation_generator,validation_steps=1) 

내가 무엇입니까 다음과 같은 오류 : 그래서 내가 batch size=1로 가서 다음 코드를 작성하기로 결정 모두 체크 됨 th 코드를 수정하거나 변수 모델을 입력 할 수있는 방법을 알려주십시오.

+0

더 정확한 대답을 기다리는 중 – Hitesh

답변

2

불행히도 다양한 크기의 이미지로 신경 네트워크를 훈련 할 수는 없습니다. 모든 이미지의 크기를 지정된 크기로 조정해야합니다. 다행스럽게도 하드 드라이브에서이 작업을 수행 할 필요가 없습니다. keras는 영구적으로 hte에서이 작업을 수행합니다. ,

train_generator = train_datagen.flow_from_directory(
    'data/train', 
    target_size=(150, 150), #every image will be resized to (150,150) before fed to neural network 
    batch_size=32, 
    class_mode='binary') 

또한 그렇게 할 경우, 당신은 당신이 원하는대로 배치 크기를 가질 수 있습니다

은 flow_from_directory 내부에서이 같은 target_size가를 정의해야합니다.

+0

좋습니다. 만약 내가 같은 차원의 이미지를 그룹화한다면 그것은 가능한가? 내 코드에서 어떤 변화가 있어야하는지. – Hitesh

+0

Thnx Ioannis 편집 용 – Hitesh

2

numpy 배열에 변수 크기를 넣지 않으려면 변수 크기를 조정할 수 있습니다.

그러나 일부 레이어는 가변 크기를 지원하지 않으며 Flatten은 그 중 하나입니다. 다양한 크기의 Flatten 레이어가 포함 된 모델을 교육하는 것은 불가능합니다.

평평한 레이어를 GlobalMaxPooling2D 또는레이어로 바꾸어보세요. 그러나 이러한 레이어는 너무 많은 정보를 작은 데이터에 응축시킬 수 있으므로 더 많은 채널에 더 많은 콘볼 루션을 추가해야 할 수도 있습니다.

발전기가 동일한 크기의 이미지를 포함하는 일괄 처리를 생성하는지 확인해야합니다. 동일한 numpy 배열에 크기가 다른 두 개 이상의 이미지를 넣으려고하면 생성기가 실패합니다.

+0

Thnx 답장 용 Daniel. 나는 같은 크기의 이미지 그룹을 만들지 만 어떻게 진행할 것인가? 필자의 abobe 언급 코드에서 변경해야 할 사항은 무엇입니까? – Hitesh

+0

'model.add (Flatten())'을'model.add (GlobalMaxPooling2D()) '로 대체하면 다음 오류가 발생합니다 :'File "/home/nd/anaconda3/lib/python3.6/site-packages /keras/utils/data_utils.py ", 557 줄에서 6을 얻으십시오.raise_from (StopIteration을 (전자), 전자) raise_from StopIteration을에서 파일 "", 2 호선, 'NoneType'객체가 integer' – Hitesh

+0

으로 해석 할 수없는 나는 곳이 계층 전에 그물이 출력되는 것을 믿는다 (또는 심지어 입력으로)'nan' 값을 얻습니다. 'relu' 활성화로 인해 우연히 모든 결과가 0이되어 그라디언트가 발생하지 않을 수 있습니다. 이미지가 양수 값으로 만 만들어진 경우 초기화 도구를 relu로 레이어에 전달하여 모든 가중치를 양수로 시작하도록 시도 할 수 있습니다. –