2017-02-23 55 views
0

我正在使用contrib.learn.estimator來預測tensorflow0.12環境。contrib.learn.estimator()for tensorflow0.12

#1. Use a regression Estimator, set n_classes to 0  
model = skflow.SKCompat(skflow.Estimator(model_fn=lstm_model, model_dir=LOG_DIR)) 

#2. create a lstm instance and validation monitor 
validation_monitor = skflow.monitors.ValidationMonitor(X, y, 
                every_n_steps=steps, 
                early_stopping_rounds=1000) 

#3. fit the model 
model.fit(X_train, y_train, monitors=[validation_monitor], steps=steps) 

#4. Predict 
y_train_predicted = model.predict(X_train) 

和LSTM模型

def lstm_model(X, y): 
X = tf.reshape(X, [-1, n_steps, n_input]) #batch_size,n_steps,n_input 
#permute n_steps and batch_size 
X = tf.transpose(X, [1, 0, 2]) 
#Reshape to prepare input to hidden activation 
X = tf.reshape(X, [-1, n_input])   #n_steps*batch_size, n_input 
#Split data because rnn cell needs a list of inputs for the RNN inner loop 
X = tf.split(0, n_steps, X)     #n_steps*(batch_size, n_input) 

init = tf.random_normal_initializer(stddev = 0.05) 
lstm_cell = tf.nn.rnn_cell.LSTMCell(hidden, initializer = init, state_is_tuple = True) 


output, _ = tf.nn.rnn(lstm_cell, X, dtype = tf.float32) 

y = tf.convert_to_tensor(y) 

return skflow.models.linear_regression(output[0], y) 

錯誤報告

File "/home/lstm.py", line 182, in <module> 
    model.fit(X_train, y_train, monitors=[validation_monitor], steps=steps) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1131, in fit 
    max_steps=max_steps) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 699, in _train_model 
    train_ops = self._get_train_ops(features, labels) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1052, in _get_train_ops 
    return self._call_model_fn(features, labels, model_fn_lib.ModeKeys.TRAIN) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1030, in _call_model_fn 
    raise ValueError('Unrecognized value returned by model_fn, ' 
ValueError: Unrecognized value returned by model_fn, please return ModelFnOps." 

如果我修改模型行

model = skflow.SKCompat(skflow.Estimator(model_fn=lstm_model(X, y), model_dir=LOG_DIR)) 

它仍然報錯:

File "/home/lstm.py", line 175, in <module> 
    model = skflow.SKCompat(skflow.Estimator(model_fn=lstm_model(X, y), model_dir=LOG_DIR)) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 990, in __init__ 
    if params is None and 'params' in model_fn_args: 
TypeError: argument of type 'NoneType' is not iterable 

我對tensorflow 0.12的contrib.learn.estimator()感到困惑。任何人都可以幫我糾正代碼並教給我估計嗎?不管怎樣,謝謝你。

回答

0

您的model_fn參數不應該是ModelFnOps()的返回值。一個mamual model_fn名稱是必需的:

def model_fn(features, targets, mode): 
    '''Implement of model_fn API. 

    # Logic to do the following: 
    # 1. Configure the model via TensorFlow operations 
    # 2. Define the loss function for training/evaluation 
    # 3. Define the training operation/optimizer 
    # 4. Generate predictions 
    # 5. Return predictions/loss/train_op/eval_metric_ops in ModelFnOps object 

    Args: 
     features: Inputs data for the model. 
     targets: Expected outputs of the model namely labels. 
     mode: learn.ModeKeys.TRAIN/EVAL/INFER 

    Returns: 
     ModelFnOps object. 
    ''' 

然後當你定義一個估算:

model = SKCompat(learn.Estimator(
    model_fn=model_fn, 
    model_dir='path/to/your/model' 
))