具有三重态损耗的keras中的Nan损耗

具有三重态损耗的keras中的Nan损耗,keras,loss,Keras,Loss,我正在尝试学习结合VGG和。问题是,经过少量迭代后,在第一个历元中,损失变为nan,然后精度和验证精度增长到1 我已经尝试过降低学习速度,增加批处理大小(仅为16个内存),更改优化器(Adam和RMSprop),检查我的数据集上是否没有值,将数据格式从“float32”更改为“float64”,为它们添加一点偏差,并简化模型 这是我的密码: base_model = VGG16(include_top = False, input_shape = (512, 384, 3)) input_ima

我正在尝试学习结合VGG和。问题是,经过少量迭代后,在第一个历元中,损失变为nan,然后精度和验证精度增长到1

我已经尝试过降低学习速度,增加批处理大小(仅为16个内存),更改优化器(Adam和RMSprop),检查我的数据集上是否没有值,将数据格式从“float32”更改为“float64”,为它们添加一点偏差,并简化模型

这是我的密码:

base_model = VGG16(include_top = False, input_shape = (512, 384, 3))
input_images = base_model.input
input_labels = Input(shape=(1,), name='input_label')

embeddings = Flatten()(base_model.output)
labels_plus_embeddings = concatenate([input_labels, embeddings])

model = Model(inputs=[input_images, input_labels], outputs=labels_plus_embeddings)

batch_size = 16
epochs = 2
embedding_size = 64

opt = Adam(lr=0.0001)

model.compile(loss=tl.triplet_loss_adapted_from_tf, optimizer=opt, metrics=['accuracy'])

label_list = np.vstack(label_list)

x_train = image_list[:2500]
x_val = image_list[2500:]

y_train = label_list[:2500]
y_val = label_list[2500:]

dummy_gt_train = np.zeros((len(x_train), embedding_size + 1))
dummy_gt_val = np.zeros((len(x_val), embedding_size + 1))

H = model.fit(
    x=[x_train,y_train],
    y=dummy_gt_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_data=([x_val, y_val], dummy_gt_val),callbacks=callbacks_list)
图像为3366,数值在[0,1]范围内缩放。 该网络采用虚拟值,因为它试图以一种方式从图像中学习嵌入,即同一类别的图像应具有较小的距离,而不同类别的图像应具有较高的距离,并且与真实类别相比,这是训练的一部分

我注意到我以前划分了一个不正确的类(并保留了应该丢弃的图像),我没有nan丢失问题

我应该怎么做


提前感谢并为我的英语道歉。

在某些情况下,随机NaN丢失可能是由您的数据造成的,因为如果批中没有正对,您将得到NaN丢失

正如您在Adrian Ung的笔记本中所看到的(或者在triplet loss中,代码相同):

有一个除以正对数(
num\u positives
)的除法,这可能导致NaN


我建议您尝试检查数据管道,以确保每个批中至少有一个阳性对。(例如,您可以调整来自\u tf的
triplet\u loss\u adapted\u中的一些代码,以获取批处理的
num\u正数
,并检查它是否大于0)。

在某些情况下,随机NaN丢失可能是由您的数据引起的,因为如果批处理中没有正数对,您将得到NaN丢失

正如您在Adrian Ung的笔记本中所看到的(或者在triplet loss中,代码相同):

有一个除以正对数(
num\u positives
)的除法,这可能导致NaN


我建议您尝试检查数据管道,以确保每个批中至少有一个阳性对。(例如,您可以调整来自\u tf
triplet\u loss\u adapted\u中的一些代码,以获得批次的
num\u正值,并检查其是否大于0)。

尝试增加批次大小。这也发生在我身上。如前一个答案中所述,网络无法找到任何num_正值。我上了250节课,一开始我的成绩很差。我把它增加到128/256,然后就没有问题了


我看到Paris6k有15门课或12门课。增加批处理大小32,如果出现GPU内存,您可以尝试使用参数较少的模型。您可以使用高效的B0型号启动。与参数为138M的VGG16相比,其参数为5.3M

尝试增加批处理大小。这也发生在我身上。如前一个答案中所述,网络无法找到任何num_正值。我上了250节课,一开始我的成绩很差。我把它增加到128/256,然后就没有问题了

我看到Paris6k有15门课或12门课。增加批处理大小32,如果出现GPU内存,您可以尝试使用参数较少的模型。您可以使用高效的B0型号启动。与参数为138M的VGG16相比,其参数为5.3M

semi_hard_triplet_loss_distance = math_ops.truediv(
        math_ops.reduce_sum(
            math_ops.maximum(
                math_ops.multiply(loss_mat, mask_positives), 0.0)),
        num_positives,
        name='triplet_semihard_loss')