我在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,
)
在某些类型的网络中,二进制输出只是一个,它表示第一类训练数据。我们假设您的训练数据如下:
img1data, class1
img2data, class1
..
imgNdata, class2
您的网络已接受class1作为默认类,给定的结果是该类的分数。所以这些结果显示了第一班的分数。
[[0.45415235]
[0.52390164]
[0.9999932 ]
[0.99946016]]
由于二元分类,第一个结果显示类1的分数是0.45,所以类2必须是0.55,图像属于类2。最后的结果显示,class1的分数是0.999,所以class2必须是0.0006,图像属于class1。等等…
你可以写一个方法来进行这些操作,并找到图像所属的类
def find_class(result):
if result >= 0.5:
return "class1"
else:
return "class2"
find_class(result[0])
您的行output = Dense(1, activation='sigmoid')(output)
仅指定一个输出概率。你需要两个像softmax一样的神经元来指示你想做什么。