Python 간단 한 신경 망 인 스 턴 스 설명 만 들 기
STEP 1:NumPy,Scikit-learn,Matplotlib 가 져 오기
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
우 리 는 이 항목 에서 상술 한 세 개의 라 이브 러 리 를 사용 할 것 이다.NumPy 는 벡터 와 행렬,수학 작업 을 만 드 는 데 사 용 될 것 입 니 다.Scikit-learn 은 데 이 터 를 크기 조정 하 는 데 사용 되 며,Matplotlib 는 신경 망 훈련 기간 에 그림 을 그 리 는 데 사 용 됩 니 다.단계 2:훈련 및 테스트 데이터 세트 만 들 기
신경 망 은 대형 과 소형 데이터 세트 의 학습 추세 에 모두 뛰어나다.그러나 데이터 과학자 들 은 의합 의 위험 을 의식 해 야 한다.이것 은 작은 데이터 세트 를 사용 하 는 프로젝트 에서 더욱 뚜렷 하 다.과 의합 은 알고리즘 훈련 과 모델 링 이 데이터 점 에 너무 가 까 워 서 새로운 데이터 점 에 잘 보급 되 지 못 하 는 것 이다.
일반적으로 적합 한 기계 학습 모델 은 훈련 된 데이터 세트 에서 매우 높 은 정확성 을 가지 지만 데이터 과학자 로 서 목 표 는 가능 한 한 새로운 데이터 점 을 정확하게 예측 하 는 것 이다.새로운 데이터 점 의 좋 고 나 쁨 을 예측 하여 모델 을 평가 하 는 것 을 확보 하기 위해 현재 데이터 점 의 모델 링 좋 고 나 쁨 에 따라 모델 을 평가 하 는 것 이 아니 라 데이터 세트 를 훈련 집합 과 테스트 집합(때로는 검증 집합)으로 나 누 는 경우 가 많다.
input_train = np.array([[0, 1, 0], [0, 1, 1], [0, 0, 0],
[10, 0, 0], [10, 1, 1], [10, 0, 1]])
output_train = np.array([[0], [0], [0], [1], [1], [1]])
input_pred = np.array([1, 1, 0])
input_test = np.array([[1, 1, 1], [10, 0, 1], [0, 1, 10],
[10, 1, 10], [0, 0, 0], [0, 1, 1]])
output_test = np.array([[0], [1], [0], [1], [0], [0]])
이 간단 한 신경 망 에서 우 리 는 1x3 벡터 를 첫 번 째 요소 로 분류 한다.NumPy 의 array 함 수 를 사용 하여 입 출력 훈련 집 과 테스트 집 을 만 들 고 input 을 만 듭 니 다.pred 는 나중에 정 의 될 prediction 함 수 를 테스트 합 니 다.훈련 과 테스트 데 이 터 는 6 개의 견본 으로 구성 되 고 각 견본 은 3 가지 특징 을 가진다.수출 이 이미 제시 되 었 기 때문에 우 리 는 이것 이 감독 식 학습 의 한 예 라 는 것 을 이해한다.STEP 3:확장 데이터 세트
많은 기계 학습 모델 은 예 를 들 어 단위 간 의 차 이 를 이해 하지 못 하고 자 연 스 럽 게 고도 의 특징 에 대해 더 많은 가중치 를 응용 한다.이것 은 알고리즘 이 새로운 데이터 점 을 예측 하 는 능력 을 파괴 할 것 이다.또 강도 높 은 특징 을 가 진 기계 학습 모델 을 훈련 하 는 것 은 필요 한 것 보다 느 리 고 적어도 경사도 하강 법 을 사용 하면 된다.입력 값 이 대체로 같은 범위 내 에 있 을 때 경사도 하강 법 이 더 빨리 수렴 되 기 때문이다.
scaler = MinMaxScaler()
input_train_scaled = scaler.fit_transform(input_train)
output_train_scaled = scaler.fit_transform(output_train)
input_test_scaled = scaler.fit_transform(input_test)
output_test_scaled = scaler.fit_transform(output_test)
우리 의 훈련 과 테스트 데이터 가 집중 되 어 있 기 때문에 이러한 값 의 범 위 는 상대 적 으로 작 기 때문에 특징 적 인 확장 을 할 필요 가 없 을 것 이다.그러나 이렇게 하면 아이들 이 좋아 하 는 숫자 를 사용 할 수 있 고 코드 를 너무 많이 바 꿀 필요 가 없다.Scikit-learn 패키지 와 MinMaxScaler 류 로 인해 Python 에서 특징 적 인 신축 을 실현 하 는 것 이 매우 쉽다.MinMaxScaler 대상 을 만 들 고 fit 사용 하기transform 함 수 는 비 크기 조정 데 이 터 를 입력 합 니 다.이 함 수 는 같은 크기 조정 데 이 터 를 되 돌려 줍 니 다.Scikit-learn 가방 에는 다른 크기 조정 기능 이 있 습 니 다.이 기능 을 시도 해 보시 기 바 랍 니 다.네 번 째 단계:신경 망 류 만 들 기
신경 망 의 모든 요 소 를 익히 려 면 가장 간단 한 방법 중 하 나 는 신경 망 류 를 만 드 는 것 이다.이런 종 류 는 모든 변수 와 함 수 를 포함해 야 하 며 필요 한 신경 망 이 정상적으로 작 동 할 것 이다.
class NeuralNetwork():
def __init__(self, ):
self.inputSize = 3
self.outputSize = 1
self.hiddenSize = 3
self.W1 = np.random.rand(self.inputSize, self.hiddenSize)
self.W2 = np.random.rand(self.hiddenSize, self.outputSize)
self.error_list = []
self.limit = 0.5
self.true_positives = 0
self.false_positives = 0
self.true_negatives = 0
self.false_negatives = 0
def forward(self, X):
self.z = np.matmul(X, self.W1)
self.z2 = self.sigmoid(self.z)
self.z3 = np.matmul(self.z2, self.W2)
o = self.sigmoid(self.z3)
return o
def sigmoid(self, s):
return 1 / (1 + np.exp(-s))
def sigmoidPrime(self, s):
return s * (1 - s)
def backward(self, X, y, o):
self.o_error = y - o
self.o_delta = self.o_error * self.sigmoidPrime(o)
self.z2_error = np.matmul(self.o_delta,
np.matrix.transpose(self.W2))
self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta)
self.W2 += np.matmul(np.matrix.transpose(self.z2),
self.o_delta)
def train(self, X, y, epochs):
for epoch in range(epochs):
o = self.forward(X)
self.backward(X, y, o)
self.error_list.append(np.abs(self.o_error).mean())
def predict(self, x_predicted):
return self.forward(x_predicted).item()
def view_error_development(self):
plt.plot(range(len(self.error_list)), self.error_list)
plt.title('Mean Sum Squared Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
def test_evaluation(self, input_test, output_test):
for i, test_element in enumerate(input_test):
if self.predict(test_element) > self.limit and \
output_test[i] == 1:
self.true_positives += 1
if self.predict(test_element) < self.limit and \
output_test[i] == 1:
self.false_negatives += 1
if self.predict(test_element) > self.limit and \
output_test[i] == 0:
self.false_positives += 1
if self.predict(test_element) < self.limit and \
output_test[i] == 0:
self.true_negatives += 1
print('True positives: ', self.true_positives,
'
True negatives: ', self.true_negatives,
'
False positives: ', self.false_positives,
'
False negatives: ', self.false_negatives,
'
Accuracy: ',
(self.true_positives + self.true_negatives) /
(self.true_positives + self.true_negatives +
self.false_positives + self.false_negatives))
단계 4.1:초기 화 함수 만 들 기파 이 썬 에서 변 수 를 정확하게 초기 화 할 수 있 도록 클래스 를 만 들 때 를 호출 합 니 다.init__ 함수
def __init__(self, ):
self.inputSize = 3
self.outputSize = 1
self.hiddenSize = 3
self.W1 = torch.randn(self.inputSize, self.hiddenSize)
self.W2 = torch.randn(self.hiddenSize, self.outputSize)
self.error_list = []
self.limit = 0.5
self.true_positives = 0
self.false_positives = 0
self.true_negatives = 0
self.false_negatives = 0
이 예 에서 나 는 세 개의 입력 노드,세 개의 숨겨 진 층 노드 와 하나의 출력 노드 가 있 는 신경 망 을 선택 했다.이상 의init__ 함수 가 신경 망 크기 를 설명 하 는 변 수 를 초기 화 합 니 다.input Size 는 입력 노드 의 수 입 니 다.데이터 의 특징 을 입력 하 는 수 와 같 아야 합 니 다.outputSize 는 출력 노드 수 와 같 습 니 다.hiddenSize 는 숨겨 진 층 의 노드 수 를 설명 합 니 다.그 밖 에 우리 의 네트워크 에서 서로 다른 노드 간 의 가중치 가 훈련 과정 에서 조 정 될 것 이다.
신경 망 의 크기 와 가중치 변 수 를 묘사 하 는 것 외 에 나 는 신경 망 대상 을 만 들 때 초기 화 된 변 수 를 몇 개 만 들 었 는데 이 대상 들 은 평가 목적 에 사 용 될 것 이다.오차 목록 은 각 시기의 평균 절대 오차(MAE)를 포함 합 니 다.이 한 계 는 하나의 벡터 를 하나의 벡터 로 분류 해 야 합 니 다.요소 10 은 첫 번 째 요소 가 아 닙 니 다.그 다음 에 일부 변 수 는 실제 양성,가짜 양성,실제 음성 과 가짜 음성 수량 을 저장 할 수 있다.
단계 4.2:전방 향 전파 함수 만 들 기
전방 향 전파 함수 의 역할 은 신경 망 의 서로 다른 차원 을 통 해 교체 하여 특정 epoch 의 수출 을 예측 하 는 것 이다.그 다음 에 예측 수출 과 실제 수출 간 의 차이 에 따라 역방향 전파 과정 에서 가중치 를 업데이트 한다.
def forward(self, X):
self.z = np.matmul(X, self.W1)
self.z2 = self.sigmoid(self.z)
self.z3 = np.matmul(self.z2, self.W2)
o = self.sigmoid(self.z3)
return o
각 층 의 각 노드 의 값 을 계산 하기 위해 앞 층 의 노드 의 값 은 적당 한 가중치 에 곱 한 다음 에 비 선형 활성화 함 수 를 사용 하여 최종 출력 함수 의 가능성 을 확대 할 것 이다.이 예 에서 우 리 는 Sigmoid 를 활성화 함수 로 선 택 했 지만 다른 선택 도 많 습 니 다.단계 4.3:역방향 전파 함수 만 들 기
역방향 전 파 는 신경 망 의 서로 다른 노드 의 가중치 를 갱신 하여 그 중요성 을 결정 하 는 과정 이다.
def backward(self, X, y, o):
self.o_error = y - o
self.o_delta = self.o_error * self.sigmoidPrime(o)
self.z2_error = np.matmul(self.o_delta,
np.matrix.transpose(self.W2))
self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta)
self.W2 += np.matmul(np.matrix.transpose(self.z2),
self.o_delta)
위의 코드 세 션 에서 출력 층 의 출력 오 류 는 출력 과 실제 출력 간 의 차 이 를 예측 하 는 것 으로 계산 된다.그리고 입력 층 에 도착 할 때 까지 전체 과정 을 반복 합 니 다.이 오 류 를 Sigmoid 와 곱 하여 경사도 하강 법 을 실행 합 니 다.마지막 으로 서로 다른 층 간 의 가중치 를 업데이트 한다.단계 4.4:훈련 함수 만 들 기
훈련 과정 에서 이 알고리즘 은 앞으로 실행 되 고 뒤로 전달 되 며 모든 epoch 의 가중치 를 업데이트 합 니 다.가장 정확 한 가중치 를 얻 기 위해 서 는 필요 하 다.
def train(self, X, y, epochs):
for epoch in range(epochs):
o = self.forward(X)
self.backward(X, y, o)
self.error_list.append(np.abs(self.o_error).mean())
앞으로 와 뒤로 전파 되 는 것 외 에 도 평균 절대 오차(MAE)를 하나의 오류 목록 에 저장 하여 향후 평균 절대 오차 가 훈련 과정 에서 어떻게 변 하 는 지 관찰 할 수 있 도록 한다.단계 4.5:예측 함수 만 들 기
훈련 과정 에서 가중치 를 미세 조정 한 후 이 알고리즘 은 새로운 데이터 점 의 출력 을 예측 할 수 있다.예측 한 출력 숫자 는 실제 출력 숫자 와 매우 비슷 할 것 으로 보인다.
def predict(self, x_predicted):
return self.forward(x_predicted).item()
단계 4.6:평균 절대 오차 발전 도 그리 기기계 학습 알고리즘 의 질 을 평가 하 는 방법 은 매우 많다.자주 사용 하 는 측정 방법 중 하 나 는 평균 절대 오차 이 며,이 오 차 는 시간의 추이 에 따라 줄 여야 한다.
def view_error_development(self):
plt.plot(range(len(self.error_list)), self.error_list)
plt.title('Mean Sum Squared Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
단계 4.7:정밀도 계산 및 구성 부분
진짜,가짜,진짜 마이너스 와 가짜 마이너스 의 수량 은 기계 학습 분류 알고리즘 의 질 을 묘사 했다.훈련 후의 신경 망 가중치 가 업데이트 되 어 알고리즘 이 새로운 데이터 점 을 정확하게 예측 할 수 있 게 한다.바 이 너 리 분류 작업 에서 이 새로운 데이터 점 들 은 1 또는 0 에 불과 합 니 다.예측 치가 정 의 된 제한 보다 높 거나 낮 을 지 에 따라 알고리즘 은 새 항목 을 1 또는 0 으로 나눈다.
def test_evaluation(self, input_test, output_test):
for i, test_element in enumerate(input_test):
if self.predict(test_element) > self.limit and \
output_test[i] == 1:
self.true_positives += 1
if self.predict(test_element) < self.limit and \
output_test[i] == 1:
self.false_negatives += 1
if self.predict(test_element) > self.limit and \
output_test[i] == 0:
self.false_positives += 1
if self.predict(test_element) < self.limit and \
output_test[i] == 0:
self.true_negatives += 1
print('True positives: ', self.true_positives,
'
True negatives: ', self.true_negatives,
'
False positives: ', self.false_positives,
'
False negatives: ', self.false_negatives,
'
Accuracy: ',
(self.true_positives + self.true_negatives) /
(self.true_positives + self.true_negatives +
self.false_positives + self.false_negatives))
test 를 실행 할 때evaluation 함수 일 때 우 리 는 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.진짜
진짜 마이너스:4
가짜:0
가짜 마이너스:0
정확성 은 다음 과 같은 공식 에서 제시한다.
이 를 통 해 우 리 는 우리 의 사례 에서 정확 도 는 1 이 라 고 추정 할 수 있다.
다섯 번 째 단계:신경 망 모형 을 훈련 하고 평가 하기 위해 스 크 립 트 를 실행 합 니 다.
NN = NeuralNetwork()
NN.train(input_train_scaled, output_train_scaled, 200)
NN.predict(input_pred)
NN.view_error_development()
NN.test_evaluation(input_test_scaled, output_test_scaled)
우리 가 방금 구축 한 신경 망 류 를 시도 하기 위해 서 는 먼저 신경 망 유형의 대상 을 초기 화 할 것 이다.그 다음 에 훈련 데 이 터 를 신경 망 훈련 시 키 고 새로운 훈련 모델 이 테스트 벡터 에서 테스트 하기 전에 알고리즘 의 가중치 에 대해 200 개의 epoch 이상 의'수정'을 실시한다.그리고 테스트 데이터 세트 를 이용 하여 모델 을 평가 하기 전에 오차 도 를 그립 니 다.STEP 6:스 크 립 트 개선 및 사용
제 공 된 코드 는 다른 유사 한 상황 을 처리 하기 위해 쉽게 수정 할 수 있다.우 리 는 독자 들 이 변 수 를 바 꾸 고 자신의 데 이 터 를 사용 하도록 격려 한다.개선 또는 변경 에 대한 잠재 적 인 생각 은 다음 과 같 지만 이에 국한 되 지 않 습 니 다.
4.567917.일반화 코드 는 모든 입 출력 크기 의 데이터 에 적용 된다평균 절대 오차 이외 의 다른 도량 으로 오 차 를 평가한다다른 크기 조정 함수 사용 하기파 이 썬 이 간단 한 신경 망 을 만 드 는 사례 에 대한 설명 은 여기까지 입 니 다.파 이 썬 에서 간단 한 신경 망 을 만 드 는 방법 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 관심 을 가 져 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.