Tensorflow v1 및 v2의 회귀

Unsplash에 Alexandre Debiève의 사진

이전 기사에서 계속해서이 기사는 Tensorflow를 사용하여 선형로지스틱 회귀 에 접근 하고 버전 1과 2의 핵심 차이점을 약간 밝힐 것입니다. 시작하기 전에 프레임 워크에 대해 약간 논의하는 것이 좋습니다.

Tensorflow을위한 오픈 소스 소프트웨어 라이브러리와 구글의 연구자로부터 유래 된 기계 지능 F 또는 생산과 연구. 요즘에는 더 성숙한 버전에서 종단 간 오픈 소스 ML 플랫폼이라고합니다. Tensorflow는 수학적 계산을 나타내는 개념 인 그래프 기반 계산을 기반으로합니다. v2까지는 문서와 기본 제공 자습서가 부족하여 수많은 하위 API를 소화하고 빠져 나가기가 정말 어려웠습니다. 또는 인기있는 Keras와 같은 다른 프레임 워크가 래퍼 라이브러리로 구출되어 Tensorflow에 대한 추상화 수준 (어쩌면 더 많음)을 제공하고 마침내 TF v2의 기본값이되었습니다.

Tensorflow의 계산 그래프

선형 회귀 v1

이제 우리는 이미 선형 회귀 개념에 익숙해 졌으므로 한 단계 더 나아가 X와 Y 사이의 선형 관계에 대한 매우 간단한 모델을 훈련 할 수 있습니다.

사례 연구의 데이터 세트는 출생률-기대 수명입니다. 출생률 ( X) 과 여러 국가 의 해당 기대 수명 ( Y )으로 구성됩니다. 그들 사이의 관계가 선형이라고 가정하면 WbY = w*X + b 를 계산하는 모델을 훈련 할 수 있습니다 .

TF v1을 사용하면 자리 표시자를 사용하여 데이터 세트를 나타내는 계산 그래프 와 역전 파로 계산되는 가중치 및 편향에 대한 스칼라 변수 를 처음부터 구현할 수 있습니다.

다음으로 tensorflow 계산으로 예측 공식을 정의하고 MSE 손실 함수 및 경사 하강 최적화 프로그램에 대한 내장 함수를 사용합니다.

이제 계산 그래프의 구성 요소를 정의 했으므로 데이터를 추론하고 변수를 훈련시킬 것임을 tensorflow에 알려야합니다. 이것은 tf v1 에서 그래프 초기화 후 계산 그래프를 통해 데이터 세트를 추론 하는 세션 으로 수행됩니다. 데이터 세트 준비 기술은 독립형 장이 될 수 있지만 v2에서는 이미 단순화되었습니다. 이 경우 피드 dict api 가 사용됩니다.

교육 과정

Epoch 10: | Loss: 375.46, w: 3.51, b: 41.13
Epoch 20: | Loss: 130.94, w: -0.88, b: 61.19
Epoch 30: | Loss: 59.20, w: -3.26, b: 72.10
Epoch 40: | Loss: 38.30, w: -4.56, b: 78.04
Epoch 50: | Loss: 32.29, w: -5.27, b: 81.27
Train Time: 6.204496 seconds
선형 회귀 NN에 대한 계산 그래프

기본적으로 v1에서는 세션 외부의 변수 내용을 볼 수 없으며 이는 모델을 디버그해야 할 때 문제가됩니다. 이를 수행하는 유일한 방법은 즉시 실행을 활성화하는 것이지만 프로그램을 리팩토링해야하므로 마술 지팡이 역할을하지 않습니다. 최신 Tensorflow의 버전에서 eager execution은 표준 기본값이며 계산 그래프를 작성하지 않고 즉시 작업을 평가하므로 v1의 번거로운 프로그래밍 스타일과 달리 더 자연스러운 프로그래밍 흐름을 제공하므로 시작하기가 훨씬 쉽습니다.

선형 회귀 v2

Tensorflow v2에서 간단한 신경망으로 선형 회귀 모델을 다시 구현하면 계산을 모니터링하고 기울기를 계산하는 것이 훨씬 쉬워집니다. Keras의 새 API tf.GradientTapetf.Session. GradientTape 는 할당 된 연산 / 계산을 인계 받아 np.array로도 변환 할 수있는 Tensor 객체를 반환합니다 .

가중치편향 은 이제 tf.Variable객체입니다. 그런데 Tensorflow v1에서는 다음 과 관련하여 변수를 할당 하는 오래된 방법 으로 간주 되었습니다.tf.get_variable.

Prediction, Loss 함수Optimizer 는 이제 Python으로 코드를 작성하는 것처럼 간단하게 정의 할 수 있습니다.

훈련 프로세스는 이해하고 이해하기 쉽고 feed_dict API보다 수렴하는 데 덜 걸립니다.

Epoch: 100 | Loss: 652.59, w: 10.31, b: 30.24
Epoch: 200 | Loss: 324.81, w: 5.31, b: 47.55
Epoch: 300 | Loss: 169.67, w: 1.87, b: 59.46
Epoch: 400 | Loss: 96.24, w: -0.50, b: 67.65
Epoch: 500 | Loss: 61.48, w: -2.13, b: 73.29
Epoch: 600 | Loss: 45.03, w: -3.25, b: 77.16
Epoch: 700 | Loss: 37.24, w: -4.02, b: 79.83
Epoch: 800 | Loss: 33.56, w: -4.55, b: 81.67
Epoch: 900 | Loss: 31.81, w: -4.91, b: 82.93
Epoch: 1000 | Loss: 30.99, w: -5.17, b: 83.80
Train Time: 2.776154 seconds

단일 뉴런 신경망을 사용하여 로지스틱 회귀를보다 발전된 방식으로 구현 하기 위해 0에서 9까지 손으로 쓴 숫자 모음 인 MNIST 데이터 세트를 사용하여 다중 클래스 분류 문제에 접근 할 것 입니다.

데이터 세트 준비

이 예는 tf.data데이터 세트를로드하기 위해 자리 표시 자 및 feed_dict에 비해 더 빠른 방법 인 특수 용어, 내장 루틴 및 API 를 사용하는 Tensorflow v1 가이드로 간주 될 수도 있습니다 .

다음 단계에서는 데이터 세트의 샘플 / 숫자, 즉 iterator 를 반복하는 프로세스를 정의해야 합니다 . 새로운 배치 / 샘플이 처리 될 때마다 get_next () 라고합니다 . 분류기를 구성 할 때 데이터 샘플 크기로 인해 학습 속도가 느려지므로 데이터 샘플을 하나씩 처리하지 않습니다. 따라서 우리는 프로세스 를 가속화하기 위해 데이터를 일괄 처리 할 것입니다. 또한 다음과 같은 학습 세트에 맞지 않는 경우 반복 (학습 및 테스트) 할 때 마지막 배치의 나머지 샘플을 버리지 않도록 명시 적으로 정의합니다.drop_remainder=False

매 epoch 후에 tensorflow는 데이터 세트를 되 감고 다음 epoch로 계속해야합니다. 초기화 작업은 iterator.make_initializer()데이터 세트의 일부와 함께 제공되는 개체 로 정의됩니다 .

다음 섹션에서 학습 과정에서 배치가 어떻게 소비되었는지에 대해 자세히 설명하겠습니다.

이 경우 가중치와 편향은 데이터 세트의 차원도 따라야합니다.

손실 계산

Tensorflowlogits 또는 unscaled log probabilities 라는 용어를 사용하는데 , 이는 실제로 다른 작업이 적용되기 전에 순방향 전파 동안 모델의 출력입니다.

이러한 확률 중 얼마나 많은 확률이 정확한 예측으로 이어지는지는 교차 엔트로피로 측정되며 , a) 로짓에 소프트 맥스 활성화 를 적용하고 , 출력을 1 개의 예측으로 합산 된 정규화 된 확률로 변환하고 , b) 지상 진실로부터의 거리를 계산합니다.

교차 엔트로피 손실

총 손실은 총 훈련 인스턴스의 평균값에서 계산됩니다.

# Sample output from a single 128 size batch
# Logits (10,128)
[[-0.02467263  0.0407119   0.03357347 ...  0.07849845 -0.04018284
   0.14606732] 
...
[-0.03187682  0.03064402  0.02814235 ...  0.12632789 -0.07327773
   0.16343306]]
# Softmax + Cross Entropy (128,)
[2.280719  2.3213248 ... 2.2659633 2.3112588]
# Batch Loss
2.315973

tensorflow의 dialect 에서 Optimizer는 작업 이며 손실을 최소화하는 데 사용됩니다. 에서 실행되고 손실 계산 session.run()과 함께 목록으로 전달됩니다 . 이는 Tensorflow의 계산 그래프가 최적화 프로그램에 의존하는 부분을 실행하기 때문입니다. 이러한 손실과 손실은 입력 데이터와 가중치 및 편향에도 의존합니다. 이는 텐서 보드에서 생성 된 다음 그래프에서 볼 수 있습니다.

optimizer=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# Training process
_, batch_loss, batch_acc = sess.run([optimizer, loss, accuracy])

모델의 성능은 손실 뿐만 아니라 다양한 통계 지표로도 평가됩니다 . 이 예에서 모델은 실제 클래스와 예측 클래스 의 혼동 행렬 (정밀도, 재현율) 과 함께 올바른 예측을 생성하기 위해 분류기의 정확도 로 평가됩니다 .

# Sample output from a single 128 size batch
# Predictions (10,128)
[[0.099 0.10 0.11 ... 0.08 0.09 0.09]
...
[0.11 0.10 0.09  ... 0.08 0.10 0.10]]
# Correct Preds (128,)
[False True ... False False]
# Batch Accuracy
0.078
------------------------------------------------------------------Training...
Epoch 10 - Train loss: 0.875 - Train Accuracy: 83.16%
Epoch 20 - Train loss: 0.653 - Train Accuracy: 85.49%
Epoch 30 - Train loss: 0.564 - Train Accuracy: 86.53%
Epoch 40 - Train loss: 0.515 - Train Accuracy: 87.21%
Epoch 50 - Train loss: 0.483 - Train Accuracy: 87.73%
Epoch 60 - Train loss: 0.460 - Train Accuracy: 88.10%

Evaluating...
Test Validation loss: 0.067, Validation Accuracy: 89.09%

반복기의 데이터로 계산 그래프를 공급하는 것은 반 수동 방식으로 구현 해야하는 프로세스입니다. 각 에포크에서, 반복기가 배치 크기에 따라 각각의 배치에 대한 데이터 세트 처리 손실 정확도 및 배치주기 , 각 에포크에 대한 총 손실 정확도를 계산하기 위해 계산한다.

55K 샘플 트레인 데이터 세트에서 예를 들어 것이다 430 배 이며, 429 .batch_size=128batch_cycledrop_remainder=FalseTrue

후자는 완료하는 데 하나의 배치가 더 필요할 때 한 시대에 배치를 버리고 ( 128x429 = 54912 samples ) 즉시 반복기를 고갈시킵니다.

결론

이 기사는 회귀에 대한 확장 된 탐색을 완료합니다. 초보자이고 계산 그래프의 작동 방식을 심화하고 내부에서 모든 마법을 수행하는 데 많은 시간을 투자하지 않은 경우 tensorflow 버전 1.x가 기회를 제공합니다!

다음 기사에서는 MLP (Multilayer Perceptron)가 Tensorflow의 플레이 그라운드 데이터 세트를 학습하도록 만들 것입니다.

소스 코드: https://github.com/sniafas/ML-Projects/tree/master/Regression

참조 :

[1] https://huyenchip.com/

[2] https://www.tensorflow.org/guide/autodiff

[삼] https://www.easy-tensorflow.com/tf-tutorials/basics/introduction-to-tensorboard

[4] https://stackoverflow.com/questions/34240703/what-is-logits-softmax-and-softmax-cross-entropy-with-logits

Suggested posts

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.