단계 및 예제를 통한 TensorFlow의 CNN 이미지 분류
⚡ 스마트 요약
합성곱 신경망(CNN)은 모든 픽셀에 동일한 가중치를 부여하는 대신 작은 필터를 사용하여 이미지를 스캔하기 때문에 컴퓨터 비전 분야에서 널리 사용됩니다. 이 튜토리얼에서는 각 레이어를 설명하고 TensorFlow를 사용하여 MNIST 숫자 데이터를 분류합니다.
컨볼루션 신경망이란 무엇입니까?
컨볼 루션 신경망컨볼루션 신경망(CNN)은 컴퓨터 비전 분야에서 널리 알려진 방법입니다. 시각 이미지를 분석하는 데 사용되는 심층 신경망의 한 종류이며, 사진이나 비디오에서 객체를 인식하는 데 특히 효과적입니다. 이미지 또는 비디오 인식, 자연어 처리, 추천 시스템 등 다양한 분야에서 활용됩니다.
Archi컨볼루셔널 신경망의 구조
몇 년 전 페이스북을 생각해 보세요. 프로필 사진을 올린 후에는 사진 속 얼굴에 이름을 직접 입력해야 했습니다. 하지만 요즘 페이스북은 컨볼루션 신경망(ConvNet)을 이용해 사진 속 친구를 자동으로 태그합니다.
이미지 분류를 위한 합성 신경망은 이해하기 어렵지 않습니다. 입력 이미지는 합성 단계에서 처리되고 나중에 레이블이 지정됩니다.
일반적인 컨볼루션 신경망(ConvNet) 아키텍처는 아래 그림과 같이 요약할 수 있습니다. 먼저 이미지가 네트워크에 입력되는데, 이를 입력 이미지라고 합니다. 그런 다음 입력 이미지는 일련의 단계를 거치는데, 이 부분이 네트워크의 컨볼루션 연산 과정입니다. 마지막으로 신경망은 이미지에서 숫자를 예측할 수 있습니다.

이미지는 높이와 너비를 가진 픽셀들의 배열로 구성됩니다. 회색조 이미지는 하나의 채널만 가지고 있는 반면, 컬러 이미지는 세 개의 채널(빨강, 초록, 파랑 각각)을 가지고 있습니다. 이 채널들은 서로 겹쳐 쌓여 있습니다. 이 튜토리얼에서는 하나의 채널만 가진 회색조 이미지를 사용합니다. 각 픽셀은 색상의 강도를 나타내는 0에서 255 사이의 값을 가집니다. 예를 들어, 픽셀 값이 0이면 흰색을 나타내고, 255에 가까운 픽셀은 더 어두운 색을 나타냅니다.
저장된 이미지를 살펴보겠습니다. MNIST 데이터세트아래 그림은 왼쪽 그림을 행렬 형식으로 나타내는 방법을 보여줍니다. 원래 행렬은 0과 1 사이의 값으로 표준화되어 있습니다. 어두운 색상의 경우 행렬 값은 약 0.9이고, 흰색 픽셀은 0의 값을 가집니다.
합성 연산
모델에서 가장 중요한 구성 요소는 컨볼루션 레이어입니다. 이 부분은 가중치 계산 속도를 높이고 일반화 성능을 향상시키기 위해 이미지 크기를 줄이는 역할을 합니다.
컨벌루션 부분 동안 네트워크는 이미지의 필수 특징을 유지하고 관련 없는 노이즈를 제외합니다. 예를 들어 모델은 산을 배경으로 한 사진에서 코끼리를 인식하는 방법을 학습합니다. 기존 신경망을 사용하는 경우 모델은 산의 픽셀을 포함하여 모든 픽셀에 중요하지 않고 네트워크를 오도할 수 있는 가중치를 할당합니다.
대신 케 라스 합성곱 신경망은 수학적 기법을 사용하여 이를 구현할 것입니다.trac가장 관련성이 높은 픽셀만 추출합니다. 이러한 수학적 연산을 컨볼루션이라고 합니다. 이 기법을 통해 네트워크는 각 레이어에서 점점 더 복잡한 특징을 학습할 수 있습니다. 컨볼루션은 행렬을 작은 조각으로 나누어 각 조각 내에서 가장 중요한 요소를 학습합니다.
컨볼루셔널 신경망(ConvNet 또는 CNN)의 구성 요소
컨볼루션 신경망은 네 가지 구성 요소로 이루어져 있습니다.
- 회선
- 비선형성(ReLU)
- Pooling 또는 서브 샘플링
- 분류(완전 연결 계층)
회선
컨볼루션의 목적은 다음과 같습니다.trac이미지에서 객체의 특징을 국소적으로 학습한다는 의미입니다. 즉, 신경망이 이미지 내의 특정 패턴을 학습하여 이미지 전체에서 해당 패턴을 인식할 수 있게 된다는 뜻입니다.
컨볼루션은 요소별 곱셈입니다. 개념은 이해하기 쉽습니다. 컴퓨터는 이미지의 일부(일반적으로 3x3 크기)를 스캔하여 필터를 적용합니다. 요소별 곱셈의 결과물을 특징 맵이라고 합니다. 이 과정은 이미지 전체를 스캔할 때까지 반복됩니다. 컨볼루션 후 이미지 크기가 줄어든다는 점에 유의하세요.
아래 다이어그램은 이미지의 한 부분이 필터와 곱해져 특징 맵의 단일 셀을 생성하는 과정을 보여줍니다.
아래 애니메이션은 동일한 컨볼루션이 이미지 전체에 걸쳐 적용되는 것을 보여줍니다.
다양한 필터가 제공됩니다. 아래에 몇 가지 필터를 나열했습니다. 각 필터는 특정 목적을 가지고 있음을 알 수 있습니다. 아래 그림에서 커널은 필터와 같은 의미입니다.
컨볼루션 뒤의 산술
컨볼루션 단계에서는 이미지 내의 작은 픽셀 배열에 필터를 적용합니다. 필터는 일반적으로 3×3 또는 5×5 크기의 윈도우를 따라 입력 이미지를 이동하며, 네트워크는 이러한 윈도우를 입력 이미지 전체에 걸쳐 이동시키면서 컨볼루션 연산을 수행합니다. 아래 애니메이션은 컨볼루션 연산 과정을 보여줍니다. 패치의 크기는 3×3이며, 출력 행렬은 이미지 행렬과 필터 간의 요소별 연산 결과입니다.
출력의 너비와 높이는 입력의 너비와 높이와 다를 수 있습니다. 경계 효과 때문에 발생합니다.
테두리 효과
이 이미지는 5×5 크기의 특징 맵과 3×3 크기의 필터를 가지고 있습니다. 필터가 3×3 격자를 걸러낼 수 있는 창은 중앙에 하나만 있습니다. 출력 특징 맵은 각 축에서 두 타일씩 축소되어 3×3 크기가 됩니다.
입력 행렬과 동일한 출력 행렬 크기를 얻으려면 패딩을 추가해야 합니다. 패딩은 행렬의 양쪽에 적절한 수의 행과 열을 추가하는 것을 의미합니다. 이를 통해 컨볼루션 연산이 모든 입력 타일을 중앙에 맞출 수 있습니다. 아래 이미지에서 입력 행렬과 출력 행렬은 5×5의 동일한 크기를 가지고 있습니다.
네트워크를 정의할 때 컨벌루션된 기능은 세 가지 매개변수로 제어됩니다.
깊이 이 값은 컨볼루션 연산에 적용할 필터의 개수를 정의합니다. 이전 예시에서는 depth가 1이었는데, 이는 필터가 하나만 사용되었음을 의미합니다. 하지만 대부분의 경우 필터는 두 개 이상 사용됩니다. 아래 애니메이션은 필터가 세 개인 경우의 연산 과정을 보여줍니다.
보폭: 스트라이드는 두 슬라이스 사이의 "픽셀 단위 이동" 거리를 정의합니다. 스트라이드가 1이면 윈도우는 1픽셀씩 이동합니다. 스트라이드가 2이면 윈도우는 2픽셀씩 이동합니다. 스트라이드 값을 높이면 특징 맵의 크기가 작아집니다. 아래 두 그림은 스트라이드 1과 2를 비교한 것입니다.
예제 보폭 1
보폭 2
제로 패딩: 패딩은 입력 특징 맵의 양쪽에 해당 개수만큼의 행과 열을 추가하는 연산입니다. 이 경우 출력은 입력과 동일한 차원을 갖습니다.
비선형성(ReLU)
컨볼루션 연산이 끝나면 출력에 활성화 함수를 적용하여 비선형성을 허용합니다. 컨볼루션 신경망에서 일반적으로 사용되는 활성화 함수는 ReLU입니다. 음수 값을 가진 모든 픽셀은 0으로 대체됩니다.
Pooling Opera기
이 단계는 이해하기 쉽습니다. 풀링의 목적은 입력 이미지의 차원을 줄이는 것입니다. 이러한 단계는 연산의 계산 복잡성을 낮추기 위해 수행됩니다. 차원을 줄임으로써 네트워크가 계산해야 할 가중치의 수가 줄어들어 과적합을 방지할 수 있습니다.
이 단계에서는 크기와 스트라이드를 정의해야 합니다. 입력 이미지를 풀링하는 일반적인 방법은 특징 맵의 최댓값을 사용하는 것입니다. 아래 그림을 참조하세요. 풀링은 4×4 특징 맵의 네 개의 부분 행렬을 스캔하고 최댓값을 반환합니다. 풀링은 2×2 배열의 최댓값을 구한 다음 이 윈도우를 두 픽셀씩 이동합니다. 예를 들어 첫 번째 부분 행렬이 [3,1,3,2]이면 풀링은 최댓값인 3을 반환합니다.
평균과 같은 또 다른 풀링 연산이 있습니다.
이 작업은 피처 맵의 크기를 대폭 줄입니다.
완전히 연결된 레이어
마지막 단계는 전통적인 건물을 짓는 것입니다. 인공 신경망 이전 튜토리얼에서 했던 것처럼. 이전 레이어의 모든 뉴런을 다음 레이어에 연결합니다. 소프트맥스 활성화 함수를 사용하여 입력 이미지의 숫자를 분류합니다.
요약 :
TensorFlow 합성곱 신경망은 예측을 하기 전에 여러 레이어를 조합합니다. 신경망은 다음과 같은 특징을 가지고 있습니다.
- 컨볼루셔널 레이어
- ReLU 활성화 함수
- Pooling층
- 조밀하게 연결된 레이어
합성곱 레이어는 이미지의 하위 영역에 서로 다른 필터를 적용합니다. ReLU 활성화 함수는 비선형성을 추가하고, 풀링 레이어는 특징 맵의 차원을 축소합니다.
이 모든 레이어는 다음과 같습니다.trac이미지에서 핵심 정보를 추출합니다. 마지막으로, 특징 맵을 소프트맥스 함수가 적용된 완전 연결 계층에 입력하여 예측을 수행합니다.
TensorFlow로 CNN 훈련하기
이제 컨볼루션 신경망의 구성 요소를 숙지했으므로, 다음 방법을 사용하여 컨볼루션 신경망을 구축할 준비가 되었습니다. TensorFlow. CNN 이미지 분류를 위해 MNIST 데이터세트를 사용하겠습니다.
데이터 준비는 이전 튜토리얼과 동일합니다. 코드를 실행하고 CNN 아키텍처로 바로 이동할 수 있습니다.
CNN을 사용한 이미지 분류를 위해 아래 단계를 따르세요.
- 1단계: 데이터 세트 업로드
- 2단계: 입력 레이어
- 3단계: 컨벌루션 레이어
- 4 단계 : Pooling층
- 5단계: 두 번째 컨벌루션 레이어 및 Pooling 레이어
- 6단계: 조밀층
- 7단계: 로짓 레이어
버전 참고: 아래 목록은 TensorFlow 1.x를 대상으로 합니다. TensorFlow 2에서는 tf.layers 네임스페이스와 tf.estimator.inputs.numpy_input_fn이 더 이상 존재하지 않으며, 이에 상응하는 것은 tf.keras.layers.Conv2D, Max입니다.Pooling2D, Dense, Dropout 레이어를 tf.keras.Model로 조합하고 model.fit()을 사용하여 학습시킵니다. 각 레이어의 작동 방식을 단계별로 설명한 다음, 이를 Keras API에 적용해 보세요.
1단계: 데이터 세트 업로드
MNIST 데이터셋은 scikit-learn을 통해 이용할 수 있습니다. 다운로드하여 Downloads 폴더에 저장해 주세요. `fetch_mldata('MNIST original')` 명령어를 사용하여 업로드할 수 있습니다.
버전 참고: mldata.org 사이트가 폐쇄되었고 scikit-learn 0.22 버전에서 fetch_mldata() 함수가 제거되었습니다. 현재 설치된 scikit-learn에서는 다음 방법으로 동일한 숫자를 불러오세요. 페치_오픈ml 대신 fetch_openml('mnist_784', version=1)을 사용합니다. 나머지 파이프라인은 변경되지 않았습니다.
열차/테스트 세트 생성
train_test_split 함수를 사용하여 데이터셋을 분할해야 합니다.
기능 확장
마지막으로, 아래의 TensorFlow CNN을 사용한 이미지 분류 예제에서처럼 MinMaxScaler를 사용하여 특징 크기를 조정할 수 있습니다.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64)) feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])] X_train_scaled.shape[1:]
CNN 정의
CNN은 기존 신경망이 전역 패턴을 학습하는 것과 달리 이미지의 원본 픽셀에 필터를 적용하여 세부 패턴을 학습합니다. CNN을 구성하려면 다음을 정의해야 합니다.
- 컨볼루션 레이어: 특징 맵에 n개의 필터를 적용합니다. 컨볼루션 후에는 ReLU 활성화 함수를 사용하여 네트워크에 비선형성을 추가해야 합니다.
- Pooling 레이어: 컨볼루션 다음 단계는 특징 맵을 다운샘플링하는 것입니다. 이는 과적합을 방지하고 계산 속도를 향상시키기 위해 특징 맵의 차원을 줄이는 것을 목적으로 합니다. 맥스 풀링은 특징 맵을 하위 영역(일반적으로 2×2 크기)으로 나누고 최댓값만 유지하는 일반적인 기법입니다.
- 완전 연결 레이어: 이전 레이어의 모든 뉴런은 다음 레이어에 연결됩니다. CNN은 컨볼루션 레이어의 특징에 따라 레이블을 분류하고 풀링 레이어로 축소합니다.
CNN 아키텍처
- 컨볼루션 레이어: 14개의 5×5 필터를 적용합니다(예:trac5×5 픽셀 하위 영역으로 나누어 ReLU 활성화 함수를 사용함
- Pooling 레이어: 2×2 필터와 스트라이드 2를 사용하여 최대 풀링을 수행합니다(풀링된 영역이 겹치지 않음을 지정함)
- 컨볼루셔널 레이어: ReLU 활성화 기능과 함께 36개의 5×5 필터 적용
- Pooling 레이어 #2: 다시 2×2 필터와 스트라이드 2를 사용하여 최대 풀링을 수행합니다.
- 1,764개의 뉴런, 드롭아웃 정규화 비율이 0.4(훈련 중에 특정 요소가 삭제될 확률 0.4)
- 밀도 계층(로지트 계층): 10개의 뉴런, 각 숫자 대상 클래스(0-9)에 대해 하나씩.
CNN을 생성하는 데 사용할 세 가지 중요한 모듈이 있습니다.
- 전환2d(). 필터 수, 필터 커널 크기, 패딩 및 활성화 함수를 인수로 사용하여 XNUMX차원 컨볼루셔널 레이어를 구성합니다.
- max_pooling2d(). 최대 풀링 알고리즘을 사용하여 XNUMX차원 풀링 계층을 구성합니다.
- 밀집한(). 은닉층과 단위로 조밀한 층을 구성합니다.
CNN을 구축하는 함수를 정의하게 될 것입니다. 마무리하기 전에 각 구성 요소를 어떻게 만드는지 자세히 살펴보겠습니다.ping 모든 것을 함수 안에 함께 넣어줍니다.
2단계: 입력 레이어
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
데이터의 모양에 따라 텐서를 정의해야 합니다. 이를 위해 tf.reshape 모듈을 사용할 수 있습니다. 이 모듈에서는 형태를 변경할 텐서와 텐서의 형태를 선언해야 합니다. 첫 번째 인수는 함수의 인수에 정의된 데이터의 기능입니다.
이미지는 높이, 너비, 그리고 채널을 가지고 있습니다. MNIST 데이터셋은 28×28 크기의 흑백 이미지입니다. shape 인자에서 배치 크기를 -1로 설정하여 features["x"] 형태를 취하도록 합니다. 이렇게 하면 배치 크기를 조정할 수 있는 하이퍼파라미터로 만들 수 있습니다. 배치 크기를 7로 설정하면 텐서에는 5,488개의 값(28*28*7)이 입력됩니다.
3단계: 컨벌루션 레이어
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
첫 번째 컨볼루션 레이어는 5×5 커널 크기와 동일한 패딩을 가진 14개의 필터로 구성됩니다. 동일한 패딩이란 출력 텐서와 입력 텐서의 높이와 너비가 같아야 함을 의미합니다. TensorFlow는 동일한 크기를 보장하기 위해 행과 열에 0을 추가합니다.
ReLU 활성화 함수를 사용합니다. 출력 크기는 [28, 28, 14]가 됩니다.
4 단계 : Pooling층
컨볼루션 다음 단계는 풀링 연산입니다. 풀링 연산은 데이터의 차원을 축소합니다. `max_pooling2d` 모듈을 2×2 크기와 스트라이드 2로 설정하여 사용할 수 있습니다. 이전 레이어를 입력으로 사용합니다. 출력 크기는 `[batch_size, 14, 14, 14]`가 됩니다.
# first Pooling Layer
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
5단계: 두 번째 컨벌루션 레이어 및 Pooling 레이어
두 번째 컨볼루션 레이어는 36개의 필터를 적용하여 출력 크기를 [batch_size, 14, 14, 36]으로 만듭니다. 풀링 레이어는 이전과 동일한 2×2 윈도우와 스트라이드 2를 사용하므로 각 공간 축을 절반으로 줄이고 출력 형태는 [batch_size, 7, 7, 36]이 됩니다.
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=36,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
6단계: 조밀층
다음으로 완전 연결 레이어를 정의해야 합니다. 피처 맵은 완전 연결 레이어와 연결하기 전에 평면화해야 합니다. 7*7*36 크기의 reshape 모듈을 사용할 수 있습니다.
완전 연결 레이어는 1,764개의 뉴런을 연결합니다. 활성화 함수로는 ReLU를 사용합니다. 또한, 0.3의 비율로 드롭아웃 정규화 항을 추가하여 전체 활성화 값의 30%를 0으로 설정합니다. 드롭아웃은 학습 단계에서만 적용됩니다. `cnn_model_fn` 함수는 `mode`라는 인수를 통해 모델을 학습할지 평가할지 지정할 수 있습니다. 아래 CNN 이미지 분류 TensorFlow 예제를 참고하세요.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
7단계: 로짓 레이어
마지막으로 TensorFlow 이미지 분류 예제에서는 모델의 예측값을 담을 마지막 레이어를 정의할 수 있습니다. 출력 형태는 배치 크기에 목표 클래스의 총 개수인 10을 더한 값과 같습니다.
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)
클래스와 각 클래스의 확률을 담는 딕셔너리를 생성할 수 있습니다. `tf.argmax()` 함수는 로짓 레이어에서 가장 높은 값의 인덱스를 반환합니다. `softmax` 함수는 각 클래스의 확률을 반환합니다.
predictions = {
# Generate predictions
"classes": tf.argmax(input=logits, axis=1),
"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }
모드가 '예측'으로 설정된 경우에만 예측 딕셔너리를 반환하도록 하려면 다음 코드를 추가하세요.
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
다음 단계는 모델의 손실을 계산하는 것입니다. 지난 튜토리얼에서 다중 클래스 모델의 손실 함수는 교차 엔트로피라는 것을 배웠습니다. 다음 코드를 사용하면 손실을 쉽게 계산할 수 있습니다.
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
TensorFlow CNN 예제의 마지막 단계는 모델을 최적화하는 것, 즉 최적의 가중치 값을 찾는 것입니다. 이를 위해 학습률 0.001의 경사 하강법 최적화 알고리즘을 사용합니다. 목표는 손실을 최소화하는 것입니다.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
CNN 모델링은 완료되었습니다. 하지만 평가 모드에서 성능 지표를 표시하고 싶습니다. 다중 클래스 모델의 성능 지표는 정확도입니다. TensorFlow에는 레이블과 예측값, 두 개의 인수를 받는 정확도 모듈이 있습니다.
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
그게 다야. 첫 번째 CNN을 만들었고 모델을 훈련하고 평가하는 데 사용하기 위해 모든 것을 함수로 래핑할 준비가 되었습니다.
def cnn_model_fn(features, labels, mode): """Model function for CNN.""" # Input Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) # Dense Layer pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = tf.layers.dense(inputs=dropout, units=10) predictions = { # Generate predictions (for PREDICT and EVAL mode) "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") } if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) # Calculate Loss loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) # Configure the Training Op (for TRAIN mode) if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # Add evaluation metrics Evaluation mode eval_metric_ops = { "accuracy": tf.metrics.accuracy( labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
조립 기능에 대한 참고 사항: 위의 래핑된 버전은 첫 번째 컨볼루션 레이어의 필터를 32개, 드롭아웃을 0.4로 설정하는 반면, 단계별 코드 조각은 필터 14개와 드롭아웃 0.3을 사용합니다. 두 코드 모두 실행되지만, 출력되는 도형이 레이어 테이블과 일치하도록 한 쌍의 값을 선택하여 일관되게 유지하십시오.
아래 단계는 이전 튜토리얼과 동일합니다.
먼저, 이미지 분류를 위해 CNN 모델을 사용하여 추정기를 정의합니다.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
CNN은 학습에 오랜 시간이 걸리므로, 50번의 반복마다 소프트맥스 레이어의 값을 저장하는 로깅 훅을 생성합니다.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
이제 모델을 평가할 준비가 되었습니다. 배치 크기를 100으로 설정하고 데이터를 섞습니다. 참고로, 학습 단계를 16,000으로 설정했으므로 학습에 상당한 시간이 소요될 수 있습니다. 인내심을 가져주세요.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=100, num_epochs=None, shuffle=True) mnist_classifier.train( input_fn=train_input_fn, steps=16000, hooks=[logging_hook])
모델 학습이 완료되었으므로 이제 모델을 평가하고 결과를 출력할 수 있습니다.
# Evaluate the model and print results eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, num_epochs=1, shuffle=False) eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) print(eval_results)
평가 결과는 복원된 체크포인트, 중단된 단계, 그리고 최종 메트릭 사전을 출력합니다.
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269 {'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}
현재 아키텍처에서 평가 사전은 0.9689286, 즉 약 97%의 정확도를 보고합니다. 아키텍처, 배치 크기 및 반복 횟수를 변경하여 정확도를 향상시킬 수 있습니다. CNN은 기존 방식보다 훨씬 뛰어난 성능을 보였습니다. 인공 신경망 또는 로지스틱 회귀의 경우, 인공 신경망 튜토리얼에서 96%의 정확도를 보였는데, 이는 CNN보다 낮은 수치입니다. CNN은 이미지 데이터셋이 클수록 계산 속도와 정확도 면에서 인상적인 성능을 보여줍니다.











