python - TypeError:获取参数 0 的类型无效, 必须是字符串或张量
问题描述
我正在尝试使用 TKipf GCN 模型https://github.com/tkipf/gcn将自定义指标(精度、召回率和 f1)添加到我的运行中。我为这些指标构建了屏蔽函数,当我尝试将它们集成到评估方法中的 tf.session.run 调用中时,我收到了这个错误:TypeError: Fetch argument 0 has invalid type <class 'int'>, must be字符串或张量。(不能将 int 转换为张量或操作。
我检查了其他标题相似的帖子,但我没有使用重复的变量名。这是引发错误的代码:
评价功能:
# Define model evaluation function
def evaluate(features, support, labels, mask, placeholders, sess, model):
t_test = time.time()
feed_dict_val = construct_feed_dict(features, support, labels, mask, placeholders)
outs_val = sess.run([model.loss, model.accuracy, model.precision, model.recall, model.f1], feed_dict=feed_dict_val)
return outs_val[0], outs_val[1], (time.time() - t_test), outs_val[2], outs_val[3], outs_val[4]
只是model.loss和model.accuracy时没有抛出错误,而是在我添加model.precision,model.recall和model.f1时
以下是5个相关功能供参考:
损失和准确性(最初在那里):
def masked_softmax_cross_entropy(preds, labels, mask):
"""Softmax cross-entropy loss with masking."""
loss = tf.nn.softmax_cross_entropy_with_logits(logits=preds, labels=labels)
mask = tf.cast(mask, dtype=tf.float32)
mask /= tf.reduce_mean(mask)
loss *= mask
return tf.reduce_mean(loss)
def masked_accuracy(preds, labels, mask):
"""Accuracy with masking."""
correct_prediction = tf.equal(tf.argmax(preds, 1), tf.argmax(labels, 1))
accuracy_all = tf.cast(correct_prediction, tf.float32)
mask = tf.cast(mask, dtype=tf.float32)
mask /= tf.reduce_mean(mask)
accuracy_all *= mask
return tf.reduce_mean(accuracy_all)
精度、召回率和 f1(我的函数):
def masked_precision(preds, labels, mask):
preds_ints = tf.argmax(preds, 1)
labels_ints = tf.argmax(labels, 1)
mask = tf.cast(mask, dtype=tf.float32)
trueposlayer = keras.metrics.TruePositives()
trueposlayer.update_state(labels_ints, preds_ints, sample_weight=mask)
truepos = trueposlayer.result().numpy()
falseposlayer = keras.metrics.FalsePositives()
falseposlayer.update_state(labels_ints,preds_ints, sample_weight=mask)
falsepos = falseposlayer.result().numpy()
return tf.convert_to_tensor(calc_precision(truepos, falsepos))
def masked_recall(preds, labels, mask):
preds_ints = tf.argmax(preds, 1)
labels_ints = tf.argmax(labels, 1)
mask = tf.cast(mask, dtype=tf.float32)
trueposlayer = keras.metrics.TruePositives()
trueposlayer.update_state(labels_ints, preds_ints, sample_weight=mask)
truepos = trueposlayer.result().numpy()
falseneglayer = keras.metrics.FalseNegatives()
falseneglayer.update_state(labels_ints,preds_ints, sample_weight=mask)
falseneg = falseneglayer.result().numpy()
return tf.convert_to_tensor(calc_recall(truepos, falseneg))
def masked_f1_score(preds, labels, mask):
preds_ints = tf.argmax(preds, 1)
labels_ints = tf.argmax(labels, 1)
mask = tf.cast(mask, dtype=tf.float32)
trueposlayer = keras.metrics.TruePositives()
trueposlayer.update_state(labels_ints, preds_ints, sample_weight=mask)
truepos = trueposlayer.result().numpy()
falseposlayer = keras.metrics.FalsePositives()
falseposlayer.update_state(labels_ints,preds_ints, sample_weight=mask)
falsepos = falseposlayer.result().numpy()
falseneglayer = keras.metrics.FalseNegatives()
falseneglayer.update_state(labels_ints,preds_ints, sample_weight=mask)
falseneg = falseneglayer.result().numpy()
recall = calc_recall(truepos, falseneg)
precision = calc_precision(truepos, falsepos)
return tf.convert_to_tensor(2*((precision*recall)/(precision+recall)))
解决方案
推荐阅读
- python - 如何知道会话是否已结束并使用 pcap 数据开始新会话
- mysql - 如何在 IF 语句中使用 INSERT INTO SELECT ON DUPLICATE KEY UPDATE
- laravel - Laravel websocket - 使用 laravel 作为后端开发移动聊天应用程序
- python-3.x - PyCharm Django docker-compose 未解析的参考模型
- javascript - 在javascript中编辑innerhtml后如何更新页面
- angular - 如何触发页面刷新以更新 UI 中同级组件中的值更改
- android - 从 firebase 数据库中检索多个纬度经度
- json - 为什么我无法从 JSON.stringify POST 数据中获取 $this->post() 值
- python - 为什么在 python 中使用 LSTM 没有显示预测值
- api - 为大于 25 MB 的文件直接生成下载链接(没有病毒扫描弹出窗口)