Skip to main content
 首页 » 编程设计

python之Tensorflow,使用 Estimator(model_fn) 提供占位符

2025年05月04日24shanyou

我正在尝试构建一个 lstm 模型。但我越来越

  
        InvalidArgumentError Traceback (most recent call last) 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args) 
        964     try: 
    --> 965       return fn(*args) 
        966     except errors.OpError as e: 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata) 
        946                                  feed_dict, fetch_list, target_list, 
    --> 947                                  status, run_metadata) 
        948  
    /home/george/anaconda3/lib/python3.5/contextlib.py in <strong>exit</strong>(self, type, value, traceback) 
         65             try: 
    ---> 66                 next(self.gen) 
         67             except StopIteration: 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/errors.py in raise_exception_on_not_ok_status() 
        449           compat.as_text(pywrap_tensorflow.TF_Message(status)), 
    --> 450           pywrap_tensorflow.TF_GetCode(status)) 
        451   finally: 
    InvalidArgumentError: You must feed a value for placeholder tensor 'input' with dtype float 
         [[Node: input = Placeholderdtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]] 
    During handling of the above exception, another exception occurred: 
    InvalidArgumentError                      Traceback (most recent call last) 
     in () 
          1 classificator.fit(X_train_TF, Y_train, monitors = [validation_monitor], 
    ----> 2                   batch_size = batch_size, steps = training_steps) 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py in fit(self, x, y, input_fn, steps, batch_size, monitors, max_steps) 
        217                              steps=steps, 
        218                              monitors=monitors, 
    --> 219                              max_steps=max_steps) 
        220     logging.info('Loss for final step: %s.', loss) 
        221     return self 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py in _train_model(self, input_fn, steps, feed_fn, init_op, init_feed_fn, init_fn, device_fn, monitors, log_every_steps, fail_on_nan_loss, max_steps) 
        477       features, targets = input_fn() 
        478       self._check_inputs(features, targets) 
    --> 479       train_op, loss_op = self._get_train_ops(features, targets) 
        480  
        481       # Add default monitors. 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py in _get_train_ops(self, features, targets) 
        747       Tuple of train <code>Operation</code> and loss <code>Tensor</code>. 
        748     """ 
    --> 749     _, loss, train_op = self._call_model_fn(features, targets, ModeKeys.TRAIN) 
        750     return train_op, loss 
        751  
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py in _call_model_fn(self, features, targets, mode) 
        731       else: 
        732         return self._model_fn(features, targets, mode=mode) 
    --> 733     return self._model_fn(features, targets) 
        734  
        735   def _get_train_ops(self, features, targets): 
    /home/george/ipython/project/lstm_model.py in model(X, y) 
         61         output = lstm_layers(output[-1],dense_layers) 
         62         prediction, loss = tflearn.run_n({"outputs": output, "last_states": layers}, n=1, 
    ---> 63                                         feed_dict=None) 
         64         train_operation = tflayers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer=optimizer, 
         65                                                  learning_rate=learning_rate) 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/graph_actions.py in run_n(output_dict, feed_dict, restore_checkpoint_path, n) 
        795       output_dict=output_dict, 
        796       feed_dicts=itertools.repeat(feed_dict, n), 
    --> 797       restore_checkpoint_path=restore_checkpoint_path) 
        798  
        799  
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/graph_actions.py in run_feeds(*args, **kwargs) 
        850 def run_feeds(*args, **kwargs): 
        851   """See run_feeds_iter(). Returns a <code>list</code> instead of an iterator.""" 
    --> 852   return list(run_feeds_iter(*args, **kwargs)) 
        853  
        854  
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/graph_actions.py in run_feeds_iter(output_dict, feed_dicts, restore_checkpoint_path) 
        841         threads = queue_runner.start_queue_runners(session, coord=coord) 
        842         for f in feed_dicts: 
    --> 843           yield session.run(output_dict, f) 
        844       finally: 
        845         coord.request_stop() 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata) 
        708     try: 
        709       result = self._run(None, fetches, feed_dict, options_ptr, 
    --> 710                          run_metadata_ptr) 
        711       if run_metadata: 
        712         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata) 
        906     if final_fetches or final_targets: 
        907       results = self._do_run(handle, final_targets, final_fetches, 
    --> 908                              feed_dict_string, options, run_metadata) 
        909     else: 
        910       results = [] 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata) 
        956     if handle is None: 
        957       return self._do_call(_run_fn, self._session, feed_dict, fetch_list, 
    --> 958                            target_list, options, run_metadata) 
        959     else: 
        960       return self._do_call(_prun_fn, self._session, handle, feed_dict, 
    /home/george/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args) 
        976         except KeyError: 
        977           pass 
    --> 978       raise type(e)(node_def, op, message) 
        979  
        980   def _extend_graph(self):<p></p> 
 
<pre><code>InvalidArgumentError: You must feed a value for placeholder tensor 'input' with dtype float 
     [[Node: input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 
</code></pre> 
 

Here is my notebook code, error occurs when i call the third line(fit classifier) :
 
    classificator = tf.contrib.learn.Estimator(model_fn=lstm_model(timesteps,rnn_layers,dense_layers)) 
    validation_monitor = tf.contrib.learn.monitors.ValidationMonitor(X_train_TF, Y_train,  
                                                        every_n_steps=1000, early_stopping_rounds = 1000) 
    classificator.fit(X_train_TF, Y_train, monitors = [validation_monitor], 
                      batch_size = batch_size, steps = training_steps) 
有我的模型定义(一个小视觉错误,但所有函数都在 lstm_model 函数中):
 <p></p> 
 
<pre><code>def lstm_model(num_utnits, rnn_layers, dense_layers=None, learning_rate=0.1, optimizer='Adagrad'): 
    def lstm_cells(layers): 
        if isinstance(layers[0], dict): 
            return [tf.nn.rnn_cell.DropoutWrapper(tf.nn.rnn_cell.LSTMCell(layer['num_units'], 
                                                                          state_is_tuple=True), 
                                                  layer['keep_prob']) 
                    if layer.get('keep_prob') else tf.nn.rnn_cell.LSTMCell(layer['num_units'], 
                                                                           state_is_tuple=True) 
                    for layer in layers] 
        return [tf.nn.rnn_cell.LSTMCell(steps, state_is_tuple=True) for steps in layers] 
 
    def lstm_layers(input_layers, layers): 
        if layers and isinstance(layers, dict): 
            return tflayers.stack(input_layers, tflayers.fully_connected, 
                                  layers['layers'])  # check later 
        elif layers: 
            return tflayers.stack(input_layers, tflayers.fully_connected, layers) 
        else: 
            return input_layers 
 
    def model(X, y): 
        stacked_lstm = tf.nn.rnn_cell.MultiRNNCell(lstm_cells(rnn_layers), state_is_tuple=True) 
        output, layers = tf.nn.dynamic_rnn(cell=stacked_lstm, inputs=X, dtype=dtypes.float32,) 
        output = lstm_layers(output[-1], dense_layers) 
        prediction, loss = tflearn.run_n({"outputs": output, "last_states": layers}, n=1, 
                                        feed_dict=None) 
        train_operation = tflayers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer=optimizer, 
                                                 learning_rate=learning_rate) 
        return prediction, loss, train_operation 
 
    return model 
</code></pre> 
 

我做错了什么?任何建议如何解决这个问题?无论如何感谢 future 的建议)

请您参考如下方法:

.fit 方法已修改为支持 input_fn 作为参数,而不是训练数据及其标签。请看this示例。