目标和预测向量之间计算的keras余弦相似性度量和余弦相似性之间的差异

2024-06-17 12:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在keras中训练了一个序列模型,稀疏向量作为输入(padded_inputs_multil用于训练和padded_inputs_tr用于测试),密集向量作为输出(target_multil_array用于训练和target_tr_r_array用于测试):

model_mul=keras.models.Sequential()
model_mul.add(keras.layers.LSTM(units=172, batch_input_shape=(None, 29, 22), dropout=0.2, recurrent_dropout=0.2, return_sequences=False))
model_mul.add(Dense(300, activation='tanh')) 

model_mul.compile(loss='cosine_similarity', optimizer='adam', metrics=[tf.keras.metrics.CosineSimilarity(axis=1)])
model_mul.summary()

history_mul=model_mul.fit(padded_inputs_multil, target_multil_array, epochs=1, validation_data=(padded_inputs_tr, target_tr_r_array))

在下面的输出中,我得到了.4607的余弦相似性:

Train on 794870 samples, validate on 199108 samples
Epoch 1/1
794870/794870 [==============================] - 2694s 3ms/step - loss: -0.4678 - cosine_similarity: 0.4522 - 
val_loss: -0.4152 - val_cosine_similarity: 0.4607

但是,当我评估模型时,得到的余弦相似性值较低:

results_mul = model_mul.evaluate(padded_inputs_tr, target_tr_r_array)
print(results_mul)
[-0.4152175833690755, 0.44675499200820923]

然后,更糟糕的问题是:如果我计算预测向量并将其与目标向量进行比较,我得到的平均余弦相似性要低得多(略高于0.40)。我不明白为什么,因为在tensorflow文档中,我发现余弦相似性保持了预测和标签之间的平均余弦相似性

prediction_mul = model_mul.predict(padded_inputs_tr)
column_names = ['prediction_multil', 'target_multil', 'cos_pred_target']
df = pd.DataFrame(columns = column_names)
df['prediction_multil'] = [vec for vec in prediction_mul]
df['target_multil'] = [vec for vec in target_tr_r_array]

def cos_sim(a, b):
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

cos = []
for index, row in df.iterrows():
    # print(cos_sim(row['prediction_multil'], row['target_multil']))
    cos.append(cos_sim(row['prediction_multil'], row['target_multil']))
df['cos_pred_target'] = [value for value in cos]
statistics.mean(df['cos_pred_target'])

你知道我可能做错了什么吗?提前感谢:)


Tags: normtargetdfmodelcos相似性arraytr
1条回答
网友
1楼 · 发布于 2024-06-17 12:23:35

根据cosine_similarity documentation,默认的axis值是axis=-1

正如所回答的hereaxis=-1意味着它将采用最后一个形状轴。所以对于你的例子axis=-1等同于axis=2

因此,结果是在一个轴上计算的损失,在另一个轴上计算的度量

model_mul.compile(loss='cosine_similarity', optimizer='adam', metrics=[tf.keras.metrics.CosineSimilarity(axis=1)])

相关问题 更多 >