基于 ResnetTensorflow Keras的 Siamese 模型在使用 TripletHardLossSemi 也是时在训练中提供 `nan` 验证损失

问题描述

我有一个基于 resnet 构建的模型。我正在使用 25k 类似类型的图像。我的图片文字和一些图表。当我使用欧几里得距离 + 二元损失时,Inception 的准确率为 95%,但三重硬/半硬损失给了我 nan 损失和几乎 0 的准确率。如果代码结构有问题,请告诉我。

import tensorflow_addons as tfa
from tensorflow.keras.applications.resnet50 import preprocess_input as res50_pre,resnet50

shape = (224,224,3)
lr = 0.001
loss = tfa.losses.TripletSemiHardLoss()
epochs = 50
batch_size = 128 #254 gives 'log' referenced before assignment error


datagen = ImageDataGenerator(preprocessing_function=res50_pre,validation_split=0.2)

train_data = datagen.flow_from_dataframe(df,x_col='path',y_col='label',class_mode='sparse',target_size=(224,224),batch_size=batch_size,subset='training',seed=SEED)

val_data = datagen.flow_from_dataframe(df,subset='validation',seed=SEED)


base_model = resnet50(weights='imagenet',input_shape=shape,include_top=False,pooling='avg')
base_model.trainable = True

inputs = keras.Input(shape=shape)
x = base_model(inputs,training=True)
outputs = keras.layers.Lambda(lambda x: tf.math.l2_normalize(x,axis=1))(x) # L2 normalize embeddings
model = keras.Model(inputs,outputs)

for layer in model.layers: # set all the parameters trainable
    layer.trainable = True
    
model.compile(optimizer=tf.keras.optimizers.Adam(lr),loss=loss,metrics=['accuracy'])

history = model.fit(train_data,epochs=epochs,steps_per_epoch=len(train_data)//batch_size,validation_data=val_data,verbose=2)

我的 group 有像 1,2,3 [无序且有些缺失] 之类的值,它们代表相同类型的数据。我在将值转换为 Sparse 等后使用了 str(1),str(3)

我的 DataFrame 看起来像这样:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)