2017-08-23 1 views
1

減衰率が低下するGradientDescentOptimizerでLinearClassifierを使用しようとしています。テンソルフローのエスティメータで減衰率を使用するにはどうすればよいですか?

マイコード:

def main(): 
# load data 
    features = np.load('data/feature_data.npz') 
    tx = features['arr_0'] 
    y = features['arr_1'] 

## Prepare logistic regression 
    n_point, n_feat = tx.shape 

# Input functions 
    def get_input_fn_from_numpy(tx, y, num_epochs=None, shuffle=True): 
    # Preprocess data 
     return tf.estimator.inputs.numpy_input_fn(
     x={"x":tx}, 
     y=y, 
     num_epochs=num_epochs, 
     shuffle=shuffle, 
     batch_size=128 
     ) 

    cols_label = "x" 
    feature_cols = [tf.contrib.layers.real_valued_column(cols_label)] 

    my_input_fn_train = get_input_fn_from_numpy(tx, y) 

    model_dir = 'data/tmp/' + datetime.datetime.now().strftime("%m-%d_%H:%M:%S") 
    global_step = tf.Variable(0, trainable=False) 
    learning_rate=tf.train.exponential_decay(0.001*np.ones((20,1), dtype=np.float32), global_step, 10000, 0.95, staircase=False) 
    regressor = tf.contrib.learn.LinearClassifier(feature_columns=feature_cols, 
               model_dir=model_dir, 
                optimizer=tf.train.GradientDescentOptimizer(learning_rate=learning_rate)) 

    regressor.fit(input_fn=get_input_fn_from_numpy(tx_train, y_train), steps=100000) 
    results = regressor.evaluate(input_fn=my_input_fn_test) 

私はエラーを取得する:

File "training.py", line 71, in <module> 
main() 
    File "training.py", line 63, in main 
regressor.fit(input_fn=get_input_fn_from_numpy(tx_train, y_train), steps=100000) 
    File "/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 296, in new_func 
return func(*args, **kwargs) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 458, in fit 
loss = self._train_model(input_fn=input_fn, hooks=hooks) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 958, in _train_model 
model_fn_ops = self._get_train_ops(features, labels) 
File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1165, in _get_train_ops 
return self._call_model_fn(features, labels, model_fn_lib.ModeKeys.TRAIN) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1136, in _call_model_fn 
model_fn_results = self._model_fn(features, labels, **kwargs) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 186, in _linear_model_fn 
logits=logits) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py", line 854, in create_model_fn_ops 
enable_centered_bias=self._enable_centered_bias) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py", line 649, in _create_model_fn_ops 
batch_size, loss_fn, weight_tensor) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py", line 1911, in _train_op 
train_op = train_op_fn(loss) 
    File "/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 179, in _train_op_fn 
zip(grads, my_vars), global_step=global_step)) 
    File "/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 456, in apply_gradients 
update_ops.append(processor.update_op(self, grad)) 
    File "/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 97, in update_op 
return optimizer._apply_dense(g, self._v) # pylint: disable=protected-access 
    File "/lib/python3.6/site-packages/tensorflow/python/training/gradient_descent.py", line 50, in _apply_dense 
use_locking=self._use_locking).op 
    File "/lib/python3.6/site-packages/tensorflow/python/training/gen_training_ops.py", line 370, in apply_gradient_descent 
name=name) 
    File "/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 330, in apply_op 
g = ops._get_graph_from_inputs(_Flatten(keywords.values())) 
    File "/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 4262, in _get_graph_from_inputs 
_assert_same_graph(original_graph_element, graph_element) 
    File "/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 4201, in _assert_same_graph 
"%s must be from the same graph as %s." % (item, original_item)) 
ValueError: Tensor("ExponentialDecay:0", shape=(20, 1), dtype=float32) must be from the same graph as Tensor("linear/x/weight/part_0:0", shape=(20, 1), dtype=float32_ref). 

私はtensorflow 1.3を使用しています。 私は学習率を定数、例えば0.01で置き換えたときに動作します。私は、過去には最小限の操作と組み合わせて減衰率を使用していましたが、LinearClassifier内でそれを使用しようとしていました。 私は、グローバルなステップをフィットのステップに結びつけないが、これがどのように機能するのだろうと思っていたという点で、何かが一貫していないように見えます。私はhereのようにプレースホルダーを使うことができると思いますが、私が必要としない場合はなぜ自分自身でアップデートルールをコーディングすべきかわかりません。

これを解決する方法の提案はありますか?

答えて

0

global_steptf.train.get_global_step()に電話して取得しようとしましたか?これにより、LinearClassifierモデルで使用されているglobal_stepが返されます。代わりに使用

global_step = tf.train.get_global_step() 

は、これは私がtf.nn.sparse_softmax_cross_entropy_with_logitsを最小限に抑えるためにtf.train.MomentumOptimizerを使用して自分のEstimatorクラスを使用して、私のために働いた

global_step = tf.Variable(0, trainable=False) 

関連する問題