본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Personal/Book

파이썬으로 따라해보는 딥러닝 AI프로젝트 실사례

Santanu Pattanayak 지음, 용환승 옮김

 

 

방문 및 소스 다운로드

https://github.com/packtpublishing

 

Packt

Providing books, eBooks, video tutorials, and articles for IT developers, administrators, and users. - Packt

github.com

https://github.com/PacktPublishing/Intelligent-Projects-Using-Python

 

GitHub - PacktPublishing/Intelligent-Projects-Using-Python: Intelligent Projects Using Python, published by Packt

Intelligent Projects Using Python, published by Packt - PacktPublishing/Intelligent-Projects-Using-Python

github.com

 

 

사용된 스크린샷/다이어그램 컬러 이미지

https://static.packt-cdn.com/downloads/9781788996921_ColorImages.pdf

 

 

실행중인 코드의 비디오

https://www.youtube.com/playlist?list=PLTgRMOcmRb3MwvkjzAjs_sz2l23rXOaEg

 

Intelligent Projects using Python

 

www.youtube.com

 

 

Chapter 1 AI 기반 시스템의 개요

지능이랑 아직 기계로 할 수 없는것이다. - 래리 테슬러

언어 및 자연어는 한때 복잡한것으로 간주되었지만 AI효과로 최근에는 AI가 아닌 계산문제로 간주된다. 

미래의 어느 시점에 인공지능 시스템이 인간의 지능 수준을 도달할 것이고 그 시점을 인공지능 특이점 이라고 한다. 

많은 사람들이 기계는 결코 인간의 지능 수준에 도달하지 못할것이라고 주장하는데 AI 논리는 사람이 프로그래밍한 지능적인 작업을 배우거나 수행하기 때문이라고 인간이 가지는 의식과 자의식이 없기 때문이나 연구자들은 인간의 의식과 자의식도 주위 환경에서 피드백으로 배우는 무한루프 프로그램과 유사하다는 생각을 제시했다. 

 

신경망

인간의 두뇌에서 영감을 얻은 기계학습 모델. 

신경처리장치를 인공뉴런이라고 하며 인간의 두뇌에서 축색돌기 axon와 같은 기능을 한다. 

연속값을 출력으로 예측하는 형식을 회귀문제라고 한다. 

구조와 당면한 문제의 유형에 따라 여러 종류의 신경 활성유닛이 신경망에 사용된다. 

 

신경활성 유닛

선형 활성유닛(선형), 시그모이드 활성유닛(비선형), 쌍콕 탄젠트 활성화기능

정류 선형 유닛(RelU) 뉴런에 대한 총 입력이 0 보다 크면 RelU출력이 선형이고 음수일경우 출력이 0이다. 

신경망이 포화 또는 사라지는 기울기에 문제가 발생하지 못하게 한다. 음수값에 대한 제로 기울기. 

 

softmax 활성함수

다중등급분류문제의 경우 등급확률을 출력하는데 사용한다.  몇가지 다른 활성함수가 있으며 대부분 기본 버전의 변형이다. 

 

역전파 방버

신경망은 그래디언트 하강 기술을 통해 학습되며 여기서 결합된 가중치 벡터 W는 다음과 같이 반복적으로 업데이트 된다. 

그래디언트 하강을 통해 반복벅으로 비용함수의 최소화를 수행하려면 가중치에 대한 비용 함수의 기울기를 계산해야한다. 

 

컨볼루션 신경망 CNN

이미지 및 오디오 데이터에 가장 적합하다. 입력 이미지는 컨볼루션 레이어를 통과할때 출력 특징 맵이라고 하는 여러개의 출력이미지를 생성한다. 출력 특징맵은 특징들을 감지한다. 신경망을 통해 진행함에 따라 컨볼루션 레이어는 점점 더 복잡한 특징을 탐지하는 법을 배운다. 이미지는 가장자리 및 색상 구성과 같은 관련 기능을 감지하는데 도움이 되는 컨볼루션 레이어를 통과하며 ReLU 활성함수는 비선형성을 제공한다.  활성계층 다음에 오는 pooling 풀링계층은 많은 양의 변환불변을 제공해 지역주변 정보를 요약한다. 이 컨볼루션 - 활성화 - 풀링 작업은 신경망이 고밀도로 연결되기 전에 여러번 수행된다. 

여러 컨볼루션 - 활성화 - 풀링 작업으로 신경망을 진행하면 이미지의 공간 해상도가 감소하는 반면 모든 레이어에러 출력 특징 맵 수가 증가한다. 일반적인 이미지 처리에 익숙한 독자들을 가우스필터 gaussian filter, 소벨에지 sobel edge 검출 필터 등과 같이 필터의 가중치가 미리 정의된 다른 필터 커널을 사용했을 수도 있다.  컨볼루션 신경망의 장점은 다른 필터 가중치가 훈련과정을 통해 결정된다는 것이다. 

컨볼루션 연산이 입력의 모든 위치에서 필터 커널을 오버레이하는 것을 포함하는 경우 컨볼루션은 하나의 보폭 stride를 갖는데 필터 커널을 오버레이 하는 동안 한 위치를 건너뛰기로 선택하면 두단계를 거쳐 컨볼루션이 수행된다. 1보다 큰 보폭은 컨볼루션 출력의 공간 차원을 줄인다. 

컨볼루션 연산은 각 레이어에서 학습할 가중치의 수를 줄인다. 입력 및 출력 크기가 동일한 컨볼루션 레이어의 경우 필터 커널의 가중치만 알아야한다.

로컬 공간 부근 이미지 및 오디오와 같은 구조가 단순화가 작동한다. 입력 이미지는 여러 계층으 컨볼루션 및 풀링 작업을 통과해 신경망이 진행됨에 따라 특징맵의 수가 증가하는 반면 이상도 공간 해상도는 감소한다. 출력 유닛은 현재 작업에 따라 다르며 회귀를 수행하는 경우 출력 활성 유닛은 선형이고 이진분류문제일 경우 출력 유닛은 시그모이드. 멀티클래스 분류의 경우 출력 레이어는 소프트맥스 유닛이다. 

 

재귀신경망 RNN 

순차적 시간적 데이터를 처리하는데 유용하다 .RNN의 경우 함수는 기본적으로 시그모이드 또는 tanh. 입력에 대해 지정된 범위의 값을 포과하여 낮은 기울기를 갖는 채도 문제를 겪는다. 

 

장기단기기억 LSTM 셀

3개의 게이트, 망각, 업데이트 출력 게이트에 의해 셀상태가 조절된다. 셀 상태의 모든 정보가 다음 단계로 전달되는 것은 아니며 다음 단계로 해제되어야 하는 셀 상태의 양은 출력 게이트에 의해 결정된다. 망각 셀 상태를 1에 가깝게 유지할 수 있다면 그래디언트는 거의 감쇄되지않고 LSTM은 사라지는 그래디언트 문제를 겪지않을 것이다. 

 

생성적 적대 신경망 GAN

생성기 G를통해 특정확률 분포를 학습하는 생성모델. 생성기는 주어진 확률 분포에 의해 생성된 것과유사한 샘플을 생성하려고 시도하는 반면 판별기 d는 생성기 g에 생성된 가짜 데이터 샘플을 원래 분포의 데이터 샘플과 구별 하려고 시도한다. 일반적으로 주어진 확률 분포가 주어진 분포의 확률분포와 얼마나 일치하는지 측정하기 위해 KL Kullback-Leibler 발산, jensen dhannon 발산 및 Bhattacharyya 거리와 같은 f-발산척도가 사용된다. GAN은 간단한 과정이 아니며 고려해야할 몇가지 기술적 사항들이 있다. 

 

강화학습

기계 및 에이전트가 특정 작업을 수행해 특정상황 내에서 특정 형태의 보상을 극대화할 수 있는 기계학습의 한분야이다. 강화학습은 감독 및 비지도 학습과는 다르다. 

 - Q러닝

주어진 유한 마르코프 결정 프로세스에 대한 최적 행동선택 정책을 결정하는데 사용된다. 마르코프 결정 프로세스는 상태공간, 액션공간, 즉각보상세트, 현제상태가 주어지면 다음상태의 확률을 현재행동, 할인 율에 의해 정의된다. 

Q-러닝 에이전트는 각 상태에서 장기보상 Q를 극대화하는 행동을 취하려고 한다. 반복 프로세스. 

 - 딥 Q러닝

Q-러닝에서 우리는 일반적으로 유한한 상태와 행동으로 작업한다. 이는 테이블이 Q값과 보상을 보유하기에 충분하다는 것을 의미한다. 심층 신경망은 보편적인 함수 근사기이기때문에 문제를 풀기위해 상태만 사용하여 신경망을 학습학 출력을 모든 작업에 해당하는 Q값으로 가질 수 있다. 강화학습을 사용해 딥 Q러닝을 통해 경주용 자동차를 스스로 운전하도록 훈련할 예정이다 

 

전이학습

한 도메인에서 얻은 지식을 사용하여 다른 도메인의 관련 문제를 해결한다는 개념

딥러닝 모델은 서로 다른 계층 단위 간의 연결 패턴 특성으로 인해 많은 수의 매개변수를 갖는 경향이 있다. 상당한 양의 데이터가 없으면 모델이 과적합 될 수 있다. 

CNN에서 이미지를 처리할때 초기레이어는 컬, 가장자리, 색상 구성 등 매우 일반적인 특징을 감지하느 ㄴ법을 배운다 .네트워크가 깊어질 수록 더 깊은 레이어의 컨볼루션 레이어는 특정 종류 데이터 집합과 관련이 있다. 

 

제한볼츠만머신 RBM Restricted Boltzmann machines

데이터 내부 표현을 학습하는 감독되지않은 기계학습 알고리즘 클래스. 

숨겨진 레이어 입력을 고려할때 보이는 유닛의 출력을 독립적으로 샘플링할 수 있으며 그 반대도 가능하다. 주성분 분석 PCA와 유사하게, RBM은 한 차원에서 은닉계층 h에 의해 제공되는 다른 차원으로 데이터를 표현하는 방법이다. 은닉 레이어의 차수가 가시 레이어 차수보다 작은 경우 RBM은 차원축소작업을 수행한다. 가중치및 바이어스 관련하여 비용 함수의 경사하강에 반복에서 샘플링이 그림에 나타나고 훈련과정을 비싸고 계산적으로 다루기어려워지게한다. 

 

오토인코더

RBM과 마찬가지로 데이터내의 숨겨진 구조를 찾아내는 것을 목표로 하는 무감독 학습 알고리즘 클래스이다. 오토인코더는 입력 변수간의 상호작용을 캡쳐하면서 숨겨진 레이어에서 다른 차원으로 입력을 나타낼 수 있는 신경망. 대부분 숨겨진 레이어의 크기는 입력의 크기보다 작다. 고차원 데이터에 저차원 구조가 있다는 가정.

오토인코더는 잠재적인 데이터 표현 학습, 노이즈 감소 및 특징 탐지와 같은 다양한 목적으로 사용된다. 현재 가변 오토인코더 gan은 이미지 처리를 위한 생성모델로서 매우 인기가 있다. 

 

 

 

 

chapter2 전이학습

 

특정 영역의 작업에서 얻어진 지식을 유사한 영역의 관련 작업에 적용하는 것. 

처음부터 인공신경망을 학습하는것은 적절한 수렴을 위해 초기가중치를 잘 정해야할 필요가 있고 훈련하는데는 많은 데이터를 필요로한다. 

https://standout.tistory.com/1813

 

모델이 학습이 덜됬거나 과하게 됬거나: Underfitting (언더피팅), Overfitting (오버피팅)과 해결방법 -

Underfitting (언더피팅)모델이 충분히 학습되지않은 상태,아직 덜 배운상태.모델이 너무 단순하거나 학습이 부족하거나 특징이 부족할 수있다. 학습이 부족해서 발생한 언더피팅 → 더 학습하면

standout.tistory.com

https://standout.tistory.com/1873

 

파인튜닝(Fine-Tuning): 전이학습시 사전학습된 모델에 새로운 데이터를 추가해 목적에 맞게 다시

파인튜닝(Fine-Tuning)전이학습시 사전학습된 모델에 새로운 데이터를 추가해 목적에 맞게 다시 학습시키는 과정. 일반적인 언어 지식을 의료 법률 금융 등 특정 산업의 전문지식으로 확장할 수 있

standout.tistory.com

 

 

 

 

전이학습과 당뇨성 망막증 진단. 

당뇨성 망막증은 일반적으로 고혈당 수치가 망막의 혈관을 손상시키는 당뇨병 환자에서 바리견된다. 

건강관리에서 당뇨성 망막 병증 탐지는 일반적으로 숙련된 의사가 망막 이미지를 검사하는 수작업 과정이고 이로 인해 진단 과정이 지연되어 치료가 지연되는경우가 많다. 

 

데이터 세트 가져오기 Kaggle

https://www.kaggle.com/c/classroom-diabetic-retinopathy-detection-competition/data

 

Classroom Diabetic Retinopathy Detection Competition

Competition for participants of MIPT "Introduction to machine learning" course.

www.kaggle.com

 

 

 

데이터는 당뇨성 망막증, 경증 당뇨성 망막증, 중증도 당뇨성 망막증, 중증 당뇨성 망막즈 및 증식성 당뇨성 망막증에관한 5가지 등급을 갖는다.  범주형 분류 문제의 경우 다음과같이 레이블이 원핫 인코딩이 되어야한다. 

당뇨성 망막증             [1, 0, 0, 0, 0]

경증 당뇨성 망막증     [0, 1, 0, 0, 0]

중증도 당뇨성 망막증  [0, 0, 1, 0, 0]

중증 당뇨성 망막증     [0, 0, 0, 1, 0]

증식성 당뇨성 망막증  [0, 0, 0, 0, 1]

 

 

클래스 불균형 고려 경증을 제외하고 중증 당뇨성 망막증의 수는 아주 적고, 당뇨성 망막증의 경우 압도적으로 많다 . 심각도가 없는 클래스를 잘  수행하는 것보다 심각도가 높은 클래스를 감지하는것이 더 중요해 더 많은 샘플을 가진 클래스 데이터를 버리고 저빈도 클래스를 업샘플링해 샘플 분포를 균일하게 유지한다.  이미지를 읽되 224*224 크기로 조정하고 affine변환, 회전 이동 크기조정, 반사를 통해 이미지를 생성한다.

			datagen = ImageDataGenerator(
					horizontal_flip = True,
					vertical_flip = True,
					width_shift_range = 0.1,
					height_shift_range = 0.1,
					channel_shift_range=0,
					zoom_range = 0.2,
					rotation_range = 20)
	def train_model(self,train_X,train_y,n_fold=5,batch_size=16,epochs=40,dim=224,lr=1e-5,model='ResNet50'):
		print(">>> train_model() 시작")
		
		model_save_dest = {}
		k = 0
		kf = KFold(n_splits=n_fold, random_state=0, shuffle=True)

		for train_index, test_index in kf.split(train_X):


			k += 1 
			X_train,X_test = train_X[train_index],train_X[test_index]
			y_train, y_test = train_y[train_index],train_y[test_index]
			
			if model == 'Resnet50':
				model_final = self.resnet_pseudo(dim=224,freeze_layers=10,full_freeze='N')
			
			if model == 'VGG16':
				model_final = self.VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N') 
			
			if model == 'InceptionV3':
				model_final = self.inception_pseudo(dim=224,freeze_layers=10,full_freeze='N')
				print(">>> InceptionV3 생성 완료")

			datagen = ImageDataGenerator(
					horizontal_flip = True,
					vertical_flip = True,
					width_shift_range = 0.1,
					height_shift_range = 0.1,
					channel_shift_range=0,
					zoom_range = 0.2,
					rotation_range = 20)
			  
				
			adam = optimizers.Adam(
				# lr=lr, 
				learning_rate=lr,
				beta_1=0.9, beta_2=0.999, epsilon=1e-08
				# , decay=0.0
				)
			model_final.compile(optimizer=adam, loss=["categorical_crossentropy"],metrics=['accuracy'])
			reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.50,
			     		                                  patience=3, min_lr=0.000001)
			
			callbacks = [
						EarlyStopping(monitor='val_loss', patience=10, mode='min', verbose=1),
					    CSVLogger('keras-5fold-run-01-v1-epochs_ib.log', separator=',', append=False),reduce_lr,
						ModelCheckpoint(
								# 'kera1-5fold-run-01-v1-fold-' + str('%02d' % (k + 1)) + '-run-' + str('%02d' % (1 + 1)) + '.check',
								'kera1-5fold-run-01-v1-fold-' + str('%02d' % (k + 1)) + '-run-' + str('%02d' % (1 + 1)) + '.keras',
								monitor='val_loss', mode='min',
								save_best_only=True,
								verbose=1)]
								
			# model_final.fit_generator(datagen.flow(X_train,y_train, batch_size=batch_size),
			model_final.fit(datagen.flow(X_train,y_train, batch_size=batch_size),
				   
			# steps_per_epoch=X_train.shape[0]/batch_size
			steps_per_epoch=X_train.shape[0] // batch_size

			,epochs=epochs,verbose=1,
			validation_data=(X_test,y_test),callbacks=callbacks,
                                          class_weight={0:0.012,1:0.12,2:0.058,3:0.36,4:0.43})
		 
			model_name = 'kera1-5fold-run-01-v1-fold-' + str('%02d' % (k + 1)) + '-run-' + str('%02d' % (1 + 1)) + '.check'
			del model_final
			f = h5py.File(model_name, 'r+')
			# del f['optimizer_weights']
			f.close()
			model_final = keras.models.load_model(model_name)
			model_name1 = self.outdir + str(model) + '___' + str(k) 
			model_final.save(model_name1)
			model_save_dest[k] = model_name1
				
		return model_save_dest

 

 

 

사전훈련된 ResNet50(이미지 인식을 위한 딥 레지던트학습), InceptoinV3(컴퓨터 비전을 위한 시작 아키텍처 재검토) 및 VGG16(대규모 이미지 인식을 위한 매우 깊은 컴볼루션 네트워크) 네트워크를 실험하고 어떤 네트워크가 가장 좋은 결과를 제공하는지 본다 . VGG 아키텍처는 ILSVRC 2014 대회에서 1위

 

 

read_data() 함수에서 file_list = os.listdir(path_class) 일때 file_list의 각각 len을 출력해봤다.

file_list = os.listdir(path_class)
class0 23228
class1 2199
class2 4763
class3 786
class4 638

 

 

 

read_data() 함수 마지막에 아래 코드를 추가해 확인했다.

df = pd.DataFrame(train_y, columns=[
			"class_0",
			"class_1",
			"class_2",
			"class_3",
			"class_4"
		])

		print(df.describe())
train
           class_0      class_1      class_2      class_3      class_4
count  4424.000000  4424.000000  4424.000000  4424.000000  4424.000000
mean      0.226040     0.226040     0.226040     0.177667     0.144213
std       0.418313     0.418313     0.418313     0.382276     0.351346
min       0.000000     0.000000     0.000000     0.000000     0.000000
25%       0.000000     0.000000     0.000000     0.000000     0.000000
50%       0.000000     0.000000     0.000000     0.000000     0.000000
75%       0.000000     0.000000     0.000000     0.000000     0.000000
max       1.000000     1.000000     1.000000     1.000000     1.000000

 

 

 

 

kappa score 0.42

accuracy 0.55

당뇨성 망막증 사용사례는 InceptionV3 버전 전송 학습네트워크를 사용해 최상의 결과를 얻었다.

 

이번에는 분류가 아닌 회귀로, 배치 생성기를 사용해 epoch 파이프라인생성해 메모리를 절약한다. 

모델은 score 0.46, accuracy 0.66을 달성했다. 

 

 

 87 page

 

chapter2 소스 run중 에러해결

에러를해결하며.. 해당 코드는 2015~년대 정도의 코드로 현재는 사용하지않아 분석하기에는 애매하다. 

특히 메모리 로딩방식도 현재 사용하지않는 방식이다. 각 코드를 돌리려면 코드수정이 필요하며 이를 fork한 repo에 commit한다 . '사례' 모음집에 포커스를 맞춰 경험에 집중했다. 

https://standout.tistory.com/1912

 

메모리 부족(MemoryError) : numpy._core._exceptions._ArrayMemoryError:

numpy._core._exceptions._ArrayMemoryError:Unable to allocate 4.43 GiB메모리 부족(MemoryError)NumPy가 한 번에 약 4.43GB의 메모리를 할당하려 했는데 실패했다는 의미WARNING: All log messages before absl::InitializeLog() is called a

standout.tistory.com

https://standout.tistory.com/1913

 

ValueError:Unrecognized keyword arguments passed to Model:{'input': ..., 'outputs': ...} Keras(2.x 초반) 문법 -> Keras3에

ValueError:Unrecognized keyword arguments passed to Model:{'input': ..., 'outputs': ...}Keras(2.x 초반) 문법을 사용해서 난 에러. 현재는 input이 아니라 inputs로 변경되었다. 968/87910968 ━━━━━━━━━━━━━━━

standout.tistory.com

https://standout.tistory.com/1914

 

ModelCheckpoint() 확장자가 반드시 .keras여야한다. + ValueError:The filepath provided must end in `.keras`

+ ValueError:The filepath provided must end in `.keras`Received:kera1-5fold-run-01-v1-fold-02-run-02.check최신 Keras3 에서는 ModelCheckpoint() 모델을 저장할때 확장자가 반드시 .keras여야한다.callbacks = [ EarlyStopping(monitor='val_lo

standout.tistory.com

 

 

 

 

 

 

chapter2