【问题标题】:Keras custom matric: ROC curveKeras 自定义矩阵:ROC 曲线
【发布时间】:2018-08-25 10:34:06
【问题描述】:

我正在使用 keras 网站上给出的自定义矩阵:

def compute_roc (y_true, y_pred):
    y_true =K.eval(y_true)#.eval(session=sess)
    y_pred = K.eval(y_pred)#.eval(session=sess)
    roc = metrics.roc_curve(y_true, y_pred, pos_label=2)
    roc = tf.to_float(roc, name='ToFloat')
    return roc

但我在“K.eval(y_true)”上遇到错误

    InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-7-1de7569967ec> in <module>()
     20 #disc.load_weights(os.path.join(path, model_name+'.h5'))
     21 sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
---> 22 disc.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy',

compute_roc]) 23 #plot_model(模型,to_file='model.png') 24 print('光盘模型加载')

/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in compile(self, optimizer, loss, metrics, loss_weights,

sample_weight_mode, weighted_metrics, target_tensors, **kwargs) 第912章 913 --> 914 句柄度量(输出度量) 第915章 第916章

/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in handle_metrics(metrics, weights)
    909                             metric_result = weighted_metric_fn(y_true, y_pred,
    910                                                                weights=weights,
--> 911                                                                mask=masks[i])
    912                         append_metric(i, metric_name, metric_result)
    913 

/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in weighted(y_true, y_pred, weights, mask)
    424         """
    425         # score_array has ndim >= 2
--> 426         score_array = fn(y_true, y_pred)
    427         if mask is not None:
    428             # Cast the mask to floatX to avoid float64 upcasting in theano

<ipython-input-7-1de7569967ec> in compute_roc(y_true, y_pred)
      4 
      5 def compute_roc (y_true, y_pred):
----> 6     y_true1 =K.eval(y_true)#.eval(session=sess)
      7    # y_pred1 = K.eval(y_pred)#.eval(session=sess)
      8     roc = 0#metrics.roc_curve(y_true, y_pred, pos_label=2)

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc

在 eval(x) 中 658``` 第659章 --> 660 返回到_dense(x).eval(session=get_session()) 661 第662章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc

在 eval(self, feed_dict, session) 539 第540章 --> 541 返回 _eval_using_default_session(self, feed_dict, self.graph, session) 542 第543章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc

在_eval_using_default_session(张量,feed_dict,图,会话) 4083“张量的图表与会话的不同” 第4084章 -> 4085 返回 session.run(张量,feed_dict) 4086 第4087章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc

在运行中(self、fetches、feed_dict、options、run_metadata) 893尝试: 第894章 --> 895 run_metadata_ptr) 896 如果运行元数据: 第897章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc

in _run(self, handle, fetches, feed_dict, options, run_metadata) 1122 如果 final_fetches 或 final_targets 或(句柄和 feed_dict_tensor): 1123 结果 = self._do_run(句柄,final_targets,final_fetches, -> 1124 feed_dict_tensor,选项,run_metadata) 1125 其他: 1126 个结果 = []

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc

在 _do_run(self, handle, target_list, fetch_list, feed_dict, options, 运行元数据) 1319 如果句柄为无: 第1320章 -> 1321 个选项,run_metadata) 1322 其他: 第1323章 返回self._do_call(_prun_fn,self._session,句柄,提要,获取)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc

在 _do_call(self, fn, *args) 1338 除了 KeyError: 1339通过 -> 1340 raise type(e)(node_def, op, message) 1341 第1342章

InvalidArgumentError: You must feed a value for placeholder tensor 'dense_6_target' with dtype float and shape [?,?]
   [[Node: dense_6_target = Placeholder[dtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
   [[Node: dense_6_target/_833 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0",

send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_dense_6_target", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Caused by op u'dense_6_target', defined at:
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py", line

16,在 app.launch_new_instance() 文件“/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py”, 第 658 行,在 launch_instance app.start() 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/kernelapp.py”,行 478,开始 self.io_loop.start() 文件“/usr/local/lib/python2.7/dist-packages/zmq/eventloop/ioloop.py”,行 177,开始 超级(ZMQIOLoop,自我).start() 文件“/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py”,第 888 行,开始 handler_func(fd_obj,事件) 文件“/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py”, 第 277 行,在 null_wrapper 中 返回 fn(*args, **kwargs) 文件“/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py”, 第 440 行,在 _handle_events 中 self._handle_recv() 文件“/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py”, 第 472 行,在 _handle_recv self._run_callback(回调,味精) 文件“/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py”, 第 414 行,在 _run_callback 回调(*args,**kwargs) 文件“/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py”, 第 277 行,在 null_wrapper 中 返回 fn(*args, **kwargs) 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py”,行 283,在调度程序中 返回 self.dispatch_shell(流,味精) 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py”,行 233,在dispatch_shell中 处理程序(流,身份,味精) 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py”,行 399,在执行请求中 用户表达式,允许标准输入) 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/ipkernel.py”,行 208,在 do_execute res = shell.run_cell(代码,store_history=store_history,silent=silent) 文件“/usr/local/lib/python2.7/dist-packages/ipykernel/zmqshell.py”,行 第537章 return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs) 文件“/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”, 第 2718 行,在 run_cell 中 交互性=交互性,编译器=编译器,结果=结果) 文件“/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”, 第 2822 行,在 run_ast_nodes 如果 self.run_code(代码,结果): 文件“/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”, 第 2882 行,在 run_code 中 执行(code_obj,self.user_global_ns,self.user_ns) 文件“”,第 22 行,在 disc.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy', 计算_roc]) 文件“/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”, 第 722 行,在编译中 dtype=K.dtype(self.outputs[i])) 文件“/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py”, 第 504 行,在占位符中 x = tf.placeholder(dtype, shape=shape, name=name) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/array_ops.py”, 第 1548 行,在占位符中 返回 gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py”, 第 2094 行,在 _placeholder 名称=名称) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py”, 第 767 行,在 apply_op 中 op_def=op_def) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py”, 第 2630 行,在 create_op 中 original_op=self._default_original_op, op_def=op_def) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py”, 第 1204 行,在 init 中 self._traceback = self._graph._extract_stack() # pylint: disable=protected-access

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dense_6_target' with dtype float and

形状 [?,?] [[节点:dense_6_target = Placeholderdtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/gpu:0"]] [[节点:dense_6_target/_833 = _Recvclient_terminated=false,recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_dense_6_target", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]]

另一种方法是在每个 epoch 结束时计算“y_pred”并计算 roc。

【问题讨论】:

  • 从模型中获得预测后,为什么不使用sklearn roc_auc
  • 问题在于:y_true =K.eval(y_true) AND y_pred = K.eval(y_pred)

标签: keras


【解决方案1】:

你有两个选择:

  1. 在自定义Callback (on-epoch_end) 中使用滑雪学习功能。

    在这种情况下,您需要通过将火车生成器传递给回调来获取 batch_x, batch_y,然后通过 model.predict(batch_x) 计算 y_pred (on_batch_begin),然后在 (on_epoch_end) 回调处累积,然后计算 @987654326 @ 使用你的函数。

  2. 使用 tf.meteric auc 在 Keras 中构建自定义指标

    AUC, update_op = tf.metric.auc(y_true, y_pred)

在这种情况下,您不需要为每个批次计算 y_pred。只需构建自定义指标函数并将其传递给回调。您需要确保更新每个批次的 (update_op),因为 Auc 指标需要在 epoch 结束时计算,而不是在批次级别。

您还可以查看 Tom here 的评论,您可以在其中找到上述建议的示例代码。然而,他们指的是 tf.contrib.metrics.streaming_auc 已弃用并被 tf.metric.auc 取代

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2016-01-15
    • 2018-09-23
    • 2019-12-26
    • 2019-02-05
    • 2022-06-15
    • 2016-11-28
    • 2017-08-29
    相关资源
    最近更新 更多