2017-08-26 324 views
1

我使用keras申请转移与RESNET 50和V3开始学习,但一直在预测得到[[ 0.]]Keras model.predict始终为0

下面的代码是一个二元分类问题的时候。我也尝试过vgg19和vgg16,但它们工作正常,它的正确资源和初始。数据集是50/50分割。而且我只更改每个模型的model = applications.resnet50.ResNet50代码行。

下面

是代码:

from keras.callbacks import EarlyStopping 
early_stopping = EarlyStopping(monitor='val_loss', patience=2) 

img_width, img_height = 256, 256 
train_data_dir = xxx 
validation_data_dir = xxx 
nb_train_samples = 14000 
nb_validation_samples = 6000 
batch_size = 16 
epochs = 50 

if K.image_data_format() == 'channels_first': 
    input_shape = (3, img_width, img_height) 
else: 
    input_shape = (img_width, img_height, 3) 

model = applications.resnet50.ResNet50(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3)) 


    from keras.callbacks import EarlyStopping 
early_stopping = EarlyStopping(monitor='val_loss', patience=2) 

img_width, img_height = 256, 256 
train_data_dir = xxx 
validation_data_dir = xxx 
nb_train_samples = 14000 
nb_validation_samples = 6000 
batch_size = 16 
epochs = 50 

if K.image_data_format() == 'channels_first': 
    input_shape = (3, img_width, img_height) 
else: 
    input_shape = (img_width, img_height, 3) 

model = applications.resnet50.ResNet50(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3)) 


#Freeze the layers which you don't want to train. Here I am freezing the first 5 layers. 
for layer in model.layers[:5]: 
    layer.trainable = False 

#Adding custom Layers 
x = model.output 
x = Flatten()(x) 
x = Dense(1024, activation="relu")(x) 
x = Dropout(0.5)(x) 
#x = Dense(1024, activation="relu")(x) 
predictions = Dense(1, activation="sigmoid")(x) 

# creating the final model 
model_final = Model(input = model.input, output = predictions) 

# compile the model 
model_final.compile(loss = "binary_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"]) 


# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 

test_datagen = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 

train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='binary') 

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='binary') 

# Save the model according to the conditions 
#checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) 
#early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto') 



model_final.fit_generator(
    train_generator, 
    steps_per_epoch=nb_train_samples // batch_size, 
    epochs=epochs, 
    validation_data=validation_generator, 
    validation_steps=nb_validation_samples // batch_size, 
    callbacks=[early_stopping]) 



from keras.models import load_model 
import numpy as np 
from keras.preprocessing.image import img_to_array, load_img 

#test_model = load_model('vgg16_1.h5') 
img = load_img('testn7.jpg',False,target_size=(img_width,img_height)) 
x = img_to_array(img) 
x = np.expand_dims(x, axis=0) 
#preds = model_final.predict_classes(x) 
prob = model_final.predict(x, verbose=0) 
#print(preds) 
print(prob) 

注意model_final.evaluate_generator(validation_generator, nb_validation_samples)提供了诸如80%的预期准确性它只是预测,始终是0

只是觉得奇怪,vgg19和vgg16做工精细但不resnet50和成立。这些模型是否需要别的东西来工作?

任何见识都会很棒。

在此先感谢。

+0

你如何做你的预处理?我在你的代码中看不到它,这可能是你获得这些结果的原因。您需要从Inception3或ResNet导入适当的预处理函数,并使用它来准备图像(即从inception_v3导入InceptionV3,preprocess_input')。 – petezurich

+0

还需要删除'rescale = 1。/255'。否则,图像数组将重新调整两次。 ('inception_v3.preprocess_input()'已经为你完成了) –

+0

谢谢我会试试这个,preprocessing_input还有什么功能呢?我找不到任何文档。 – Stig

回答

0

谢谢! preprocessing_input()作品:)

+0

你可以[编辑]你的答案来解释* preprocessing_input()是如何工作的?它有什么作用?你是怎么称呼它的? –

0

我遇到了类似的问题。训练期间,您将所有RGB值从0-255缩放到0-1。

在预测时应该做同样的事情。 尝试 x = img_to_array(img) x = x/255