私はバイナリクラシファイアの構築に取り組んでいます。 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に送り、さまざまなしきい値をテストできます。誰もそれをする方法を知っていますか?
答えていただきありがとうございます。上記の質問へのアップデートをご覧ください。私はすでにあなたがここで助けているこの部分を理解しました –