컨볼루션 신경망이란 무엇인가요? 엔지니어 가이드**

컨볼루션 신경망이란 무엇인가요? 엔지니어 가이드**
컨볼루션 신경망](https://zilliz.com/glossary/convolutional-neural-network)(CNN)은 이미지, 동영상, 때로는 오디오 파일과 같은 시각적 데이터에 맞춤화된 딥러닝 모델입니다.
CNN은 컴퓨터 비전, 이미지 분석 및 처리, 객체 감지, 심지어 자연어 처리(NLP)와 같은 분야를 변화시켰습니다.
MLP(다층 퍼셉트론)](https://machinelearningmastery.com/neural-networks-crash-course/) 또는 완전 연결 네트워크와 같은 기존의 신경망은 이미지 데이터를 평면 벡터로 취급하므로 시각 데이터에 존재하는 공간 정보를 다룰 때 제한적일 수 있습니다. 이는 잘못된 가정(귀납적 편향)으로 인해 정확도가 떨어질 수 있습니다.
CNN은 이미지 데이터의 픽셀의 로컬 연결성 및 콘텐츠와 같은 이미지 구조를 보존함으로써 이러한 문제를 해결하여 패턴 인식에 효율적입니다.
이 게시물에서는 CNN의 장점을 강조하고, 그 아키텍처를 설명하며, CNN 모델을 설계하는 간단한 예제를 제공합니다.
CNN을 사용하는 주요 이유****
CNN은 원시 시각 데이터에서 의미 있는 특징을 추출하는 데 탁월하며, 기존의 신경망보다 성능이 뛰어납니다. CNN을 사용하는 이유는 다음과 같습니다:
파라미터 공유 CNN은 입력의 여러 영역에서 동일한 파라미터 세트를 공유하므로 고차원 데이터의 숨겨진 패턴을 효율적으로 식별하는 데 도움이 됩니다.
파라미터 수 감소 - CNN은 풀링 및 컨볼루션 기법을 사용하여 완전히 연결된 네트워크에 비해 파라미터 수를 크게 줄입니다.
계층적 특징 학습 - CNN은 인간 시각 시스템의 계층적 구조를 모방합니다.
최첨단 성능-CNN은 물체 감지, 이미지 처리, 음성 인식, 이미지 분할과 같은 작업에서 기존 신경망보다 지속적으로 뛰어난 성능을 발휘합니다. 최근 컴퓨터 비전의 발전으로 컨볼루션 및 비컨볼루션 트랜스포머도 도입되었습니다.
컨볼루션 신경망의 장단점 ## 컨볼루션 신경망의 장단점
CNN이 컴퓨터 비전의 판도를 바꾼 것은 사실이지만, 장단점을 모두 알아야 합니다. CNN의 장단점에 대해 자세히 알아보겠습니다:
컨볼루션 신경망의 장점:
- 패턴 및 특징 감지: CNN은 이미지, 동영상, 오디오 신호에서 패턴과 특징을 감지하는 데 탁월합니다. 계층적 구조를 통해 원시 데이터에서 복잡한 특징을 학습할 수 있습니다.
- 변환에 대한 불변성: CNN은 이동, 회전, 크기 조정에 불변합니다. 즉, 이미지의 위치, 방향 또는 크기가 달라져도 물체를 인식할 수 있습니다.
- 자동 특징 추출: CNN을 사용하면 엔드 투 엔드 학습이 가능하므로 수동으로 특징을 추출할 필요가 없습니다. 네트워크는 원시 입력 데이터에서 직접 관련 특징을 찾는 방법을 학습합니다.
- 확장성 및 정확성: CNN은 대량의 데이터를 처리할 수 있으며 복잡한 작업에서도 정확합니다. 더 많은 데이터가 주어질수록 일반적으로 성능이 향상됩니다.
컨볼루션 신경망의 단점:
계산 비용: CNN을 훈련하려면 계산 비용이 많이 들고 많은 메모리가 필요합니다. 이는 GPU와 같은 특수 하드웨어 없이는 구현하기 어려울 수 있습니다.
과적합: 충분한 데이터나 적절한 정규화 기법이 제공되지 않으면 CNN이 과적합할 수 있습니다. 즉, 학습 데이터에서는 잘 작동하지만 보이지 않는 새로운 데이터에는 일반화하지 못한다는 뜻입니다.
데이터 요구 사항: CNN은 학습을 위해 대량의 라벨링된 데이터가 필요합니다. 레이블이 지정된 데이터가 부족하거나 비용이 많이 드는 도메인에서는 이것이 큰 제약이 될 수 있습니다.
해석 가능성: CNN이 학습한 내용을 해석하기는 어렵습니다. 딥러닝 모델의 '블랙박스' 특성으로 인해 예측의 추론을 이해하기 어렵기 때문에 민감한 애플리케이션에서는 문제가 될 수 있습니다.
이러한 장단점을 이해하는 것은 특정 작업에 CNN을 사용할지 여부를 결정할 때와 CNN 기반 솔루션을 설계하고 구현할 때 매우 중요합니다.
CNN의 일반적인 정규화 기법 ## CNN의 일반적인 정규화 기법
단점에서도 언급했듯이 CNN은 특히 제한된 데이터로 작업할 때 과적합이 발생하기 쉽습니다. 정규화 기법은 CNN이 학습 데이터를 과적합하는 것을 방지하기 위해 사용되며, 이를 통해 모델은 보이지 않는 데이터에 대해 더 잘 일반화할 수 있습니다. 다음은 CNN에 사용되는 몇 가지 일반적인 정규화 기법입니다:
드롭아웃: 이 기법은 학습 중에 레이어의 일부 출력 특징을 무작위로 "드롭아웃"(즉, 0으로 설정)합니다. 드롭아웃은 네트워크가 단일 뉴런에 의존하지 않는 보다 강력한 특징을 학습하도록 합니다. 이렇게 하면 네트워크가 뉴런의 특정 가중치에 덜 민감해지고 결과적으로 일반화가 더 잘 이루어집니다. 테스트 중에는 모든 뉴런이 사용되지만 훈련 중에는 누락된 뉴런을 보완하기 위해 출력이 축소됩니다.
L1 정규화: 올가미 정규화라고도 하는 L1 정규화는 가중치의 절대값에 비례하는 손실 함수에 페널티 항을 추가합니다. 이 기법은 일부 가중치를 0으로 밀어냄으로써 모델의 희소성을 장려합니다. L1 정규화는 덜 중요한 기능을 제거하여 더 단순한 모델을 만들고자 할 때 유용합니다.
L2 정규화: 릿지 정규화라고도 하는 L2 정규화는 손실 함수에 가중치의 제곱에 비례하는 페널티 항을 추가합니다. 이 기술은 큰 가중치를 억제하고 가중치 값을 보다 균등하게 분산시킵니다. L2 정규화는 L1처럼 희박한 모델을 만들지는 않지만 관련성이 낮은 특징의 영향을 줄이는 데 도움이 될 수 있습니다.
L1과 L2 모두 가중치 수를 줄이고 네트워크를 더 효율적으로 만들 수 있습니다. L1과 L2 중 어떤 것을 선택할지는 문제와 데이터 세트에 따라 달라집니다(또는 이 둘을 조합한 것을 Elastic Net 정규화라고 합니다).
이러한 정규화 기법을 적절히 사용하면 현재 딥 러닝과 머신 러닝의 가장 큰 문제 중 하나를 해결할 수 있습니다.
CNN 아키텍처와 작동 방식****
CNN은 뛰어난 기능을 갖추고 있어 이러한 네트워크가 숨겨진 패턴을 찾아내고 시각적 데이터를 매우 정확하게 해독할 수 있도록 지원합니다.
인간의 신경계는 여러 층으로 구성되어 있으며, 각 층은 고유한 기능을 수행합니다. CNN은 유사한 아키텍처를 가지고 있으며, 각 계층은 입력 이미지에서 서로 다른 특징을 추출합니다. 아래는 CNN 아키텍처에 관련된 모든 계층에 대한 자세한 설명입니다.
처음 몇 개의 레이어는 컨볼루션 레이어로, 가장자리와 모양과 같은 이미지의 기본 특징을 추출하는 역할을 담당합니다.
다음 몇 개의 레이어는 풀링 레이어로, 피처 맵의 크기를 줄이는 역할을 하는 출력 레이어입니다.
마지막으로 마지막 레이어는 이미지를 주어진 카테고리 중 하나로 분류하는 역할을 하는 FC(완전히 연결된) 레이어입니다.
거의 모든 최신 순수 컨볼루션 아키텍처는 마지막에 하나의 글로벌 풀링 레이어와 완전히 연결된 하나의 레이어만 있습니다.
컨볼루션 레이어
컨볼루션 레이어는 입력 데이터에서 고유한 패턴을 찾도록 설계된 CNN의 핵심입니다. 입력 이미지를 가져와 일련의 필터를 적용하여 특징 맵이라는 결과물을 생성합니다. 필터는 입력 이미지를 스캔하여 다양한 패턴을 식별하는 작은 가중치 매트릭스입니다. 필터는 이미지를 가로질러 이동할 때 보폭(각 단계에서 필터가 이동하는 픽셀 수)으로 정의된 단계에 따라 이동합니다. 때로는 입력 주위에 픽셀을 추가하여 출력 크기를 제어하기 위해 패딩을 사용하기도 합니다. 패딩에는 유효한 패딩, 제로 패딩(패딩 없음), 동일한 패딩(출력 크기가 입력 크기와 같음), 전체 패딩(출력 크기가 증가함) 등 다양한 유형이 있습니다. 컨볼루션 연산 후에는 모델에 비선형성을 도입하기 위해 비선형 활성화 함수(일반적으로 ReLU(정류 선형 단위)가 적용됩니다.
더 많은 컨볼루션 레이어
앞서 언급했듯이, 첫 번째 컨볼루션 레이어 뒤에 또 다른 컨볼루션 레이어가 올 수 있습니다. 이렇게 되면 이후 레이어가 이전 레이어의 수신 필드 내의 픽셀을 볼 수 있기 때문에 CNN은 계층 구조가 됩니다. 이러한 계층적 구조를 통해 네트워크의 숨겨진 레이어는 데이터가 레이어를 통과하면서 더 복잡한 특징을 학습할 수 있습니다.
이미지에서 사람의 얼굴을 인식하고 싶다고 가정해 봅시다. 얼굴을 다양한 특징의 조합으로 생각할 수 있습니다. 눈, 코, 입, 눈썹 등이 바로 그것입니다. 얼굴의 각 개별 특징은 신경망에서 하위 수준의 패턴이며, 이러한 특징의 조합은 CNN의 시각 피질에서 특징 계층인 상위 수준의 패턴입니다.
첫 번째 컨볼루션 계층에서 네트워크는 가장자리, 곡선 및 기본 모양과 같은 간단한 특징을 감지하는 방법을 학습할 수 있습니다. 이러한 특징은 얼굴 특징의 윤곽이나 얼굴의 다른 부분 간의 대비가 될 수 있습니다.
두 번째 레이어 이미지 분류는 이러한 기본 특징을 결합하여 더 복잡한 모양을 인식할 수 있습니다. 예를 들어 원형 모양(눈)이나 곡선(입이나 눈썹의 윤곽선)을 감지할 수 있습니다.
이후 레이어에서 네트워크는 이전 레이어의 패턴을 결합하여 전체 얼굴 특징을 인식하기 시작할 수 있습니다. 한 뉴런은 눈과 같은 구조를 감지하면 작동하고, 다른 뉴런은 코와 같은 패턴을 감지하면 작동할 수 있습니다.
최종 레이어에서 CNN은 이러한 모든 얼굴 특징을 결합하여 얼굴 전체를 인식합니다. 이 단계에서 네트워크는 개별 특징을 감지하는 것이 아니라 얼굴의 맥락에서 이러한 특징이 서로 어떻게 연관되어 있는지 이해합니다.
마지막으로 컨볼루션 레이어는 이미지를 숫자 값으로 변환하여 신경망이 입력 이미지를 해석하고 다양한 추상화 수준에서 패턴을 추출할 수 있도록 합니다. 이러한 계층적 특징 학습은 얼굴과 같은 복잡한 다중 구성 요소를 이해하는 이미지 인식 작업에서 CNN의 주요 강점 중 하나입니다.
풀링 레이어
컨볼루션 레이어 다음에는 풀링 레이어가 있습니다. 이 풀링 레이어의 목적은 가장 중요한 특징들을 보존하면서 특징 맵의 크기를 줄이는 것입니다(다운샘플링). 이렇게 하면 계산 복잡성을 줄이고 과적합을 제어하는 데 도움이 됩니다. 풀링 기법에는 피처 맵의 작은 영역에서 최대값을 취하는 최대 풀링과 작은 영역에서 평균값을 취하는 평균 풀링이라는 두 가지 일반적인 풀링 기법이 있습니다.
완전 연결(FC) 레이어
CNN의 최종 레이어는 일반적으로 CNN의 출력을 분류하는 완전 연결 레이어입니다. 이 레이어는 기존 신경망 레이어와 유사하며, 이전 레이어의 모든 뉴런에 연결됩니다. 최종 분류 또는 회귀 작업을 수행하기 위해 컨볼루션 계층에서 학습한 상위 수준의 특징을 사용합니다.
컨볼루션 신경망의 아키텍처.png
필수 용어
CNN으로 작업할 때는 몇 가지 필수 용어를 이해하는 것이 중요합니다. 에포크는 전체 훈련 데이터 세트를 한 번 완전히 통과하는 것을 의미합니다. 드롭아웃은 훈련 과정에서 뉴런을 무작위로 삭제하여 과적합을 방지하는 데 사용되는 기법입니다. 스토캐스틱 뎁스는 훈련 중에 잔여 블록을 무작위로 삭제하여 네트워크를 단축하는 또 다른 방법입니다.
스텝 - 필터가 컨볼루션 연산 중에 취하는 스텝 크기로 알려져 있습니다.
패딩 - CNN에서 패딩은 컨볼루션 후 공간 차원을 유지하기 위해 이미지의 테두리 주위에 0을 추가하는 것입니다. 이는 이미지가 축소되는 것을 방지하고 각 컨볼루션 연산 후 정보 손실을 방지하기 위해 수행됩니다.
**전체 훈련 데이터 세트를 한 번 완전히 통과합니다.
드롭아웃(정규화)-트레이닝 중에 뉴런을 무작위로 삭제하여 네트워크가 더 많은 뉴런에 의존하지 않고 학습하도록 하여 과적합을 방지하는 기술입니다.
스토캐스틱 깊이 - 훈련 중 잔여 블록을 무작위로 삭제하고 스킵 연결을 통해 변환을 우회하여 네트워크를 단축합니다. 한편, 테스트 시에는 전체 네트워크를 사용하여 예측을 수행합니다. 그 결과 테스트 오류가 개선되고 훈련 시간이 크게 단축됩니다.
컨볼루션 신경망의 종류 ## 컨볼루션 신경망의 종류
합성곱 신경망의 역사와 발전은 수십 년 전으로 거슬러 올라가며 많은 연구자들이 이에 기여해 왔습니다. 이러한 역사를 이해하면 CNN의 현재 상태를 이해하는 데 도움이 됩니다.
역사적 근거
쿠니히코 후쿠시마는 1980년 계층적 다층 인공 신경망인 '네오코그니트론'에 대한 연구로 CNN의 기초를 닦았습니다. 이 초기 모델은 강력한 시각적 패턴 인식을 학습할 수 있었습니다.
얀 르쿤은 1989년 "역전파 필기 우편번호 인식에 적용"이라는 논문으로 또 한 번 중요한 공헌을 했습니다. 르쿤은 손으로 쓴 우편번호의 패턴을 인식하도록 신경망을 훈련시키는 데 역전파를 적용했습니다. 이는 신경망의 실제 적용을 향한 큰 발걸음이었습니다.
LeNet-5: 최초의 CNN 아키텍처
LeCun과 그의 팀은 1990년대까지 연구를 계속하여 마침내 1998년 LeNet-5를 개발했습니다. LeNet-5는 초기 작업의 원리를 문서 인식에 적용했습니다. 이는 최초의 CNN 아키텍처이자 향후 모든 작업의 기초로 간주됩니다.
CNN 아키텍처의 진화 ### CNN 아키텍처의 진화
LeNet-5 이후 다양한 변형 CNN 아키텍처가 개발되었습니다. MNIST 및 CIFAR-10과 같은 새로운 데이터 세트와 ImageNet 대규모 시각 인식 챌린지(ILSVRC)와 같은 대회가 이러한 혁신의 대부분을 주도했습니다. 개발된 주목할 만한 CNN 아키텍처는 다음과 같습니다:
AlexNet: 알렉스 크리제프스키, 일리야 수츠케버, 제프리 힌튼이 개발한 AlexNet은 ILSVRC 2012에서 우승했습니다. 이전 CNN보다 더 깊고 넓으며 정규화를 위해 ReLU 활성화와 드롭아웃을 사용했습니다.
VGGNet: 옥스퍼드의 시각 기하학 그룹에서 개발한 VGGNet은 단순함과 깊이로 유명합니다. 네트워크 전체에 걸쳐 작은 3x3 컨볼루션 필터를 사용합니다.
GoogLeNet(인셉션): Google에서 개발한 이 모듈은 보다 효율적인 계산과 심층적인 네트워크를 가능하게 하는 "Inception" 모듈을 도입했습니다.
ResNet: Microsoft Research에서 개발한 ResNet은 스킵 연결을 도입하고 훨씬 더 심층적인 네트워크(원본 논문에서는 최대 152층)를 훈련할 수 있게 했습니다.
ZFNet: AlexNet보다 개선된 ZFNet(개발자인 Zeiler와 Fergus의 이름을 따서 명명)은 아키텍처 하이퍼파라미터를 조정하여 ILSVRC 2013에서 우승했습니다.
이러한 각 아키텍처는 CNN으로 가능한 것의 한계를 뛰어넘는 혁신을 가져와 다양한 컴퓨터 비전 작업의 성능을 향상시켰습니다.
**컨볼루션 신경망 설계 방법****
CNN을 설계할 때는 몇 가지 중요한 결정을 내려야 합니다. 여기에는 입력 크기 선택, 컨볼루션 레이어 수 결정, 입력 레이어당 필터의 크기와 수 선택, 풀링 방법 선택, 완전히 연결된 레이어 수 결정, 활성화 함수 선택 등이 포함됩니다. 이러한 각 선택 사항은 네트워크의 성능과 효율성에 큰 영향을 미칠 수 있습니다.
입력 크기 선택 - 입력 크기는 CNN을 학습시킬 이미지의 크기를 나타냅니다. 입력 크기는 네트워크가 분류하고자 하는 객체의 특징을 추출할 수 있을 만큼 충분히 커야 합니다.
컨볼루션 레이어 수 선택 - 네트워크가 학습할 수 있는 특징의 수를 결정합니다. 컨볼루션 레이어가 많을수록 더 복잡한 특징을 학습할 수 있지만 계산 시간이 늘어납니다.
필터 크기 선택 - 필터의 크기는 컨볼루션의 보폭과 함께 이미지에서 추출할 특징의 크기를 결정합니다. 차원 필터가 클수록 더 많은 수의 특징을 추출할 수 있습니다.
레이어당 필터 수 선택 - 이미지에서 추출할 수 있는 다양한 특징의 수를 결정합니다.
풀링 방법 선택 - 두 가지 일반적인 풀링 기법은 최대 풀링과 평균 풀링입니다. 최대 풀링은 피처 맵의 작은 영역에서 최대값을 가져오고 평균 풀링은 피처 맵의 작은 영역에서 평균값을 가져옵니다.
완전히 연결된 레이어 수 선택 - 네트워크가 분류할 수 있는 클래스 수를 결정합니다.
활성화 함수 선택 - 활성화 함수를 사용하면 이미지 데이터 세트에서 더 복잡한 패턴을 학습할 수 있습니다. 이진 분류의 경우 시그모이드 함수를 사용하는 것이 일반적입니다. 다중 클래스 분류 문제 문장에서 FC 계층은 소프트맥스 활성화 함수를 사용합니다. 데이터의 비선형성을 도입하기 위해 요즘은 주로 GeLU 또는 Swish 활성화 함수를 사용합니다.
다음은 파이썬으로 교통 표지판을 분류하는 CNN을 구현한 간단한 예제입니다. 데이터 세트는 Kaggle 웹사이트에서 찾을 수 있습니다.
파이토치를 이용한 간단한 CNN 구현 예제** **# 파이토치로 간단한 CNN 구현
Python에서 CNN 모델을 구현하려면 PyTorch, TensorFlow, Keras 등과 같은 프레임워크를 사용합니다. 이러한 프레임워크는 CNN에 필요한 모든 계층의 구현을 제공합니다.
프로세스는 다음과 같이 필요한 모듈을 가져오는 것으로 시작됩니다:
# 계산을 위한 종속성
import pandas as pd
import numpy as np
# 이미지 읽기 및 표시를 위한 종속성
cv2에서 크기 조정 가져오기
skimage.io에서 imread를 가져옵니다.
matplotlib.pyplot을 plt로 가져옵니다.
matplotlib 인라인
# 유효성 검사 집합을 만들기 위한 종속성
sklearn.model_selection에서 train_test_split을 가져옵니다.
# 모델 평가를 위한 종속성
sklearn.metrics에서 정확도_점수 가져오기
tqdm에서 tqdm 가져오기
# 파이토치 라이브러리 및 모듈 가져오기
import torch
torch.autograd에서 변수 가져오기
from torch.nn import (Linear, ReLU, CrossEntropyLoss,
Sequential, Conv2d, MaxPool2d, Module,
Softmax, BatchNorm2d, Dropout)
torch.optim에서 Adam, SGD 임포트
완료되면 다음 코드를 사용하여 데이터 세트와 이미지를 로드합니다:
# 데이터 세트 로드하기
train = pd.read_csv('Data/train.csv')
# 훈련 이미지 로드
train_img = []
for img_name in tqdm(train['Path']):
# 이미지 경로 정의
image_path = 'Data/' + str(img_name)
# 이미지 읽기
img = imread(image_path, as_gray=True)
# 이미지 크기 조정
img = resize(img, (28, 28))
# 픽셀 값 정규화하기
img /= 255.0
# 픽셀 유형을 float 32로 변환하기
img = img.astype('float32')
# 이미지를 목록에 피드하기
train_img.append(img)
# 목록을 널 배열로 변환하기
train_x = np.array(train_img)
# 대상 정의
train_y = train['ClassId'].values
train_x.shape
학습 데이터가 로드되면 sklearn의 train_test_split() 메서드를 사용하여 학습 및 유효성 검사 데이터 세트를 만들어야 합니다.
# 유효성 검사 집합 생성
train_x, val_x, train_y, val_y = train_test_split(train_x, train_y, test_size = 0.1)
# 훈련 및 검증 세트의 모양 확인
(train_x.shape, train_y.shape), (val_x.shape, val_y.shape)
또한 다음과 같이 Torch 모델의 데이터 모양을 변경해야 합니다:
# 훈련 이미지를 토치 형식으로 변환하기
train_x = train_x.reshape(-1, 1, 28, 28)
train_x = torch.from_numpy(train_x)
# 대상을 토치 형식으로 변환하기
train_y = train_y.astype(int);
train_y = torch.from_numpy(train_y)
# 유효성 검사 이미지를 토치 형식으로 변환하기
val_x = val_x.reshape(-1, 1, 28, 28)
val_x = torch.from_numpy(val_x)
# 대상을 토치 형식으로 변환하기
val_y = val_y.astype(int);
val_y = torch.from_numpy(val_y)
그런 다음 다음과 같이 CNN의 여러 레이어를 정의합니다:
클래스 Net(Module):
def __init__(self):
super(Net, self).__init__()
self.cnn_layers = Sequential(
# 2D 컨볼루션 레이어 정의하기
Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
# 다른 2D 컨볼루션 레이어 정의
Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
)
# 예측을 위한 최종 고밀도 레이어
self.linear_layers = Sequential(
Linear(4 * 7 * 7, 43)
)
# 포워드 패스 정의
def forward(self, x):
x = self.cnn_layers(x)
x = x.view(x.size(0), -1)
x = self.linear_layers(x)
반환 x
위의 CNN 네트워크는 두 개의 컨볼루션 레이어와 공간 차원이 2×2인 최대 풀링 레이어가 있습니다.
평탄화 레이어는 표지판 이미지의 숨겨진 레이어를 각각의 클래스로 분류하는 데 도움이 될 수 있습니다.
다음으로 최적화기와 손실 함수를 결정하고 훈련 절차를 정의해 보겠습니다.
# 모델 정의하기
model = Net()
# 최적화 함수 정의
optimizer = Adam(model.parameters(), lr=0.07)
# 손실 함수 정의
criterion = CrossEntropyLoss()
# GPU 사용 가능 여부 확인
if torch.cuda.is_available():
model = model.cuda()
criterion = criterion.cuda()
print(model)
def train(epoch):
model.train()
tr_loss = 0
# 훈련 세트 가져오기
x_train, y_train = Variable(train_x), Variable(train_y)
# 검증 집합 가져오기
x_val, y_val = Variable(val_x), Variable(val_y)
# 데이터를 GPU 포맷으로 변환하기
if torch.cuda.is_available():
x_train = x_train.cuda()
y_train = y_train.cuda()
x_val = x_val.cuda()
y_val = y_val.cuda()
# 모델 파라미터의 그라데이션 지우기
optimizer.zero_grad()
# 훈련 및 검증 세트에 대한 예측
output_train = model(x_train)
output_val = model(x_val)
# 훈련 및 검증 손실 계산
loss_train = criterion(output_train, y_train)
loss_val = criterion(output_val, y_val)
train_losses.append(loss_train)
val_losses.append(loss_val)
# 역전파 및 모델 파라미터 업데이트
loss_train.backward()
optimizer.step()
tr_loss = loss_train.item()
if epoch%2 == 0:
# 유효성 검사 손실 인쇄
print('Epoch : ',epoch+1, '\t', 'loss :', loss_val)
마지막으로 다음과 같이 훈련 데이터에 대해 25개의 에포크에 대해 모델을 훈련합니다:
# 에포크 수 정의
n_epochs = 25
# 훈련 손실을 저장할 빈 목록
train_losses = []
# 유효성 검사 손실을 저장할 빈 목록
val_losses = []
# 모델 훈련
범위(n_epochs)의 epoch에 대해:
train(epoch)
결국 각 모델은 테스트 데이터에 대한 예측을 수행하게 됩니다. 자세한 내용은 이 블로그의 파이토치에서 처음부터 CNN을 작성하는 방법을 참조하세요.
FAQs
CNN과 심층 신경망의 차이점은 무엇인가요?
CNN은 이미지, 음성, 동영상 등과 같은 시각적 데이터를 처리할 수 있는 신경망의 일종이며, 심층신경망(DNN)은 데이터에서 복잡한 패턴을 학습할 수 있는 인공신경망의 일종입니다.
다음은 CNN과 DNN의 주요 차이점입니다.
CNN은 이미지 처리를 위한 특정 아키텍처를 가지고 있습니다. 반면 DNN은 특정 아키텍처가 없으며 다양한 작업에 사용할 수 있습니다.
CNN은 컨볼루션 레이어를 사용하여 이미지에서 특징을 학습하는 반면, DNN은 다양한 [레이어 유형]을 사용하여 특징을 학습합니다(https://www.geeksforgeeks.org/deep-neural-network-with-l-layers/).
CNN은 DNN에 비해 학습하기가 더 어렵고 더 많은 데이터가 필요하며 계산 비용이 더 많이 듭니다.
CNN의 세 가지 레이어란 무엇인가요?
CNN의 세 가지 레이어는 활성화 레이어, 컨볼루션 레이어, 풀링 레이어, 완전 연결 레이어입니다.
컨볼루션 레이어 - 이 레이어는 이미지에서 특징을 추출하는 역할을 합니다. 작은 가중치 매트릭스인 필터로 이미지를 스캔하는 방식으로 작동합니다. 필터는 이미지를 가로질러 이동하고 가중치는 이미지의 픽셀 값에 곱해집니다. 마지막으로 추출된 특징이 포함된 특징 맵을 생성합니다.
풀링 레이어** - 풀링 레이어는 특징 맵의 크기를 줄여줍니다. 이를 위해 두 가지 일반적인 풀링 기법으로 최대 풀링과 평균 풀링이 사용됩니다.
완전 연결 계층** - CNN의 출력을 분류하는 기존 신경망과 동일합니다. 완전히 연결된 계층의 뉴런은 이미지를 일련의 클래스로 분류합니다.
**딥러닝에서 컨볼루션 신경망이란 무엇인가요?
컨볼루션 신경망은 이미지, 음성, 동영상을 처리하는 심층 신경망의 한 유형으로, 이를 통해 성장하는 디지털 세계에서 정형/비정형(https://zilliz.com/blog/introduction-to-unstructured-data) 데이터에 대한 실제 예측을 할 수 있도록 합니다.
CNN은 인간의 감정, 행동, 관심사, 좋아요, 싫어요 등을 쉽고 효율적으로 예측할 수 있도록 도와줍니다.