私はTensorFlowを試しています。イメージの代わりにCSVファイルから行を読み込んで、基本的なMNISTのバージョンを作成しようとしています。私は、MNISTの例とCSVフィーダの例に基づいてコードをまとめています。TensorFlow:各繰り返しの出力値を出力します。
私のCSVの各行の最初の100セルは、数字の「イメージ」を表し、同じ行の次の10セルは、MNISTの例のラベルと同様に、そのイメージを識別する「ラベル」を表します。
私はTensorFlowが実際のラベルと "推測された"出力を各反復ごとに並べて印刷することによって、CSVライン上の各繰り返しの間に実際に数を推定して印刷しようとしています。しかし、実際に印刷されているものは真のラベルであると思われます。y
変数は、現在のx
の値をxプレースホルダーに置き換える必要があるためです。
各繰り返しの実際のラベルではなく、推測値をどのように出力できますか?
私のコードは次のようになります。
fileName = 'TEST_data/TFTest.csv'
filename_queue = tf.train.string_input_producer([fileName])
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
rDefaults = []
for i in range(0,110):
rDefaults.append((list([0])))
data = tf.decode_csv(value, record_defaults=rDefaults)
fPack = tf.slice(data, [0], [100])
lPack = tf.slice(data, [100], [10])
features = tf.pack(fPack)
label = tf.pack(lPack)
x = tf.placeholder(tf.float32, [None, 100])
W = tf.Variable(tf.zeros([100, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(.5).minimize(cross_entropy)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
i = 0
for i in range(10):
f, l = sess.run([features, label])
f1 = np.reshape(f, (-1, 100))
l1 = np.reshape(l, (-1, 10))
sess.run(train_step, feed_dict={x: f1, y_: l1})
if i%1==0:
print(sess.run(tf.argmax(l1, 1)))
print(sess.run(tf.argmax(y, 1), feed_dict={x: f1}))
print('********')
i = i + 1
coord.request_stop()
coord.join(threads)
ありがとう、私は上記を理解していますが、それは私が求めているものではありません。なぜ私の予測は常に実際のラベルとまったく同じになりますか?出力ベクトルはランダムに見えますが、最高値は常に真のラベルと一致します.TFはそれほど良いものではありません! Xの最初の100セルのランダムな0と1の場合でも、sess.run(y)はラベル100%に対応する推測値を常に示します。私はそれがYの値を得るためにfeed_dict経由で提供しなければならないx'esのプレースホルダーに依存しているのか、あるいは私がプログラムの全体のロジックで何か完全に間違っているからでしょうか? –
上記コードはあなたのために何を印刷しますか?その入力CSVファイルを持っていないので再現できません。しかし、データセットが小さく、ネットワークがデータセット全体を覚えておくのに十分な容量を持っている場合(オーバーフィッティング)、100%の精度に達することがあります。 – fabrizioM
Hmm。たぶんあなたは正しいと思うかもしれません。実際にはテストのための非常に小さなデータセットであるため、ちょうど過半数です。実際のラベルがこの[0,0,1,0]のようなものであれば、sess.runを実行する前に推測される出力は[0,0,0,0]になります(train_step、feed_dict = x:f1、y_:l1})、train_stepを実行した後の[.91、.91、15.1、.85]のようなものです。それで、train_stepが正しいことをしているように見えます。それ以前はすべてがゼロに初期化されていますし、正しい推測で正規化されていない出力です。私はちょうどいつも100%の正確さを、なぜランダムなデータであっても心配しています。 –