【发布时间】:2018-02-04 15:04:58
【问题描述】:
我正在使用 keras 应用程序通过 resnet 50 和 inception v3 进行迁移学习,但是在预测时总是得到 [[ 0.]]
以下代码用于二进制分类问题。我也尝试过 vgg19 和 vgg16 但它们工作正常,它只是 resnet 和 inception。数据集是 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 和 inception 却不行。这些模型是否需要其他东西才能工作?
任何见解都会很棒。
提前致谢。
【问题讨论】:
-
如何进行预处理?我在您的代码中没有看到它,这可能是您获得这些结果的原因。您需要从 Inception3 或 ResNet 导入适当的预处理函数并使用它来准备您的图像(即
from inception_v3 import InceptionV3, preprocess_input)。 -
您还需要从生成器中删除
rescale=1. / 255。否则图像数组将被重新缩放两次。 (inception_v3.preprocess_input()已经为你完成了) -
谢谢 我试试这个,preprocessing_input 还有什么作用?我找不到任何文档。
-
在预测步骤中,
x = img_to_array(img) print(x)打印的值是否介于 0 和 255 之间?
标签: python tensorflow keras conv-neural-network resnet