各クラスごとの正解率を出力させ方を教えてください。
今大学でtensorflowを使った雲画像の自動認識を勉強しています。
3クラス用意して学習しているのですが、
評価時に出力される正解率は全体のもののみなので、
クラスごとの正解率をそれぞれ出力したいと考えています。
*現在の出力
epoch ●● duration = ●● sec, prediction = ●●
*実現したい出力
epoch ●● class : 0 duration = ●● sec, prediction = ●●
epoch ●● class : 1 duration = ●● sec, prediction = ●●
epoch ●● class : 2 duration = ●● sec, prediction = ●●
該当のソースコード
python3
1train.py 2 3# coding: UTF-8 4from __future__ import absolute_import 5from __future__ import division 6from __future__ import print_function 7 8import os 9import time 10 11import numpy as np 12import tensorflow.compat.v1 as tf 13tf.disable_v2_behavior() 14 15import model as model 16from reader import Cifar10Reader 17 18from tensorflow.python.framework import graph_util 19from tensorflow.python.platform import gfile 20 21 22FLAGS = tf.app.flags.FLAGS 23tf.app.flags.DEFINE_integer('epoch', , "訓練するEpoch数") 24tf.app.flags.DEFINE_float('learning_rate', , "学習率") 25tf.app.flags.DEFINE_string('data_dir', './data/ ', "訓練データのディレクトリ") 26tf.app.flags.DEFINE_string('checkpoint_dir', './checkpoints/', 27 "チェックポイントを保存するディレクトリ") 28tf.app.flags.DEFINE_string('test_data', './data/test.bin', "テストデータのパス") 29tf.app.flags.DEFINE_string('graph_dir', './graphs/', 30 "グラフを保存するディレクトリ") 31 32 33def _loss(logits, label): 34 labels = tf.cast(label, tf.int64) 35 cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( 36 logits=logits, labels=labels, name='cross_entropy_per_example') 37 cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') 38 return cross_entropy_mean 39 40 41def _train(total_loss, global_step): 42 opt = tf.train.GradientDescentOptimizer(learning_rate=FLAGS.learning_rate) 43 grads = opt.compute_gradients(total_loss) 44 train_op = opt.apply_gradients(grads, global_step=global_step) 45 return train_op 46 47filenames = [ 48 os.path.join(FLAGS.data_dir, 'data_i.bin' % i) for i in range(0, 3) 49 ] 50 51 52def main(argv=None): 53 global_step = tf.Variable(0, trainable=False) 54 55 train_placeholder = tf.placeholder(tf.float32, 56 shape=[32, 32, 3], name='input_image') 57 label_placeholder = tf.placeholder(tf.int32, shape=[1], name='label') 58 59 # (height, width, depth) -> (batch, height, width, depth) 60 image_node = tf.expand_dims(train_placeholder, 0) 61 62 logits = model.inference(image_node) 63 total_loss = _loss(logits, label_placeholder) 64 train_op = _train(total_loss, global_step) 65 66 top_k_op = tf.nn.in_top_k(logits, label_placeholder, 1) 67 68 saver = tf.train.Saver(tf.global_variables()) 69 70 with tf.Session() as sess: 71 sess.run(tf.global_variables_initializer()) 72 tf.summary.FileWriter(sess.graph) 73 74 total_duration = 0 75 76 77 _export_graph(sess, 0) 78 79 for epoch in range(1, FLAGS.epoch + 1): 80 start_time = time.time() 81 82 for file_index in range(3): 83 print('Epoch %d: %s' % (epoch, filenames[file_index])) 84 reader = Cifar10Reader(filenames[file_index]) 85 86 for index in range(30000): 87 image = reader.read(index) 88 89 _, loss_value = sess.run([train_op, total_loss], 90 feed_dict={ 91 train_placeholder: image.byte_array, 92 }) 93 94 assert not np.isnan(loss_value), 'Model diverged with loss = NaN' 95 96 reader.close() 97 98 duration = time.time() - start_time 99 total_duration += duration 100 101 prediction = _eval(sess, top_k_op, 102 train_placeholder, label_placeholder) 103 print('epoch %d duration = %d sec, prediction = %.3f' 104 % (epoch, duration, prediction)) 105 106 saver.save(sess, FLAGS.checkpoint_dir, global_step=epoch) 107 _export_graph(sess, epoch) 108 109 print('Total duration = %d sec' % total_duration) 110 111 112def _eval(sess, top_k_op, input_image, label_placeholder): 113 if not FLAGS.test_data: 114 return np.nan 115 116 image_reader = Cifar10Reader(FLAGS.test_data) 117 true_count = 0 118 for index in range(30000): 119 image = image_reader.read(index) 120 121 predictions = sess.run([top_k_op], 122 feed_dict={ 123 input_image: image.byte_array, 124 label_placeholder: image.label 125 }) 126 true_count += np.sum(predictions) 127 image_reader.close() 128 129 return (true_count / 30000.0) 130 131 132def _restore(saver, sess): 133 checkpoint = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir) 134 if checkpoint and checkpoint.model_checkpoint_path: 135 saver.restore(sess, checkpoint.model_checkpoint_path) 136 137 138def _export_graph(sess, epoch): 139 file_path = os.path.join(FLAGS.graph_dir, 'graph_%02d_epoch.pb' % epoch) 140 with gfile.FastGFile(file_path, 'wb') as f: 141 f.write(constant_graph_def.SerializeToString()) 142 143 144if __name__ == '__main__': 145 tf.app.run()
試したこと
_eval関数をもう1つ作って、
prediction = _eval(sess, top_k_op,
train_placeholder, label_placeholder)
print('epoch %d duration = %d sec, prediction = %.3f'
% (epoch, duration, prediction))
をfor文で回そうとしたのですがうまく行きませんでした。
補足情報(FW/ツールのバージョンなど)
プログラムは「TensorFlowはじめました ― 実践!最新Googleマシンラーニング」を参考にしています。
data_1.bin,data_2.bin,data_3.binにはそれぞれ3万枚ずつ3232の画像が入っており、test.binには、3種類の3232画像を1万枚ずつ入れた合計3万枚の画像が入っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 08:48
2019/11/28 13:53