2017-07-01 12 views
0

私はバイナリクラシファイアの構築に取り組んでいます。 TensorFlow.orgの分類チュートリアル私は、テストセットで85%の精度を得ています。ただし、この評価は0.5のしきい値を使用して実行されます。より正確な精度を得ることができるかどうかを確認するために、異なるしきい値を試すことができます。だから私はtensorflowのウェブサイトに掘って、次のコマンドを見つけました:"numpy.ndarray 'オブジェクトは呼び出し可能ではありません"と "' Tensor 'オブジェクトは呼び出し可能ではありません"

tf.metrics.precision_at_thresholds(
    labels, 
    predictions, 
    thresholds, 
    weights=None, 
    metrics_collections=None, 
    updates_collections=None, 
    name=None 
) 

ちょうどそれは私が私が好きなカスタムしきい値を使用して精度を評価できるようになるので、私は必要なもののように見えました。このように、私は私のモデルのコードにこのビットを追加し、最終的な結果は次のように探しています:

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 
import numpy as np 
import tensorflow as tf 
train_file = "/home/javier/train.csv" 
test_file = "/home/javier/test.csv" 
def main(): 
    # Load datasets. 
    training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
     filename=train_file, 
     target_dtype=np.int, 
     features_dtype=np.float32) 
    test_set = tf.contrib.learn.datasets.base.load_csv_with_header(
     filename=test_file, 
     target_dtype=np.int, 
     features_dtype=np.float32) 
    # Specify that all features have real-value data 
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=15)] 
    # Build 3 layer DNN with 10, 20, 10 units respectively. 
    classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns, 
      hidden_units=[15,20,15], 
      optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.05,l2_regularization_strength=0.2), 
      n_classes=2, 
      model_dir="/home/javier/tf_tinkering") 
    # Define the training inputs 
    def get_train_inputs(): 
     x = tf.constant(training_set.data) 
     y = tf.constant(training_set.target) 
     return x, y 
    # Fit model. 
    classifier.fit(input_fn=get_train_inputs, steps=50) 
    # Define the test inputs 
    def get_test_inputs(): 
     x = tf.constant(test_set.data) 
     y = tf.constant(test_set.target) 
     return x, y 
    # Evaluate accuracy. 
    tf.metrics.precision_at_thresholds(
     tf.constant(test_set.target), 
     classifier.predict(input_fn=tf.constant(test_set.data)), 
     thresholds=[0.5,0.4,0.6], 
    ) 

if __name__ == "__main__": 
    main() 

問題はtf.metricsは「予測」ビットを解釈されていないということです。私は "予測"と呼ばれるさまざまな方法を試みましたが、すべてエラーを返します。

tf.metrics.precision_at_thresholds(
     tf.constant(test_set.target), 
     classifier.predict_classes(input_fn=get_test_inputs), 
     thresholds=[0.5,0.4,0.6], 
    ) 

を使用すると、私に

TypeError: 'Tensor' object is not callable 

を使用して

tf.metrics.precision_at_thresholds(
     tf.constant(test_set.target), 
     classifier.predict_classes(input_fn=tf.constant(test_set.data)), 
     thresholds=[0.5,0.4,0.6], 
    ) 

結果を使用して

TypeError: Expected binary or unicode string, got <generator object <genexpr> at 0x7ff38d2c5af0> 

を与えますの

tf.metrics.precision_at_thresholds(
     tf.constant(test_set.target), 
     classifier.predict_classes(input_fn=test_set.data), 
     thresholds=[0.5,0.4,0.6], 
    ) 

出力

私も「feature_columns_matrix」新しい行列を定義しようとしたCSVファイルからその中にすべての値を貼り付け、それはまた」なかったの「classifier.predict_classes(input_fn = feature_columns_matrix)」乱
TypeError: 'numpy.ndarray' object is not callable 

仕事。 tf.metricsサブルーチンにテストセットを実行したときに、ネットワークの出力レイヤの値を渡すにはどうすればよいですか?

私は既にこのウェブサイトで約10の他の同様の質問を読んできましたが、私は何も助けてくれませんでした(私は冗長な質問をしていないことを知っています)。 ご協力いただければ幸いです! おかげ

UPDATE:私は

print(list(classifier.predict(input_fn=get_test_inputs))) 

を実行すると、正しくテストファイル内の各サンプルの予測クラスを返すことが分かりました。しかし、これは、上記のコマンドが0.5のしきい値に基づいて正確にクラスを返すので、精度を評価するためにtf.metricsに必要なものではありません!これはネットの最終層の実際の出力を与えません。

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

しかし、私が本当に必要なのテストセットのネット実行それが生成する実際のfloat32値である:私は上記のコマンドを実行したとき、私はこれを取得します。そうすれば、私はそれをtf.metricsに送り、さまざまなしきい値をテストできます。誰もそれをする方法を知っていますか?

答えて

0

これは、この時点でnumpy配列を持ち、関数であるかのように使用しようとしていることを意味します。つまり、あなたはarr(...)の構文でそれを '呼び出し'ます。どちらかをインデックス化する必要がありますarr[...]、またはこのオブジェクトは最初の場所の配列であってはいけません。

テンソルオブジェクトと同じです。

TypeError: Expected binary or unicode string, got <generator object <genexpr> at 0x7ff38d2c5af0> 

は、関数は、パラメータとして文字列を期待することを意味していますが、それを何か他のものを与えている(generatorの概念は、おそらくあなたのためにあまりにも進んでいる。)

理想的には、Pythonでプログラミングをするときに必要各変数が何を参照しているか、具体的にはどのような種類のオブジェクトであるかを理解する。 Isは関数、文字列、数値、配列、テンソルフローオブジェクトです。このようなバグがあるときは、オブジェクトを確認する診断プリントを追加する必要があります。仮定しないでください。テスト。

どうやらあなたは、この式の中でさまざまなことをしようとしている。

classifier.predict_classes(input_fn=get_test_inputs) 
classifier.predict_classes(input_fn=tf.constant(test_set.data)) 
classifier.predict_classes(input_fn=test_set.data) 

この機能は何を受け入れていますか?私はtest_set.datがnumpy配列であると推測しています。 tf.constant()にラップするとテンソルオブジェクトになります。 get_test_inputsはジェネレータ/ファンクションです。

+0

答えていただきありがとうございます。上記の質問へのアップデートをご覧ください。私はすでにあなたがここで助けているこの部分を理解しました –

関連する問題