본문 바로가기

etc/FastCampus 챌린지

[패스트캠퍼스 수강 후기] 컴퓨터비전인강 100% 환급 챌린지 21 회차

728x90
반응형

딥러닝 학습과 모델 파일 저장
▪ Tensorflow로 필기체 숫자 인식 학습하기
• OpenCV DNN 모듈에서 이용할 목적으로 TensorFlow를 이용하여 필기체 숫자 인식을 학습하고, 그 결과를 pb 파일로 저장하기
• 네트워크 구조: [Conv-Pool-Conv-Pool-FC-FC-FC]
• 학습 데이터: MNIST 데이터셋

▪ Yann LeCun 교수가 필기체 숫자 인식을 위해 사용했던 데이터셋

▪ 각각의 숫자는 28x28 크기의 0~1 사이의 실수값으로 구성된 영상 데이터

▪ 60,000개의 훈련용 영상과 10,000개의 테스트 영상

▪ 준비 사항
• Tensorflow 1.13.1 설치

pip install tensorflow==1.13.1

 

▪ Tensorflow MNIST 학습: 네트워크 모델 만들기

mnist = input_data.read_data_sets('./MNIST_data/', one_hot=True)
# Model configuration
X = tf.placeholder(tf.float32, [None, 28, 28, 1], name='data')
Y = tf.placeholder(tf.float32, [None, 10])
conv1 = tf.layers.conv2d(X, 10, [3, 3], padding='same', activation=tf.nn.relu)
pool1 = tf.layers.max_pooling2d(conv1, [2, 2], strides=2, padding='same')
conv2 = tf.layers.conv2d(pool1, 20, [3, 3], padding='same', activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(conv2, [2, 2], strides=2, padding='same')
fc1 = tf.contrib.layers.flatten(pool2)
fc2 = tf.layers.dense(fc1, 200, activation=tf.nn.relu)
logits = tf.layers.dense(fc2, 10, activation=None)
output = tf.nn.softmax(logits, name='prob')
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=logits))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

 

▪ Tensorflow MNIST 학습: 학습

# Training
sess = tf.Session()
sess.run(tf.global_variables_initializer())
total_batch = int(mnist.train.num_examples / batch_size)
print('Start learning!')
for epoch in range(training_epochs):
total_cost = 0
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
batch_xs = batch_xs.reshape(-1, 28, 28, 1)
_, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, Y: batch_ys})
total_cost += cost_val
print('Epoch: {0}, Avg. Cost = {1:.4f}'.format(epoch + 1, total_cost/total_batch))
print('Learning finished!')

▪ Tensorflow MNIST 학습: 테스트 & pb 파일 저장

# Test the results
is_correct = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))
acc = tf.reduce_mean(tf.cast(is_correct, tf.float32))
accuracy = sess.run(acc, feed_dict={
X: mnist.test.images.reshape(-1, 28, 28, 1), Y: mnist.test.labels})
print('Test Accuracy:', accuracy)
# Freeze variables and save pb file
output_graph_def = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['prob'])
with gfile.FastGFile('./mnist_cnn.pb', 'wb') as f:
f.write(output_graph_def.SerializeToString())
print('mnist_cnn.pb file is created successfully!!')

 

생성된 네트워크 모델 그래프

 

▪ dnn 모듈을 이용한 숫자 인식 실행 결과

 

728x90
반응형