카테고리 없음

파이썬 AI 딥러닝 - 신경망 Neural Networks

에이티에스 2023. 8. 9. 16:52
728x90

신경망은 뇌의 컴퓨터 모델을 만들려는 시도인 병렬 컴퓨팅 장치입니다. 주요 목표는 기존 시스템보다 빠르게 다양한 계산 작업을 수행하는 시스템을 개발하는 것입니다. 이러한 작업에는 패턴 인식 및 분류, 근사, 최적화 및 데이터 클러스터링이 포함됩니다.

 

인공 신경망(ANN)이란 무엇입니까?

인공 신경망(ANN)은 생물학적 신경망의 비유에서 중심 주제를 차용한 효율적인 컴퓨팅 시스템입니다. ANN은 인공 신경 시스템, 병렬 분산 처리 시스템 및 연결주의 시스템으로도 명명됩니다. ANN은 그들 사이의 통신을 허용하기 위해 어떤 패턴으로 상호 연결된 많은 단위들을 획득한다. 노드 또는 뉴런이라고도 하는 이러한 단위는 병렬로 작동하는 간단한 프로세서입니다.

 

모든 뉴런은 연결 링크를 통해 다른 뉴런과 연결됩니다. 각 연결 링크는 입력 신호에 대한 정보를 갖는 가중치와 연관된다. 이것은 뉴런이 특정 문제를 해결하는 데 가장 유용한 정보인데, 그 이유는 무게가 일반적으로 전달되는 신호를 자극하거나 억제하기 때문입니다. 각 뉴런은 활성화 신호라고 하는 내부 상태를 가지고 있습니다. 입력 신호와 활성화 규칙을 결합한 후 생성되는 출력 신호는 다른 장치로 전송될 수 있습니다.

 

유용한 패키지 설치

Python에서 신경망을 생성하기 위해 NeuroLab이라는 강력한 신경망 패키지를 사용할 수 있습니다. 유연한 네트워크 구성과 Python용 학습 알고리즘을 갖춘 기본 신경망 알고리즘 라이브러리입니다. 당신은 명령 프롬프트에서 다음 명령의 도움으로이 패키지를 설치할 수 있습니다 

 

pip install NeuroLab

 

아나콘다 환경을 사용하는 경우, 다음 명령을 사용하여 NeuroLab을 설치하세요. 

conda install -c labfabulous neurolab

 

신경망 구축

이 섹션에서는 NeuroLab 패키지를 사용하여 Python에서 신경망을 구축해 보겠습니다.

 

퍼셉트론 기반 분류기

퍼셉트론은 ANN의 빌딩 블록입니다. 

다음은 간단한 신경망 퍼셉트론 기반 분류기를 구축하기위한 파이썬 코드의 단계적 실행입니다 -

아래와 같이 같이 필요한 패키지를 가져옵니다 -

import matplotlib.pyplot as plt
import neurolab as nl

 

입력 값을 입력합니다. 지도 학습의 예이므로 목표 값도 제공해야 합니다.

input = [[0, 0], [0, 1], [1, 0], [1, 1]]
target = [[0], [0], [0], [1]]

 

2 개의 입력과 1 개의 뉴런으로 네트워크를 만듭니다 -

net = nl.net.newp([[0, 1],[0, 1]], 1)

 

이제 신경망을 훈련시킵니다. 여기서는 학습에 델타 규칙을 사용합니다.

error_progress = net.train(input, target, epochs=100, show=10, lr=0.1)

 

 

 

이제 출력을 시각화하고 그래프를 표시합니다

plt.figure()
plt.plot(error_progress)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.grid()
plt.show()

 

오류 메트릭을 사용하여 학습 진행을 보여주는 다음 그래프를 볼 수 있습니다 -

 

단일 계층 신경망

이 예제에서는 출력을 생성하기 위해 입력 데이터에 작용하는 독립적인 뉴런으로 구성된 단일 계층 신경망을 만듭니다. neural_simple.txt라는 텍스트 파일을 입력으로 사용하고 있습니다.

 

아래와 같이 패키지를 가져 오십시오 -

import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl

 

다음과 같이 데이터 세트를 로드 합니다.

input_data = np.loadtxt(“/Users/admin/neural_simple.txt')

 

다음은 사용할 데이터입니다. 이 데이터에서 처음 두 열은 피처이고 마지막 두 열은 레이블입니다.

array([[2. , 4. , 0. , 0. ],
      [1.5, 3.9, 0. , 0. ],
      [2.2, 4.1, 0. , 0. ],
      [1.9, 4.7, 0. , 0. ],
      [5.4, 2.2, 0. , 1. ],
      [4.3, 7.1, 0. , 1. ],
      [5.8, 4.9, 0. , 1. ],
      [6.5, 3.2, 0. , 1. ],
      [3. , 2. , 1. , 0. ],
      [2.5, 0.5, 1. , 0. ],
      [3.5, 2.1, 1. , 0. ],
      [2.9, 0.3, 1. , 0. ],
      [6.5, 8.3, 1. , 1. ],
      [3.2, 6.2, 1. , 1. ],
      [4.9, 7.8, 1. , 1. ],
      [2.1, 4.8, 1. , 1. ]])

 

이제,이 네 열을 2 데이터 열과 2 레이블로 분리하십시오 -

data = input_data[:, 0:2]
labels = input_data[:, 2:]

 

다음 명령을 사용하여 입력 데이터를 플로팅합니다.

plt.figure()
plt.scatter(data[:,0], data[:,1])
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Input data') 

 

여기에 표시된대로 각 차원에 대한 최소값과 최대 값을 정의 합니다.

dim1_min, dim1_max = data[:,0].min(), data[:,0].max()
dim2_min, dim2_max = data[:,1].min(), data[:,1].max()

 

다음으로, 다음과 같이 출력 계층의 뉴런 수를 정의하십시오 -

nn_output_layer = labels.shape[1]

 

 단일 계층 신경망을 정의합니다.

dim1 = [dim1_min, dim1_max]
dim2 = [dim2_min, dim2_max]
neural_net = nl.net.newp([dim1, dim2], nn_output_layer)

 

그림과 같이 epochs 및 학습 속도의 수와 신경망을 훈련 합니다.

error = neural_net.train(data, labels, epochs = 200, show = 20, lr = 0.01)

 

시각화하고 다음 명령을 사용하여 학습 진행 상황을 표시합니다.

plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.title('Training error progress')
plt.grid()
plt.show()

 

위의 분류기에서 테스트 데이터 포인트를 사용합니다.

print('\nTest Results:')
data_test = [[1.5, 3.2], [3.6, 1.7], [3.6, 5.7],[1.6, 3.9]] for item in data_test:
   print(item, '-->', neural_net.sim([item])[0])

 

여기에 표시된대로 테스트 결과를 찾을 수 있습니다 -

[1.5, 3.2] --> [1. 0.]
[3.6, 1.7] --> [1. 0.]
[3.6, 5.7] --> [1. 1.]
[1.6, 3.9] --> [1. 0.]

 

지금까지 논의 된 코드의 출력으로 다음 그래프를 볼 수 있습니다 -

 

다층 신경망

이 예제에서는 학습 데이터의 기본 패턴을 추출하기 위해 둘 이상의 계층으로 구성된 다계층 신경망을 만듭니다. 이 다층 신경망은 회귀 변수처럼 작동합니다. 방정식을 기반으로 몇 가지 데이터 포인트를 생성할 것입니다: y = 2x2+8.

 

아래와 같이 필요한 패키지를 가져옵니다 -

import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl

 

위에서 언급 한 방정식을 기반으로 몇 가지 데이터 포인트를 생성합니다.

min_val = -30
max_val = 30
num_points = 160
x = np.linspace(min_val, max_val, num_points)
y = 2 * np.square(x) + 8
y /= np.linalg.norm(y)

 

다음과 같이이 데이터 세트를 재구성 합니다.

data = x.reshape(num_points, 1)
labels = y.reshape(num_points, 1)

다음 명령을 사용하여 입력 데이터 세트를 시각화하고 플로팅 -

plt.figure()
plt.scatter(data, labels)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Data-points')

 

이제 첫 번째 은닉 레이어에 10개의 뉴런, 두 번째 히든 레이어에 6개, 출력 레이어에 1개의 뉴런이 있는 neurolab을 사용하여 두 개의 숨겨진 레이어가 있는 신경망을 구축합니다.

neural_net = nl.net.newff([[min_val, max_val]], [10, 6, 1])

 

기울기 훈련 알고리즘을 사용하십시오 -

neural_net.trainf = nl.train.train_gd

 

위에서 생성 된 데이터에 대한 학습의 목표로 네트워크를 학습을 수행합니다. 

error = neural_net.train(data, labels, epochs = 1000, show = 100, goal = 0.01)

 

훈련 데이터 포인트에 신경망을 실행 합니다.

output = neural_net.sim(data)
y_pred = output.reshape(num_points)

 

플롯 및 시각화 작업을 수행합니다.

plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Error')
plt.title('Training error progress')

 

실제 대 예상 출력을 플롯합니다. 

x_dense = np.linspace(min_val, max_val, num_points * 2)
y_dense_pred = neural_net.sim(x_dense.reshape(x_dense.size,1)).reshape(x_dense.size)
plt.figure()
plt.plot(x_dense, y_dense_pred, '-', x, y, '.', x, y_pred, 'p')
plt.title('Actual vs predicted')
plt.show()

 

위의 명령의 결과로, 아래와 같이 그래프를 관찰 할 수 있습니다 -

 
728x90
반응형
그리드형