How can I use tensorflow metric function within keras models?

2024/11/14 13:56:38

using python 3.5.2 tensorflow rc 1.1

I'm trying to use a tensorflow metric function in keras. the required function interface seems to be the same, but calling:

import pandas
import numpy
import tensorflow.contrib.keras as keras
import tensorflowdef 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)

results with the error:

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 compilemetric_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 maskedreturn K.mean(score_array)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 1120, in meanaxis = _normalize_axis(axis, ndim(x))File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 437, in ndimdims = x.get_shape()._dims
AttributeError: 'tuple' object has no attribute 'get_shape'Process finished with exit code 1

EDIT

After incoporating the suggestion from Marcin Możejko

The code is:

import pandas
import numpy
import tensorflow.contrib.keras as keras
import tensorflowdef 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)

and the error is:

/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_callreturn fn(*args)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1033, in _run_fnstatus, 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_statuspywrap_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 fitinitial_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_loopouts = 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 runrun_metadata_ptr)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 994, in _runfeed_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_runtarget_list, options, run_metadata)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1064, in _do_callraise 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 compilemetric_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 maskedscore_array = fn(y_true, y_pred)File "/Users/ophir/dev/ophir/tf_keras_metrics.py", line 8, in metric_functionreturn 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 precisionupdates_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_positivesupdates_collections)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/ops/metrics_impl.py", line 1211, in _count_conditioncount = _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_localvalidate_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_argsself._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 identityresult = _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_opop_def=op_def)File "/Users/ophir/anaconda3/envs/p3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2336, in create_oporiginal_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
Answer

Ok - I think I found an error. This funtion returns a tuple with (auc, other stuff). You need to overcome this by defying your own auc by:

def auc_tf_metric(y_true, y_pred):return tensorflow.metrics.auc(y_true, y_pred)[0]
https://en.xdnf.cn/q/72290.html

Related Q&A

Pandas return the next Sunday for every row

In Pandas for Python, I have a data set that has a column of datetimes in it. I need to create a new column that has the date of the following Sunday for each row. Ive tried various methods trying to u…

Where is `_softmax_cross_entropy_with_logits` defined in tensorflow?

I am trying to see how softmax_cross_entropy_with_logits_v2() is implemented. It calls _softmax_cross_entropy_with_logits(). But I dont see where the latter is defined. Does anybody know how to locate …

Python: Counting frequency of pairs of elements in a list of lists

Actually, I have a dataset about a "meeting". For example, A,B,C have a meeting, then the list would be [A,B,C]. Like this, each list would contain a list of members who participated in the …

How to create a pandas dataframe where columns are filled with random strings?

I want to create a Pandas dataframe with 2 columns and x number rows that contain random strings. I have found code to generate a pandas dataframe with random ints and a random stringer generator. I st…

Unable to make my script process locally created server response in the right way

Ive used a script to run selenium locally so that I can make use of the response (derived from selenium) within my spider.This is the web service where selenium runs locally:from flask import Flask, re…

using variable in a url in python

Sorry for this very basic question. I am new to Python and trying to write a script which can print the URL links. The IP addresses are stored in a file named list.txt. How should I use the variable in…

Create dynamic updated graph with Python

I need to write a script in Python that will take dynamically changed data, the source of data is not matter here, and display graph on the screen. I know how to use matplotlib, but the problem with m…

Converting a nested dictionary to a list

I know there are many dict to list questions on here but I cant quite find the information I need for my situation so Im asking a new quetion.Some background: Im using a hierarchical package for my mod…

Pandas dataframe : Operation per batch of rows

I have a pandas DataFrame df for which I want to compute some statistics per batch of rows. For example, lets say that I have a batch_size = 200000. For each batch of batch_size rows I would like to ha…

Combining grid/pack Tkinter

I know there have been many questions on grid and pack in the past but I just dont understand how to combine the two as Im having difficulties expanding my table in both directions (row/column).Buttons…