2017-11-16 3 views
1

이것은 Python의 Keras 코드입니다. 아래의 코드가 Linux mint에서 실행되면 모든 배치가 완료되지 않습니다. 그것은 항상Keras : 일괄 처리가 완료되지 않았습니다.

1/100 .............. ETA 30:00 Loss .. 
2/100 =........... ETA 29:59 Loss .. 
3/100 ==......... ETA 29:58 Loss .. 
. 
. 
. 
32/100 ==....... ETA 25:00 Loss .. 

같은 32 배치에 중단 (교육이 알 수없는 이유로 중지)

하지만이 코드는 윈도우에서 실행되는 경우,이 100 배치 될 때까지 예상대로 작동합니다. 이 문제의 원인은 무엇입니까?

from __future__ import print_function 

import numpy as np 
import keras 
from keras.models import Sequential 
from keras.layers import Conv2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense 
from keras.layers.noise import AlphaDropout 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import model_from_json 
from keras.layers import Dense, Dropout, Activation 
from keras.preprocessing.text import Tokenizer 
import keras.backend.tensorflow_backend as KTF 
import tensorflow as tf 
import os.path 


f_log = './log' 
f_model = './model/dogvscat' 
model_yaml = 'dogvscat_model.yaml' 
model_filename = 'dogvscat_model.json' 
weights_filename = 'dogvscat_model_weights.hdf5' 

batch_size = 64 
epochs = 15 
nb_validation_samples = 100 

print('Building model...') 


if os.path.isfile(os.path.join(f_model,model_filename)): 
    print('Saved parameters found. I will use this file...') 
    json_string = open(os.path.join(f_model, model_filename)).read() 
    model = model_from_json(json_string) 
    model.summary() 
    model.compile(loss='categorical_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy']) 
    model.load_weights(os.path.join(f_model,weights_filename)) 
else: 
    print('Saved parameters Not found. Creating new model...') 
    model = Sequential() 
    model.add(Conv2D(32, (3, 3), input_shape=(128, 128, 3))) 
    model.add(Activation('selu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 

    model.add(Conv2D(64, (3, 3))) 
    model.add(Activation('selu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 

    model.add(Flatten()) 
    model.add(Dense(64, kernel_initializer='lecun_normal')) 
    model.add(Activation('selu')) 
    model.add(AlphaDropout(0.1)) 
    model.add(Dense(2)) 
    model.add(Activation('softmax')) 

    model.summary() 

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

train_datagen = ImageDataGenerator(
    rescale=1.0/255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 

test_datagen = ImageDataGenerator(rescale=1.0/255) 

train_generator = train_datagen.flow_from_directory(
    'data/train', 
    target_size=(128, 128), 
    batch_size=batch_size, 
    class_mode='categorical', 
    shuffle=True) 

validation_generator = test_datagen.flow_from_directory(
    'data/validation', 
    target_size=(128, 128), 
    batch_size=batch_size, 
    class_mode='categorical', 
    shuffle=True) 

tb_cb = keras.callbacks.TensorBoard(log_dir=f_log, histogram_freq=0) 
cp_cb = keras.callbacks.ModelCheckpoint(filepath = os.path.join(f_model,weights_filename), monitor='val_loss', verbose=1, save_best_only=True, mode='auto') 
cbks = [tb_cb, cp_cb] 

history = model.fit_generator(
    train_generator, 
    steps_per_epoch=nb_validation_samples, 
    epochs=epochs, 
    validation_data=validation_generator, 
    validation_steps=nb_validation_samples, 
    callbacks=cbks 
    ) 

score = model.evaluate_generator(validation_generator, nb_validation_samples) 

print('') 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

json_string = model.to_json()  
open(os.path.join(f_model,model_filename), 'w').write(json_string)  
yaml_string = model.to_yaml()  
open(os.path.join(f_model,model_yaml), 'w').write(yaml_string)  
print('save weights')  
model.save_weights(os.path.join(f_model,weights_filename))  

답변

1

당신은 당신의 코드에서 오류를 가지고, 당신은 당신의 steps_per_epoch, validation_steps 단지 아래와 같이 변경해야합니다. 당신은 내가 그것을 시도했지만있어 획기적인

+0

에 대한 np.ceil(nb_training_samples/batch_size) 단계를 필요로하므로 모든 샘플의 당신의 BATCH_SIZE 단계에

history = model.fit_generator( train_generator, steps_per_epoch=np.ceil(nb_training_samples/batch_size), epochs=epochs, validation_data=validation_generator, validation_steps=np.ceil(nb_validation_samples/batch_size), callbacks=cbks ) 

사용 오류 "nb_training_samples는 diefined되지 않는다". 그래서 그것을 "nb_validation_samples"로 바꿨지 만 에포크 당 스텝 수는 2로 표시됩니다. 에포크 당 스텝 수는 nb_validation_samples (100과 같음)만큼 많지 않아야합니까? – lechien

+0

아니요, 에포크 당 단계 수는 nb_training_samples/batch_size와 같습니다. 먼저 nb_training_samples를 계산해야합니다. –

+0

신기원 당 단계 수를 오판했기 때문에 같을 수도 있습니다. 실제로 나는 클래스 당 2000 개의 샘플을 사용했고 64 개 (배치 크기) * 32 = 2048이므로 32 번째 단계에서 중단되었습니다. 고맙습니다!! – lechien

관련 문제