■ 정상 폐사진 VS 폐결절 사진 분류
문제102. 폐사진 이미지 를 128x128 픽셀로 일괄 변경하시오
*PlastiliqlmgeResizerInstall.exe 사용하시오
문제103. (점심시간 문제) 폐사진을 로드해서 numpy array 숫자
리스트로 변환하는 loader4.py 를 loader3.py 를 가지고
수정해서 만드시오 !
1 ~ 7370 장을 train 폴더에 넣고 (train : 7370장)
7371~ 7470장을 test 폴더에 넣고 (test : 100장)
라벨을 lung_train_label.csv 와 lung_test_label.csv
를 생성해서 아래의 코드가 실행되게하시오 !
import loader4
train_image = 'D:\\lung28\\lung\\test\\'
train_label = 'D:\\lung28\\lung\\lung_train_label.csv'
test_image = 'D:\\lung28\\lung\\train\\'
test_label = 'D:\\lung28\\lung\\lung_test_label.csv'
print("LOADING DATA")
# 폐사진 데이터 로드
trainX = loader4.image_load(train_image)
trainY = loader4.label_load(train_label)
testX = loader4.image_load(test_image)
testY = loader4.label_load(test_label)
print(trainX.shape)
print(trainY.shape)
print(testX.shape)
print(testY.shape)
처음에 아래와 같은 에러가 떴는데
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc6 in position 417: invalid continuation byte
label 만들 때 메모장을 복붙해서 엑셀작업 한거고
저장할 때 UTF-8을 지정 안해서 그러함.
(*숫자 뿐인데? 하지만 컴퓨터는 복잡한 친구)
LOADING DATA
(7370, 32, 32, 3)
(7370, 2)
(100, 32, 32, 3)
(100, 2)
문제104. 개고양이 vgg 신경망에 폐사진을 입력해서 20에폭 수행하고
훈련 정확도와 테스트 정확도를 확인하시오
import tensorflow as tf
import matplotlib.pyplot as plt
import loader4
import numpy as np
tf.reset_default_graph()
train_image = 'D:\\lung28\\lung\\train\\'
train_label = 'D:\\lung28\\lung\\lung_train_label.csv'
test_image = 'D:\\lung28\\lung\\test\\'
test_label = 'D:\\lung28\\lung\\lung_test_label.csv'
print("LOADING DATA")
# 폐사진 데이터 로드
trainX = loader4.image_load(train_image)
trainY = loader4.label_load(train_label)
testX = loader4.image_load(test_image)
testY = loader4.label_load(test_label)
print(trainX.shape)
print(trainY.shape)
print(testX.shape)
print(testY.shape)
#vgg9 신경망
print('model loading')
#trainX, trainY = loader3.shuffle_batch(trainX, trainY)
#trainX, trainY = loader3.next_batch(trainX, trainY, 0, 100)
#testX, testY = loader3.next_batch(testX, testY, 0, 100)
#훈련때문에 필요한거. 지금은 노필요.
tf.reset_default_graph()
hidden_layer1 = 1024
hidden_layer2 = 1024
# input
x= tf.placeholder(tf.float32, [None,32,32,3]) #
y_onehot = tf.placeholder(tf.float32, [None,2]) # onehot target값을 담는 바구니
keep_prob = tf.placeholder('float')
training = tf.placeholder(tf.bool, name='training' )
y_label = tf.argmax(y_onehot, axis = 1) # target 값 하나를 배출해서 담은 것
# conv1_1
W1_1 = tf.Variable(tf.random_normal(shape=[3,3,3,128], stddev=0.01), name='W1_1') # he 가중치 가로 세로 채널 갯수
L1_1 = tf.nn.conv2d(x,W1_1,strides=[1,1,1,1], padding='SAME')
b1_1 = tf.Variable(tf.ones([128]), name='b1_1') # 편향
L1_1 = L1_1 + b1_1
batch_z1_1 = tf.contrib.layers.batch_norm(L1_1, scale=True, is_training=training) # 배치정규화
y1_1_relu = tf.nn.leaky_relu(batch_z1_1) # relu
#%%
# conv1_2
W1_2 = tf.Variable(tf.random_normal(shape=[3,3,128,128], stddev=0.01), name='W1_2') # he 가중치
L1_2 = tf.nn.conv2d(y1_1_relu,W1_2,strides=[1,1,1,1], padding='SAME')
b1_2 = tf.Variable(tf.ones([128]), name='b1_2') # 편향
L1_2 = L1_2 + b1_2
batch_z1_2 = tf.contrib.layers.batch_norm(L1_2, scale=True, is_training=training) # 배치정규화
y1_2_relu = tf.nn.leaky_relu(batch_z1_2) # relu
L1_2 = tf.nn.max_pool(y1_2_relu, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
# conv2_1
W2_1 = tf.Variable(tf.random_normal(shape=[3,3,128,256], stddev=0.01), name='W2_1') # he 가중치
L2_1 = tf.nn.conv2d(L1_2,W2_1,strides=[1,1,1,1], padding='SAME')
b2_1 = tf.Variable(tf.ones([256]), name='b2_1') # 편향
L2_1 = L2_1 + b2_1
batch_z2_1 = tf.contrib.layers.batch_norm(L2_1, scale=True, is_training=training) # 배치정규화
y2_1_relu = tf.nn.leaky_relu(batch_z2_1) # relu
# conv2_2
W2_2 = tf.Variable(tf.random_normal(shape=[3,3,256,256], stddev=0.01), name='W2_2') # he 가중치
L2_2 = tf.nn.conv2d(y2_1_relu,W2_2,strides=[1,1,1,1], padding='SAME')
b2_2 = tf.Variable(tf.ones([256]), name='b2_2') # 편향
L2_2 = L2_2 + b2_2
batch_z2_2 = tf.contrib.layers.batch_norm(L2_2, scale=True, is_training=training) # 배치정규화
y2_2_relu = tf.nn.leaky_relu(batch_z2_2) # relu
L2_2 = tf.nn.max_pool(y2_2_relu, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
# conv3_1
W3_1 = tf.Variable(tf.random_normal(shape=[3,3,256,512], stddev=0.01), name='W3_1') # he 가중치
L3_1 = tf.nn.conv2d(L2_2,W3_1,strides=[1,1,1,1], padding='SAME')
b3_1 = tf.Variable(tf.ones([512]), name='b3_1') # 편향
L3_1 = L3_1 + b3_1
batch_z3_1 = tf.contrib.layers.batch_norm(L3_1, scale=True, is_training=training) # 배치정규화
y3_1_relu = tf.nn.leaky_relu(batch_z3_1) # relu
# conv3_2
W3_2 = tf.Variable(tf.random_normal(shape=[3,3,512,512], stddev=0.01), name='W3_2') # he 가중치
L3_2 = tf.nn.conv2d(y3_1_relu,W3_2,strides=[1,1,1,1], padding='SAME')
b3_2 = tf.Variable(tf.ones([512]), name='b3_2') # 편향
L3_2 = L3_2 + b3_2
batch_z3_2 = tf.contrib.layers.batch_norm(L3_2, scale=True, is_training=training) # 배치정규화
y3_2_relu = tf.nn.leaky_relu(batch_z3_2) # relu
L3_2 = tf.nn.max_pool(y3_2_relu, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
#%%
# FC1
W4 = tf.get_variable(name='W4', shape=[4*4*512, hidden_layer1], initializer=tf.contrib.layers.variance_scaling_initializer()) # he 가중치
b4 = tf.Variable(tf.ones([hidden_layer1]), name='b4') # 편향
L4 = tf.reshape(L3_2,[-1,4*4*512])
y4= tf.matmul(L4,W4) + b4 # 내적
batch_z4 = tf.contrib.layers.batch_norm(y4, scale=True, is_training=training) # 배치정규화
y4_relu = tf.nn.leaky_relu(batch_z4) # relu
r4_drop = tf.nn.dropout(y4_relu, keep_prob)
#FC2
W5 = tf.get_variable(name='W5', shape=[hidden_layer1, hidden_layer2], initializer=tf.contrib.layers.variance_scaling_initializer()) # he 가중치
b5 = tf.Variable(tf.ones([hidden_layer2]), name='b5') # 편향
y5= tf.matmul(r4_drop,W5) + b5 # 내적
batch_z5 = tf.contrib.layers.batch_norm(y5, scale=True, is_training=training) # 배치정규화
y5_relu = tf.nn.leaky_relu(batch_z5) # relu
r5_drop = tf.nn.dropout(y5_relu, keep_prob)
#%%
# output
W6 = tf.get_variable(name='W6', shape=[hidden_layer2, 2], initializer=tf.contrib.layers.variance_scaling_initializer())
b6 = tf.Variable(tf.ones([2]), name='b6')
y6= tf.matmul(r5_drop,W6) + b6
y_hat = tf.nn.softmax(y6)
y_predict = tf.argmax(y_hat, axis=1) # 예측값을 추출
correction_prediction = tf.equal( y_predict, y_label ) # 비교
accuracy = tf.reduce_mean( tf.cast( correction_prediction, 'float' ) ) # 정확도 출력
loss = -tf.reduce_sum( y_onehot*tf.log(y_hat), axis=1 ) # 손실함수
#optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
#train = optimizer.minimize(loss)
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
# Ensures that we execute the update_ops before performing the train_step
train = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
#훈련_실행부
init = tf.global_variables_initializer()
train_acc_list = []
test_acc_list = []
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(init)
for i in range(1,73*20):
trainX, trainY = loader4.shuffle_batch(trainX, trainY)
testX, testY = loader4.shuffle_batch(testX, testY)
train_xs, train_ys = loader4.next_batch(trainX, trainY,0,100)
test_xs, test_ys = loader4.next_batch(testX, testY,0,100)
sess.run(train, feed_dict={x: train_xs, y_onehot: train_ys, keep_prob:0.9, training:True})
if i % 73 == 0:
print ( i/73 , 'train ecpo acc:' ,sess.run(accuracy,feed_dict={x:train_xs, y_onehot: train_ys, keep_prob:1.0, training:False}))
# accuracy 에서는 train 도 training을 False 로 해줘야 한다. 안그러면 배치정규화 또 시키는거고, 값이 갱신된다. 앞의 교육 무의
print ( i/73 , 'test ecpo acc:' ,sess.run(accuracy,feed_dict={x:test_xs, y_onehot: test_ys, keep_prob:1.0, training:False}))
■ 이상으로 deeplearning 종료
학습시킨 데이터들
1. mnist
2. cifar 10
3. 개/고양이
4. 정상폐/ 폐결절
5. 이파리사진(상품의 표지의 기스 여부 확인)
'tensorflow' 카테고리의 다른 글
4. 실습-개고양이 (0) | 2019.03.31 |
---|---|
3. 텐써플로우 다층신경망 구성 (0) | 2019.03.31 |
2. 텐써플로우 단층신경망 구성 (0) | 2019.03.31 |
1. 텐써플로우 소개 (0) | 2019.03.31 |