2017-12-17 16 views
0

GPU 사용 가능 Tensorflow 백엔드가있는 Keras를 사용하여 3 계층 밀도 신경망 모델을 학습하려고합니다.밀도 층에서 케라 오류가 발생했습니다. 4 차원의 모양이 배열 (1024,2)로 나타납니다.

내가 가지고있는 데이터 세트는 내가 속한 카테고리의 이름으로 디렉토리에 배치 한 4 백만 개의 20x40 픽셀 이미지입니다.

많은 양의 데이터 때문에 RAM에 모든 데이터를로드하고 내 모델로 피드 할 수 없으므로 Keras's ImageDataGenerator을 사용하여 생각했습니다. 특히 flow_from_directory() 함수가이 트릭을 수행합니다. 이것은 (x, y)의 튜플을 생성합니다. 여기서 x는 이미지의 numpy 배열이고 y는 이미지의 레이블입니다.

내 모델의 입력으로 주어진 numpy 배열에 액세스하는 모델을 예상 했으므로 입력 모양을 다음과 같이 설정했습니다. (없음, 20,40,3) 여기서 None은 배치 크기, 20 및 40입니다. 40은 이미지의 크기이고 3은 이미지의 채널 수입니다. 대상 확인시 오류 : 에 ValueError :이 내가 오류가 계속 내 모델 훈련 할 때 그러나 작동하지 않는 4 차원이 예상 dense_3을하지만 모양으로 배열 얻었다 (1024, 2)

원인은 flow_from_directoy에서 튜플을 얻고 있고 일치하도록 입력 모양을 변경할 수 있다고 생각합니다. 그러나 이미지를 사용하여 예측을 작성하지 않고 사전 분류 된 모델을 사용하지 않으면 내 모델이 쓸모 없게됩니다. 튜플. 그래서 내 질문은, 어떻게 내 모델에 이미지를 먹이기 위해서만 flow_from_directory를 얻을 수 있고 튜플을 사용하여 트레이닝의 유효성을 검사 할 수 있습니까? 내가 여기서 뭔가를 오해하니?

from keras.models import Model 
from keras.layers import * 
from keras.preprocessing.image import ImageDataGenerator 
from keras.callbacks import TensorBoard 

# Prepare the Image Data Generator. 
train_datagen = ImageDataGenerator() 
test_datagen = ImageDataGenerator() 

train_generator = train_datagen.flow_from_directory(
    '/path/to/train_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

test_generator = test_datagen.flow_from_directory(
    '/path/to/test_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

# Define input tensor. 
input_t = Input(shape=(20,40,3)) 

# Now create the layers and pass the input tensor to it. 
hidden_1 = Dense(units=32, activation='relu')(input_t) 
hidden_2 = Dense(units=16)(hidden_1) 
prediction = Dense(units=1)(hidden_2) 

# Now put it all together and create the model. 
model = Model(inputs=input_t, outputs=prediction) 
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 

# Prepare Tensorboard callback and start training. 
tensorboard = TensorBoard(log_dir='./graph', histogram_freq=0, write_graph=True, write_images=True) 
print(test_generator) 
model.fit_generator(
    train_generator, 
    steps_per_epoch=2000, 
    epochs=100, 
    validation_data=test_generator, 
    validation_steps=800, 
    callbacks=[tensorboard] 
) 

# Save trained model. 
model.save('trained_model.h5') 

답변

1

귀하의 입력 형태가 조밀 한 층에 대한 잘못된 것입니다 : 참고로

, 여기에 내 코드입니다.

밀도가 높은 레이어는 입력 된 도형 (없음, 길이)을 필요로합니다.

당신은 그들이 벡터 될 수 있도록 입력을 바꿀해야합니다 중 하나

imageBatch=imageBatch.reshape((imageBatch.shape[0],20*40*3)) 

또는 사용 길쌈 층, 즉 을처럼 입력 형태 (없음, NROWS,으로 ncols, nChannels)의 유형을 기대 tensorflow.