我在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'])
你知道我可能做错了什么吗?提前感谢:)
根据cosine_similarity documentation,默认的
axis
值是axis=-1
正如所回答的here
axis=-1
意味着它将采用最后一个形状轴。所以对于你的例子axis=-1
等同于axis=2
因此,结果是在一个轴上计算的损失,在另一个轴上计算的度量:
相关问题 更多 >
编程相关推荐