Python을 사용한 AI – 딥 러닝
인공 신경망 (ANN)은 효율적인 컴퓨팅 시스템으로, 그 중심 주제는 생물학적 신경망의 비유에서 차용되었습니다. 신경망은 기계 학습을위한 모델의 한 유형입니다. 1980 년대 중반과 1990 년대 초에 신경망에서 많은 중요한 아키텍처 발전이 이루어졌습니다. 이 장에서는 AI의 접근 방식 인 딥 러닝에 대해 자세히 알아 봅니다.
딥 러닝은 10 년의 폭발적인 컴퓨팅 성장을 통해이 분야의 심각한 경쟁자로 부상했습니다. 따라서 딥 러닝은 알고리즘이 인간 두뇌의 구조와 기능에서 영감을받은 특정한 종류의 기계 학습입니다.
기계 학습 대 딥 러닝
딥 러닝은 요즘 가장 강력한 머신 러닝 기술입니다. 문제를 해결하는 방법을 배우면서 문제를 표현하는 가장 좋은 방법을 배우기 때문에 매우 강력합니다. 딥 러닝과 머신 러닝의 비교는 다음과 같습니다.
데이터 종속성
첫 번째 차이점은 데이터 규모가 증가 할 때 DL 및 ML의 성능을 기반으로합니다. 데이터가 크면 딥 러닝 알고리즘이 매우 잘 수행됩니다.
기계 의존성
딥 러닝 알고리즘이 완벽하게 작동하려면 고급 머신이 필요합니다. 반면에 기계 학습 알고리즘은 저사양 기계에서도 작동 할 수 있습니다.
특징 추출
딥 러닝 알고리즘은 높은 수준의 기능을 추출하고 동일한 기능을 통해 학습을 시도 할 수 있습니다. 반면에 기계 학습으로 추출 된 대부분의 기능을 식별하려면 전문가가 필요합니다.
실행 시간
실행 시간은 알고리즘에 사용되는 수많은 매개 변수에 따라 다릅니다. 딥 러닝은 머신 러닝 알고리즘보다 더 많은 매개 변수를 가지고 있습니다. 따라서 DL 알고리즘의 실행 시간, 특히 훈련 시간은 ML 알고리즘보다 훨씬 깁니다. 그러나 DL 알고리즘의 테스트 시간은 ML 알고리즘보다 적습니다.
문제 해결에 대한 접근
딥 러닝은 문제를 엔드 투 엔드로 해결하는 반면, 머신 러닝은 문제를 여러 부분으로 분할하여 문제를 해결하는 전통적인 방법을 사용합니다.
컨볼 루션 신경망 (CNN)
컨볼 루션 신경망은 학습 가능한 가중치와 편향을 가진 뉴런으로 구성되기 때문에 일반 신경망과 동일합니다. 일반 신경망은 입력 데이터의 구조를 무시하고 모든 데이터를 네트워크에 공급하기 전에 1 차원 배열로 변환합니다. 이 프로세스는 일반 데이터에 적합하지만 데이터에 이미지가 포함 된 경우 프로세스가 번거로울 수 있습니다.
CNN은이 문제를 쉽게 해결합니다. 이미지를 처리 할 때 이미지의 2D 구조를 고려하여 이미지에 특정한 속성을 추출 할 수 있습니다. 이러한 방식으로 CNN의 주요 목표는 입력 레이어의 원시 이미지 데이터에서 출력 레이어의 올바른 클래스로 이동하는 것입니다. 일반 NN과 CNN의 유일한 차이점은 입력 데이터 처리와 레이어 유형입니다.
CNN의 아키텍처 개요
구조적으로 일반적인 신경망은 입력을 받아 일련의 숨겨진 레이어를 통해 변환합니다. 모든 층은 뉴런의 도움으로 다른 층에 연결됩니다. 일반 신경망의 가장 큰 단점은 전체 이미지로 잘 확장되지 않는다는 것입니다.
CNN의 아키텍처에는 너비, 높이 및 깊이라는 3 차원으로 배열 된 뉴런이 있습니다. 현재 계층의 각 뉴런은 이전 계층의 출력의 작은 패치에 연결됩니다. 오버레이와 유사합니다.×입력 이미지를 필터링합니다. 그것은 사용합니다M모든 세부 사항을 확인하는 필터입니다. 이들M 필터는 모서리, 모서리 등과 같은 기능을 추출하는 기능 추출기입니다.
CNN을 구성하는 데 사용되는 레이어
다음 레이어는 CNN을 구성하는 데 사용됩니다-
Input Layer − 원본 이미지 데이터를 그대로 가져옵니다.
Convolutional Layer−이 계층은 대부분의 계산을 수행하는 CNN의 핵심 빌딩 블록입니다. 이 계층은 뉴런과 입력의 다양한 패치 사이의 회선을 계산합니다.
Rectified Linear Unit Layer− 이전 레이어의 출력에 활성화 기능을 적용합니다. 네트워크에 비선형 성을 추가하여 모든 유형의 기능에 잘 일반화 할 수 있습니다.
Pooling Layer− 풀링은 네트워크에서 발전하면서 중요한 부분 만 유지하는 데 도움이됩니다. 풀링 레이어는 입력의 모든 깊이 슬라이스에서 독립적으로 작동하며 공간적으로 크기를 조정합니다. MAX 기능을 사용합니다.
Fully Connected layer/Output layer −이 레이어는 마지막 레이어의 출력 점수를 계산합니다. 결과 출력은 크기입니다.×× , 여기서 L은 훈련 데이터 세트 클래스의 수입니다.
유용한 Python 패키지 설치
당신이 사용할 수있는 Keras, Python으로 작성되었으며 TensorFlow, CNTK 또는 Theno에서 실행할 수있는 고수준 신경망 API입니다. Python 2.7-3.6과 호환됩니다. 자세한 내용은https://keras.io/.
다음 명령을 사용하여 keras를 설치하십시오-
pip install keras
의 위에 conda 환경에서는 다음 명령을 사용할 수 있습니다.
conda install –c conda-forge keras
ANN을 사용하여 선형 회귀 기 구축
이 섹션에서는 인공 신경망을 사용하여 선형 회귀자를 만드는 방법을 배웁니다. 당신이 사용할 수있는KerasRegressor이것을 달성하기 위해. 이 예에서는 Boston의 부동산에 대해 13 개의 숫자가있는 Boston 주택 가격 데이터 세트를 사용합니다. 동일한 Python 코드가 여기에 표시됩니다.
다음과 같이 필요한 모든 패키지를 가져옵니다.
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
이제 로컬 디렉토리에 저장된 데이터 세트를로드합니다.
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values
이제 데이터를 입력 및 출력 변수 즉 X와 Y로 나눕니다.
X = dataset[:,0:13]
Y = dataset[:,13]
기준 신경망을 사용하기 때문에 모델을 정의합니다.
def baseline_model():
이제 다음과 같이 모델을 만듭니다.
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal',
activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))
다음으로, 모델을 컴파일하십시오-
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
이제 다음과 같이 재현성을 위해 랜덤 시드를 수정합니다.
seed = 7
numpy.random.seed(seed)
사용을위한 Keras 래퍼 객체 scikit-learn 회귀 추정기가 호출됨에 따라 KerasRegressor. 이 섹션에서는 표준화 데이터 세트로이 모델을 평가할 것입니다.
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))
위에 표시된 코드의 출력은 보이지 않는 데이터에 대한 문제에 대한 모델의 성능 추정치입니다. 교차 검증 평가의 모든 10 배에 걸친 평균 및 표준 편차를 포함하는 평균 제곱 오차입니다.
이미지 분류기 : 딥 러닝의 응용
컨볼 루션 신경망 (CNN)은 이미지 분류 문제, 즉 입력 이미지가 속한 클래스를 해결합니다. Keras 딥 러닝 라이브러리를 사용할 수 있습니다. 우리는 다음 링크에서 고양이와 강아지 이미지의 훈련 및 테스트 데이터 세트를 사용하고 있습니다.https://www.kaggle.com/c/dogs-vs-cats/data.
다음과 같이 중요한 keras 라이브러리 및 패키지를 가져옵니다.
순차라는 다음 패키지는 신경망을 순차 네트워크로 초기화합니다.
from keras.models import Sequential
다음 패키지는 Conv2D CNN의 첫 번째 단계 인 convolution 연산을 수행하는 데 사용됩니다.
from keras.layers import Conv2D
다음 패키지는 MaxPoling2D CNN의 두 번째 단계 인 풀링 작업을 수행하는 데 사용됩니다.
from keras.layers import MaxPooling2D
다음 패키지는 Flatten 모든 결과 2D 배열을 하나의 긴 연속 선형 벡터로 변환하는 프로세스입니다.
from keras.layers import Flatten
다음 패키지는 Dense CNN의 네 번째 단계 인 신경망의 전체 연결을 수행하는 데 사용됩니다.
from keras.layers import Dense
이제 순차 클래스의 객체를 만듭니다.
S_classifier = Sequential()
이제 다음 단계는 컨볼 루션 부분을 코딩하는 것입니다.
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
여기 relu 정류기 기능입니다.
이제 CNN의 다음 단계는 컨볼 루션 부분 이후 결과 피쳐 맵에 대한 풀링 작업입니다.
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
이제 아첨을 사용하여 풀링 된 모든 이미지를 연속 벡터로 변환합니다.
S_classifier.add(Flatten())
다음으로 완전 연결 계층을 만듭니다.
S_classifier.add(Dense(units = 128, activation = 'relu'))
여기서 128은 은닉 유닛의 수입니다. 은닉 유닛 수를 2의 거듭 제곱으로 정의하는 것이 일반적입니다.
이제 다음과 같이 출력 계층을 초기화하십시오.
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
이제 CNN을 컴파일하고 다음을 구축했습니다.
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
여기서 최적화 매개 변수는 확률 적 경사 하강 법 알고리즘을 선택하는 것이고, 손실 매개 변수는 손실 함수를 선택하는 것이고 메트릭 매개 변수는 성능 지표를 선택하는 것입니다.
이제 이미지 확대를 수행 한 다음 이미지를 신경망에 맞 춥니 다.
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set =
train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
test_set =
test_datagen.flow_from_directory('test_set',target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
이제 우리가 만든 모델에 데이터를 맞 춥니 다.
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)
여기 steps_per_epoch에는 훈련 이미지의 수가 있습니다.
이제 모델이 학습되었으므로 다음과 같이 예측에 사용할 수 있습니다.
from keras.preprocessing import image
test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'