Reputation: 467
I am creating an estimator with numpy array to feed to model with using tf.estimator.inputs.numpy_input_fn
. Like the following:
def input_fun(data):
x, y = data
x, y = np.reshape(x, (batch_size, -1, 1)), \
np.reshape(y, (batch_size, -1, 1))
return tf.estimator.inputs.numpy_input_fn({'x': x}, y)
def forward(x, params, mode):
layers = [tf.nn.rnn_cell.LSTMCell(n_neurons) for _ in range(n_layers)]
cells = tf.nn.rnn_cell.MultiRNNCell(layers)
outputs, state = tf.nn.dynamic_rnn(cells, x)
predictions = ...
return predictions
def model_fn(features, labels, mode, params):
predict = forward(features, params, mode)
return tf.estimator.EstimatorSpec(predict , ...)
def experiment_fn(config, params):
return learn.Experiment(
estimator = estimator(model_fn,...),
train_input_fn = lambda: input_fun(train_set),
eval_input_fn = lambda: input_fun(eval_set))
It throws the following:
Traceback (most recent call last):
File "", line 1, in runfile('/Experiment.py', wdir='/TensorFlow')
File "C:\Users\hp\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 710, in runfile execfile(filename, namespace)
File "C:\Users\hp\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile exec(compile(f.read(), filename, 'exec'), namespace)
File "/Experiment.py", line 490, in hparams = params
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\contrib\learn\python\learn\learn_runner.py", line 218, in run return _execute_schedule(experiment, schedule)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\contrib\learn\python\learn\learn_runner.py", line 46, in _execute_schedule return task()
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\contrib\learn\python\learn\experiment.py", line 367, in train hooks=self._train_monitors + extra_hooks)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\contrib\learn\python\learn\experiment.py", line 807, in _call_train hooks=hooks)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 302, in train loss = self._train_model(input_fn, hooks, saving_listeners)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 711, in _train_model features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 694, in _call_model_fn model_fn_results = self._model_fn(features=features, **kwargs)
File "/Experiment.py", line 350, in model_fn predict = forward(features, params, mode)
File "/Experiment.py", line 335, in forward dtype = tf.float32
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\ops\rnn.py", line 562, in dynamic_rnn flat_input = [ops.convert_to_tensor(input_) for input_ in flat_input]
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\ops\rnn.py", line 562, in flat_input = [ops.convert_to_tensor(input_) for input_ in flat_input]
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 836, in convert_to_tensor as_ref=False)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 926, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py", line 229, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name)
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py", line 208, in constant value, dtype=dtype, shape=shape, verify_shape=verify_shape))
File "C:\Users\hp\Anaconda3\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 472, in make_tensor_proto "supported type." % (type(values), values))
TypeError: Failed to convert object of type <class 'function'> to Tensor. Contents: <function numpy_input_fn.<locals>.input_fn at 0x000001AB2B1DBEA0>. Consider casting elements to a supported type.
Does anyone know why ?
Upvotes: 0
Views: 1694
Reputation: 563
I had a similar problem. In my case the exception was raised because inside my model (I guess "forward", in your case) x was used as a Tensor, but it was actually a function (specifically tf.estimator.inputs.numpy_input_fn). I figured it out by adding this:
print(x)
print(type(x))
Which printed something like this:
<function numpy_input_fn.<locals>.input_fn at 0x7fcc6f065740>
<class 'function'>
I'm still not sure what is the correct way to solve it, but I was able to fix it by doing something similar to this:
input_dict, y = x()
x = input_dict['x']
Hope it helps
Upvotes: 1
Reputation: 53758
You should pass a list of cells into MultiRNNCell
:
Args:
cells
: list of RNNCells that will be composed in this order.
state_is_tuple
: If True, accepted and returned states are n-tuples, wheren = len(cells)
. If False, the states are all concatenated along the column axis. This latter behavior will soon be deprecated.
If you really want to make a one-layer RNN, change the code to
cells = tf.nn.rnn_cell.MultiRNNCell([layers])
... or create more layers.
Upvotes: 0