0

我有一个基于ResNet. 我正在使用 25k 类似类型的图像。我的图像有文字和一些图表。当我使用欧几里得距离 + 二元损失时,我得到了 95% 的准确度,Inception但与 Triplet Hard/Semi Hard Loss 相同,我得到了损失,准确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,x_col='path',y_col='label',class_mode='sparse',target_size=(224,224),
                                       batch_size=batch_size,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样子是这样的:

在此处输入图像描述

4

1 回答 1

0

增加批量大小以减少不包括任何三元组的小批量的概率。

编辑:我发布了一个生成 TF/Keras 平衡批次的包来解决这个问题https://github.com/ma7555/kerasgen

于 2021-12-17T00:19:37.843 回答