본문 바로가기

tensorflow

5. 실습-폐사진

728x90
반응형

정상 폐사진 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. 이파리사진(상품의 표지의 기스 여부 확인)  

728x90
반응형

'tensorflow' 카테고리의 다른 글

4. 실습-개고양이  (0) 2019.03.31
3. 텐써플로우 다층신경망 구성  (0) 2019.03.31
2. 텐써플로우 단층신경망 구성  (0) 2019.03.31
1. 텐써플로우 소개  (0) 2019.03.31