问题描述
常规说明:我的代码工作正常,但结果是有线的.我不知道问题出在哪里
General Explanation:My codes work fine, but the results are wired. I don't know the problem is with
- 网络结构,
- 或我将数据馈送到网络的方式
- 或其他任何东西.
我已经为这个错误苦苦挣扎了好几个星期,到目前为止,我已经更改了损失函数,优化器,数据生成器等,但是我无法解决.感谢您的帮助.如果以下信息还不够,请告诉我.
I am struggling with this error several weeks and so far I have changed the loss function, optimizer, data generator, etc., but I could not solve it. I appreciate any help.If the following information is not enough, let me know, please.
研究领域:我正在使用tensorflow,keras进行多类分类.数据集具有36个二进制人类属性.我使用过resnet50,然后针对身体的每个部分(头部,上半身,下半身,鞋子,配件),向网络添加了一个单独的分支.该网络具有1个具有36个标签的输入图像和36个输出节点(具有S型激活的36个Denes层).
Field of study:I am using tensorflow, keras for multiclass classification. The dataset has 36 binary human attributes. I have used resnet50, then for each part of the body (head, upper body, lower body, shoes, accessories), I have added a separated branch to the network. The network has 1 input image with 36 labels and 36 output nodes (36 denes layers with sigmoid activation).
问题:问题在于,keras报告的准确性很高,但对于大多数输出,f1-score却很低或为零(即使当我在编译网络时使用f1-score作为度量标准,用于验证的f1-socre仍为非常糟糕).
Problem:The problem is that the accuracy that keras is reporting is high, but f1-score is very low or zero for most of the outputs (even when I use f1-score as a metric when compiling the network, the f1-socre for validation is very bad).
a训练后,当我在预测模式下使用网络时,对于某些班级,它始终返回1/0.这意味着网络无法学习(即使使用加权损失函数或焦点损失函数也是如此).
aAfter train, when I use the network in prediction mode, it returns always one/zero for some classes. It means that the network is not able to learn (even when I use weighted loss function or focal loss function.)
为什么很奇怪?因为,即使在第一个时期之后,最新的方法仍会报告高f1分数(例如 https://github.com/chufengt/iccv19_attribute ,表明我已经在PC上运行它,并且经过一个纪元后获得了不错的结果.
Why it is weird? Because, state-of-the-art methods report heigh f1 score even after the first epoch (e.g. https://github.com/chufengt/iccv19_attribute, that I have run it in my PC and got good results after one epoch).
部分代码:
print("setup model ...")
input_image = KL.Input(args.img_input_shape, name= "input_1")
C1, C2, C3, C4, C5 = resnet_graph(input_image, architecture="resnet50", stage5=False, train_bn=True)
output_layers = merged_model (input_features=C4)
model = Model(inputs=input_image, outputs=output_layers, name='SoftBiometrics_Model')
...
print("model compiling ...")
OPTIM = optimizers.Adadelta(lr=args.learning_rate, rho=0.95)
model.compile(optimizer=OPTIM, loss=binary_focal_loss(alpha=.25, gamma=2), metrics=['acc',get_f1])
plot_model(model, to_file='model.png')
...
img_datagen = ImageDataGenerator(rotation_range=6, width_shift_range=0.03, height_shift_range=0.03, brightness_range=[0.85,1.15], shear_range=0.06, zoom_range=0.09, horizontal_flip=True, preprocessing_function=preprocess_input_resnet, rescale=1/255.)
img_datagen_test = ImageDataGenerator(preprocessing_function=preprocess_input_resnet, rescale=1/255.)
def multiple_outputs(generator, dataframe, batch_size, x_col):
Gen = generator.flow_from_dataframe(dataframe=dataframe,
directory=None,
x_col = x_col,
y_col = args.Categories,
target_size = (args.img_input_shape[0],args.img_input_shape[1]),
class_mode = "multi_output",
classes=None,
batch_size = batch_size,
shuffle = True)
while True:
gnext = Gen.next()
# return image batch and 36 sets of lables
labels = gnext[1]
output_dict = {"{}_output".format(Category): np.array(labels[index]) for index, Category in enumerate(args.Categories)}
yield {'input_1':gnext[0]}, output_dict
trainGen = multiple_outputs (generator = img_datagen, dataframe=Train_df_img, batch_size=args.BATCH_SIZE, x_col="Train_Filenames")
testGen = multiple_outputs (generator = img_datagen_test, dataframe=Test_df_img, batch_size=args.BATCH_SIZE, x_col="Test_Filenames")
STEP_SIZE_TRAIN = len(Train_df_img["Train_Filenames"]) // args.BATCH_SIZE
STEP_SIZE_VALID = len(Test_df_img["Test_Filenames"]) // args.BATCH_SIZE
...
print("Fitting the model to the data ...")
history = model.fit_generator(generator=trainGen,
epochs=args.Number_of_epochs,
steps_per_epoch=STEP_SIZE_TRAIN,
validation_data=testGen,
validation_steps=STEP_SIZE_VALID,
callbacks= [chekpont],
verbose=1)
推荐答案
您可能会将f1二进制代码传递给 compile
函数.这应该可以解决问题-
There is a possibility that you are passing binary f1-score to compile
function. This should fix the problem -
pip install tensorflow-addons
...
import tensorflow_addons as tfa
f1 = tfa.metrics.F1Score(36,'micro' or 'macro')
model.compile(...,metrics=[f1])
您可以阅读有关如何计算f1-micro和f1-macro以及如何使用它们的更多信息此处.
You can read more about how f1-micro and f1-macro is calculated and which can be useful here.
这篇关于Tensorflow,Keras:在多类别分类中,准确性很高,但大多数类别的准确性,召回率和f1得分均为零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!