【发布时间】:2020-07-09 10:12:31
【问题描述】:
我已经在 Keras 中实现了一个 EfficientNet,用于使用图像生成器解决二进制问题。在测试用例中,当我预测输出时,它返回一个具有一组概率但只引用一个类的数组,这里是代码和输出:
test_image_generator = ImageDataGenerator(
rescale=1./255
)
real_test=test_image_generator.flow_from_directory(
directory='/content/real_test',
target_size=(224, 224),
color_mode="rgb",
batch_size=1,
class_mode=None,
shuffle=False,
#seed=42
)
输出是:
real_test.reset()
from keras.models import load_model
efficient_net_custom_model = load_model('model_efficientnet4.h5',compile=False)
pred = efficient_net_custom_model.predict_(real_test, steps = len(real_test), verbose = 1)
print (pred)
现在,当打印 4 个不同图像的预测时,它会返回:
[[0.45415235]
[0.52390164]
[0.9999932 ]
[0.99946016]]
每个图像基本上只有一个输出概率(我认为),并且无法说哪个是实际的类。不是吗? 我该如何解决这个问题?
谢谢
编辑:
包括型号代码
def output_custom_model(prebuilt_model):
print(f"Processing {prebuilt_model}")
prebuilt = prebuilt_model(include_top=False,
input_shape=(224, 224, 3),
weights='imagenet')
output = prebuilt.output
output = GlobalMaxPooling2D()(output)
output = Dense(128, activation='relu')(output)
output = Dropout(0.2)(output)
output = Dense(1, activation='sigmoid')(output)
model = Model(inputs=prebuilt.input, outputs=output)
model.compile(optimizer='sgd', loss='binary_crossentropy',
metrics=METRICS)
return model
efficient_net_custom_model = output_custom_model(EfficientNetB4)
filepath='model_efficientnet4.h5'
efficient_net_history =
efficient_net_custom_model.fit_generator(train_generator,
epochs=20,
validation_data=validation_generator,
)
【问题讨论】:
-
可以把模型定义代码放上来吗?你可能有 4 个输出层或一个辅助输出
-
对于二元问题,您的输出是介于 0 和 1 之间的概率,高是一类,0 是另一类。如果你想要 2 个,则必须在最后一个密集层上放置 2 个神经元
-
@fflpdqqoeit 为此,您必须将生成器中的 class_mode 设置为默认的“分类”。使用单个值,您可以将其四舍五入到最接近的 int(0 或 1)并将其视为两个类。
-
如果你设置class_mode='categorical',你应该放两个神经元,如果你放1个神经元(Dense(1)),你必须设置class_mode='binary'。您可以在文档keras.io/api/preprocessing/image 中了解更多信息
-
你的损失仍然是二元('binary_crossentropy')设置为'categorical_crossentropy'
标签: python keras efficientnet