이찬우님의 텐서플로우 유튜브강좌를 정리한다.
로지스틱 비용함수를 만들기
- 좌측과 우측에 대한 convex 를 만들기 위한 식
cost = tf.reduce_sum(-y*tf.log(output)-(1-y)*tf.log(1-output), reduction_indices=1)
prediction과 label끼리의 정확도를 판단하기
- 각자의 벡터 매칭이 맞으면 1, 틀리면 0으로 하는 값을 다시 n*1 벡터로 만든다.
- 해당 백터의 값에 대한 평균을 구한다.
- 이때 1, 0값은 bool이어서 float32로 변환하여 계산한다.
- 잘 맞으면 평균 1 이 나온다.
comp_pred = tf.equal(tf.argmax(output, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(comp_pred, tf.float32))
모델 저장하기
- Training시킨 모델을 저장하는 것을 Checkpoint라 한다.
- 저장내용에는 Weight과 Model이 저장될 수 있다.
- Weight관련 Variable을 저장한후 Save한다.
- 저장시 유의점은 Variable, placeholder 함수의 파라미터중 하나인 Name이 자동으로 지정된다.
W_o = tf.Variable(tf.truncated_normal(shape=[HIDDEN2_SIZE, CLASSES], dtype=tf.float32))
b_o = tf.Variable( tf.zeros([CLASSES]), dtype=tf.float32)
param_list = [W_h1, b_h1, W_h2, b_h2, W_o, b_o]
saver = tf.train.Saver(param_list)
hidden1 = tf.sigmoid(tf.matmul(x, W_h1) + b_h1)
hidden2 = tf.sigmoid(tf.matmul(hidden1, W_h2) + b_h2)
....
for i in range(1000):
_, loss = sess.run([train, cost, accuracy], feed_dict = feed_dict)
if i % 100 == 0:
saver.save(sess, './tensorflow_3_lec.ckpt')
...
저장된 Weight Restoring하기
- save 할 때 Widget의 Variable에 name을 지정한다.
-
x = tf.placeholder(tf.float32, shape=[None, INPUT_SIZE], name='x')
y = tf.placeholder(tf.float32, shape=[None, CLASSES], name='y')
W_h1 = tf.Variable(tf.truncated_normal(shape=[INPUT_SIZE, HIDDEN1_SIZE], dtype=tf.float32), name='W_h1')
b_h1 = tf.Variable(tf.zeros([HIDDEN1_SIZE]), dtype=tf.float32, name='b_h1')
hidden1 = tf.sigmoid(tf.matmul(x, W_h1) + b_h1, name='hidden1')
hidden2 = tf.sigmoid(tf.matmul(hidden1, W_h2) + b_h2, name='hidden2')
output = tf.sigmoid(tf.matmul(hidden2, W_o) + b_o, name='output')
...
saver.restore(sess, './tensorflow_3.ckpt')
Tensorboard는 디버깅 용도이다. 공식 튜토리얼을 참조한다.
- name_scope는 묶음 단위이다.
- scalar: 로그 데이터 남기기
- tf.summary.merge_all()
- tf.summary.FileWriter(<dir>, session.graph)
# 가설함수
with tf.name_scope('hidden_layer_1') as h1scope:
hidden1 = tf.sigmoid(tf.matmul(x, W_h1) + b_h1, name='hidden1')
with tf.name_scope('hidden_layer_2') as h2scope:
hidden2 = tf.sigmoid(tf.matmul(hidden1, W_h2) + b_h2, name='hidden2')
with tf.name_scope('output_layer') as oscope:
output = tf.sigmoid(tf.matmul(hidden2, W_o) + b_o, name='output')
....
# 수행
sess= tf.Session()
sess.run(tf.global_variables_initializer())
merge = tf.summary.merge_all()
for i in range(1000):
_, loss, acc = sess.run([train, cost, accuracy], feed_dict = feed_dict)
if i % 100 == 0:
train_writer = tf.summary.FileWriter('./summaries/', sess.graph)
$ tensorboard --logdir=./summaries 수행한다.
Loading Data in Tensorflow 참조. CSV파일 읽기
- decode_csv로 콤마기반의 csv파일을 읽어들인다.
- record_defaults = [[1], [1], [1], [1], [1], [1], [1], [1], [1]] Fixed 자리수에서 비어있는 값에 대한 default value이다.
- start_queue_runners는 Session.run이 수행되기전에 호출해서 queue를 실행해서 file이 queue에서 대기토록 한다.
- Coordinator 는 Thread 관리를 수행한다.
/* | |
$ cat test.csv | |
1,2,3,,5,6,7,8,9 | |
0,9,8,7,6,5,4,3,2 | |
2,3,4,5,6,7,8,9,0 | |
5,4,3,2,16,7,8,9,3 | |
*/ | |
import tensorflow as tf | |
filename_queue = tf.train.string_input_producer(['./test.csv']) | |
reader = tf.TextLineReader() | |
key, value = reader.read(filename_queue) | |
record_defaults = [[1], [1], [1], [1], [1], [1], [1], [1], [1]] | |
col1, col2, col3, col4, col5, col6, col7, col8, col9 = tf.decode_csv(value, record_defaults=record_defaults) | |
features = tf.stack([col1, col2, col3, col4, col5, col6, col7, col8, col9]) | |
with tf.Session() as sess: | |
coord = tf.train.Coordinator() | |
threads = tf.train.start_queue_runners(coord=coord) | |
for i in range(5): | |
example, label = sess.run([features, col9]) | |
print('example:', example, 'label:', label) | |
coord.request_stop() | |
coord.join(threads) |
!
- FixedLengthRecordReader로 읽음
- decode_raw를 사용함
to be continue...
<참조>
- 텐서플로우의 체크포인트 설명