2017-04-01 144 views
2

使用python 3.5.2 tensorflow rc 1.1如何在keras模型中使用tensorflow度量函数?

我想在keras中使用张量流量度量函数。所需要的功能界面似乎是相同的,但呼吁:

import pandas 
import numpy 
import tensorflow.contrib.keras as keras 
import tensorflow 


def target_function(row): 
    return float(row[0] - row[1] < 0.5) 

df = pandas.DataFrame(numpy.random.rand(10000,2)) 
label = df.apply(target_function, axis=1) 

input_layer = keras.layers.Input(shape=(2,)) 
net = keras.layers.Dense(1)(input_layer) 

model = keras.models.Model(inputs=[input_layer], outputs=[net]) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[tensorflow.metrics.auc]) 

model.fit(df.as_matrix(), label.as_matrix(), epochs=10, validation_split=0.2, batch_size=100) 

结果与错误:

Using TensorFlow backend. 
Traceback (most recent call last): 
    File "/Users/ophir/dev/ophir/tf_keras_metrics.py", line 49, in <module> 
    metrics=[precision, recall, tensorflow.metrics.auc] 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/engine/training.py", line 956, in compile 
    metric_result = masked_metric_fn(y_true, y_pred, mask=masks[i]) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/engine/training.py", line 489, in masked 
    return K.mean(score_array) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 1120, in mean 
    axis = _normalize_axis(axis, ndim(x)) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 437, in ndim 
    dims = x.get_shape()._dims 
AttributeError: 'tuple' object has no attribute 'get_shape' 

Process finished with exit code 1 

编辑

从马尔辛Możejko

incoporating的建议后代码是:

import pandas 
import numpy 
import tensorflow.contrib.keras as keras 
import tensorflow 


def metric_function(y_true, y_pred): 
    return tensorflow.metrics.precision(y_true,y_pred)[0] 


def target_function(row): 
    return float(row[0] - row[1] < 0.5) 

df = pandas.DataFrame(numpy.random.rand(10000,2)) 
label = df.apply(target_function, axis=1) 

input_layer = keras.layers.Input(shape=(2,)) 
net = keras.layers.Dense(1)(input_layer) 

model = keras.models.Model(inputs=[input_layer], outputs=[net]) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[metric_function]) 

model.fit(df.as_matrix(), label.as_matrix(), epochs=10, validation_split=0.2, batch_size=100) 

和错误是:

/Users/ophir/anaconda3/envs/p3/bin/python /Users/ophir/dev/ophir/tf_keras_metrics.py 
Train on 8000 samples, validate on 2000 samples 
Epoch 1/10 
2017-04-04 16:05:30.959006: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations. 
2017-04-04 16:05:30.959022: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. 
2017-04-04 16:05:30.959026: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations. 
2017-04-04 16:05:30.959031: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations. 
2017-04-04 16:05:31.124262: W tensorflow/core/framework/op_kernel.cc:1152] Failed precondition: Attempting to use uninitialized value precision/true_positives/count 
    [[Node: precision/true_positives/count/read = Identity[T=DT_FLOAT, _class=["loc:@precision/true_positives/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](precision/true_positives/count)]] 
Traceback (most recent call last): 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1051, in _do_call 
    return fn(*args) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1033, in _run_fn 
    status, run_metadata) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/contextlib.py", line 66, in __exit__ 
    next(self.gen) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status 
    pywrap_tensorflow.TF_GetCode(status)) 
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value precision/true_positives/count 
    [[Node: precision/true_positives/count/read = Identity[T=DT_FLOAT, _class=["loc:@precision/true_positives/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](precision/true_positives/count)]] 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Users/ophir/dev/ophir/tf_keras_metrics.py", line 23, in <module> 
    model.fit(df.as_matrix(), label.as_matrix(), epochs=10, validation_split=0.2, batch_size=100) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/contrib/keras/python/keras/engine/training.py", line 1494, in fit 
    initial_epoch=initial_epoch) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/contrib/keras/python/keras/engine/training.py", line 1138, in _fit_loop 
    outs = f(ins_batch) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/contrib/keras/python/keras/backend.py", line 2245, in __call__ 
    updated = session.run(self.outputs + [self.updates_op], feed_dict=feed_dict) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 786, in run 
    run_metadata_ptr) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 994, in _run 
    feed_dict_string, options, run_metadata) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1044, in _do_run 
    target_list, options, run_metadata) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1064, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value precision/true_positives/count 
    [[Node: precision/true_positives/count/read = Identity[T=DT_FLOAT, _class=["loc:@precision/true_positives/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](precision/true_positives/count)]] 

Caused by op 'precision/true_positives/count/read', defined at: 
    File "/Users/ophir/dev/ophir/tf_keras_metrics.py", line 21, in <module> 
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[metric_function]) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/contrib/keras/python/keras/engine/training.py", line 958, in compile 
    metric_result = masked_metric_fn(y_true, y_pred, mask=masks[i]) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/contrib/keras/python/keras/engine/training.py", line 487, in masked 
    score_array = fn(y_true, y_pred) 
    File "/Users/ophir/dev/ophir/tf_keras_metrics.py", line 8, in metric_function 
    return tensorflow.metrics.precision(y_true,y_pred)[0] 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/metrics_impl.py", line 1377, in precision 
    updates_collections=None, name=None) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/metrics_impl.py", line 1274, in true_positives 
    updates_collections) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/metrics_impl.py", line 1211, in _count_condition 
    count = _create_local('count', shape=[]) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/metrics_impl.py", line 197, in _create_local 
    validate_shape=validate_shape) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/variables.py", line 197, in __init__ 
    expected_shape=expected_shape) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/variables.py", line 316, in _init_from_args 
    self._snapshot = array_ops.identity(self._variable, name="read") 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1343, in identity 
    result = _op_def_lib.apply_op("Identity", input=input, name=name) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py", line 768, in apply_op 
    op_def=op_def) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2336, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1228, in __init__ 
    self._traceback = _extract_stack() 

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value precision/true_positives/count 
    [[Node: precision/true_positives/count/read = Identity[T=DT_FLOAT, _class=["loc:@precision/true_positives/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](precision/true_positives/count)]] 

Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.Session object at 0x1140626d8>> 
Traceback (most recent call last): 
    File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 595, in __del__ 
AttributeError: 'NoneType' object has no attribute 'TF_NewStatus' 

Process finished with exit code 1 
+0

你能否提供你的“模型”定义? –

+0

添加了一个虚拟代码片段,可以重现问题 –

+0

您可以尝试:'model = keras.models.Model(inputs = input_layer,outputs = net)'? –

回答

2

好了 - 我想我发现了一个错误。此函数返回tuple(auc, other stuff)。你需要通过藐视自己auc通过解决此问题:

def auc_tf_metric(y_true, y_pred): 
    return tensorflow.metrics.auc(y_true, y_pred)[0] 
+1

现在我得到: FailedPreconditionError(请参阅上面的回溯):尝试使用未初始化的值auc/true_positives \t [[Node:auc/true_positives/read = Identity [T = DT_FLOAT,_class = [“loc:@ auc/true_positives “],_device =”/ job:localhost/replica:0/task:0/cpu:0“](auc/true_positives)]] –

+0

现在工作吗? –

+0

它失败了,但在不同的地方 –

0

关于新的错误:一般来说,当tf.global_variables_initializer()在会话跑FailedPreconditionsErrors发生。确保你没有忘记它。

+0

试过了,没有帮助 –

+0

这个修正https://github.com/fchollet/keras/issues/4402解决了'FailedPreconditionsError'。但是,无论我使用的是哪种度量标准,我都会得到0的值。 –