Tensorflow를 사용한 분류를 위한 신경망

소스 노드 : 1570297

이 기사는 데이터 과학 Blogathon

이 기사에서는 분류 문제를 해결하기 위해 TensorFlow를 사용하여 신경망 모델을 구축하겠습니다. Tensorflow에서 분류 문제에 어떻게 접근할 수 있는지 함께 살펴보겠습니다. 하지만 먼저, 저는 우리가 다음 질문에 답할 수 있는지 확인하고 싶습니다.

신경망은 무엇입니까?

신경망의 주요 목적은 데이터 세트의 특징 간의 관계를 찾으려고 노력하는 것이며 인간 두뇌의 작업을 모방하는 알고리즘 세트로 구성됩니다. 신경망의 "뉴런"은 특정 아키텍처에 따라 정보를 수집하고 분류하는 수학적 기능입니다.

분류란 무엇입니까?

분류 문제에는 어떤 것이 하나의 클래스에 속하는지 여부를 예측하는 문제가 포함됩니다. 즉, 그것을 하는 동안 우리는 무언가가 이렇거나 저렇다는 것을 보려고 노력합니다.

분류 유형

  • 어떤 사람이 당뇨병에 걸렸는지 여부를 예측하고 싶다고 가정해 보겠습니다. 이런 상황에 직면했다면 두 가지 가능성이 있지 않습니까? 그것은 호출됩니다 이진 분류.
  • 사진이 장난감인지, 사람인지, 고양이인지 확인하고 싶다고 가정해 보세요. 이것은 ... 불리운다 다중 클래스 분류 두 가지 이상의 옵션이 있기 때문입니다.
  • 기사에 어떤 카테고리를 할당할지 결정한다고 가정해 보겠습니다. 그렇다면 이렇게 불린다. 다중 레이블 분류, 하나의 기사에 둘 이상의 카테고리가 할당될 수 있기 때문입니다. 이 글을 통해 설명을 들어보겠습니다. 이 기사에는 "Deep Learning, TensorFlow, Classification" 등과 같은 카테고리를 할당할 수 있습니다.

이제 우리는 우리가 해결하려는 문제에 대한 공통된 이해를 가지게 되었기 때문에 앞으로 나아갈 수 있습니다. 이제 코딩을 할 차례입니다. 더 나아지고, 실수를 줄이는 유일한 방법은 더 많은 코드를 작성하는 것이기 때문에 여러분이 저와 함께 그것들을 적어 주시길 바랍니다.

우리는 사용할 라이브러리를 가져오는 것부터 시작합니다.

np로 numpy 가져오기 pd로 pandas 가져오기 plt로 matplotlib.pyplot 가져오기 tf print(tf.__version__)로 tensorflow 가져오기

데이터 세트 생성

이제 작업할 데이터세트를 생성할 차례입니다.

sklearn.datasets에서 import make_circles 샘플 = 1000 X, y = make_circles(샘플, 노이즈 = 0.03, random_state = 42)

우리는 몇 가지 데이터를 생성했습니다. 이에 대한 자세한 정보를 알아봅시다.

print(X >>[[ 0.75424625 0.23148074] [-0.75615888 0.15325888] [-0.81539193 0.17328203] ... [-0.13690036 -0.81001183] [ 0.67036156 -0.76750154 0.28105665] [ 0.96382443 XNUMX]]
인쇄(y) >> [1 1 1 1 0 1 1 1 1 0]

좋아요, 우리는 데이터 세트를 더 자세히 보았지만 아직 그것에 대해 아무것도 모릅니다. 그렇죠? 그렇기 때문에 여기서 중요한 단계 중 하나는 데이터와 하나가 되는 것이며, 이를 수행하는 가장 좋은 방법은 시각화입니다.

Circle = pd.DataFrame({ 'X0' : X[:, 0], 'X1' : X[:, 1], 'label' : y}) Circle.head()
Tensorflow 데이터 헤드를 사용한 분류용 신경망

여기서 한 가지 질문이 생깁니다. 우리는 어떤 종류의 라벨을 다루고 있습니까?

Circle.label.value_counts() >> 1 500 0 500 이름: label, dtype: int64

우리가 다루고 있는 것 같아 이진 분류 문제, 2개의 라벨(0과 1)이 있기 때문입니다.

plt.scatter(X[:,0], X[:,1], c = y, cmap = plt.cm.RdYlBu)
Tensorflow 산점도를 사용한 분류를 위한 신경망

위에서 언급했듯이 데이터를 활용하는 가장 좋은 방법은 시각화입니다. 이제 플롯은 어떤 종류의 모델을 구축해야 하는지 자체적으로 알려줍니다. 파란색 점과 빨간색 점을 구별할 수 있는 모델을 구축하겠습니다.

신경망 모델을 구축하기 전에 입력 및 출력 기능의 모양을 확인해야 합니다. 그들은 동일해야합니다!

print(X.shape, y.shape) print(len(X), len(y)) >> (1000, 2) (1000,) 1000 1000

각 특성에 대해 동일한 양의 값이 있지만 X의 모양이 다릅니다. 왜? 확인 해보자.

X[0], y[0] >> (배열([0.75424625, 0.23148074]), 1)

좋습니다. 2년 동안 1개의 X 특성이 있습니다. 그러면 우리는 문제 없이 앞으로 나아갈 수 있습니다.

Tensorflow를 사용한 분류를 위한 신경망 모델링 단계

TensorFlow에는 모델 생성을 위한 고정된 단계가 있습니다.

  • 모델 만들기 – Functional 또는 Sequential API를 사용하여 신경망의 레이어를 하나로 묶습니다.
  • 모델 컴파일 – 모델 성능을 측정하는 방법과 개선 방법을 정의합니다(손실 함수 및 최적화 프로그램).
  • 모드 피팅l – 모델이 데이터에서 패턴을 찾도록 허용

우리는 Sequential API를 사용할 것입니다. 자, 시작해 봅시다

tf.random.set_seed(42)
model_1 = tf.keras.Sequential([tf.keras.layers.Dense(1)])

model_1.compile(손실 = tf.keras.losses.BinaryCrossentropy(),

#우리는 2개의 클래스로 작업하기 때문에 바이너리를 손실 함수로 사용합니다.

 옵티마이저 = tf.keras.optimizers.SGD(), #SGD는 확률적 경사하강법 메트릭 = ['정확도']) model_1.fit(X, y, epochs = 5)
>> 1/5 32/32 [==============================] - 1s 1ms/단계 - 손실: 2.8544 - 정확도: 0.4600 Epoch 2/5 32/32 [==============================] - 0초 2ms/단계 - 손실 : 0.7131 - 정확도: 0.5430 Epoch 3/5 32/32 [===============================] - 0s 2ms/단계 - 손실: 0.6973 - 정확도: 0.5090 Epoch 4/5 32/32 [==============================] - 0s 2ms /단계 - 손실: 0.6950 - 정확도: 0.5010 Epoch 5/5 32/32 [==============================] - 0초 1ms/단계 - 손실: 0.6942 - 정확도: 0.4830

모델의 정확도는 약 50%입니다. 이는 기본적으로 모델이 추측일 뿐임을 의미합니다. 더 오랫동안 훈련해 보겠습니다.

model_1.fit(X, y, epochs = 200, verbose = 0) # 훈련 절차를 제거하기 위해 verbose = 0으로 설정 ) model_1.evaluate(X, y)
>> 32/32 [==============================] - 0초 1ms/단계 - 손실: 0.6935 - 정확도: 0.5000 [0.6934829950332642, 0.5]

200개의 에포크 이후에도 여전히 추측하는 것처럼 작동합니다. 다음 단계는 더 많은 레이어를 추가하고 더 오랫동안 훈련하는 것입니다.

tf.random.set_seed(42)
model_2 = tf.keras.Sequential([ tf.keras.layers.Dense(1), tf.keras.layers.Dense(1) ]) model_2.compile(loss = tf.keras.losses.BinaryCrossentropy(), 최적화 프로그램 = tf.keras.optimizers.SGD(),metrics = ['accuracy']) model_2.fit(X, y, epochs = 100, verbose = 0)
 model_2.evaluate(X,y)
>> 32/32 [==============================] - 0초 1ms/단계 - 손실: 0.6933 - 정확도: 0.5000 [0.6933314800262451, 0.5]

그래도 조금의 변화도 없는, 뭔가 잘못된 것 같습니다.

Tensorflow를 사용하여 분류 모델을 위한 신경망 개선

여러 단계에서 모델을 개선하는 방법에는 여러 가지가 있습니다.

  • 모델 생성 – 레이어 추가, 숨겨진 유닛(뉴런) 수 증가, 각 레이어의 활성화 기능 변경
  • 모델 컴파일 – 다른 최적화 함수를 사용해 보십시오. 예를 들어 SGD() 대신 Adam()을 사용하십시오.
  • 모델 피팅 - 시대의 수를 늘릴 수 있습니다

해보자 뉴런을 더 추가하세요 및 시도 아담 옵티 마이저

tf.random.set_seed(42)
model_3 = tf.keras.Sequential([ tf.keras.layers.Dense(100), # 100개의 조밀한 뉴런을 추가합니다 tf.keras.layers.Dense(10), # 10개의 뉴런을 가진 다른 레이어를 추가합니다 tf.keras.layers.Dense (1) ]) model_3.compile(loss=tf.keras.losses.BinaryCrossentropy(), Optimizer=tf.keras.optimizers.Adam(),metrics=['accuracy']) model_3.fit(X, y, epochs =100, 자세한 내용=0)
model_3.evaluate(X,y) >> 32/32 [===============================] - 0초 1ms/단계 - 손실: 0.6980 - 정확도: 0.5080 [0.6980254650115967, 0.5080000162124634]

아직도 나아지지 않고 있어요! 데이터를 시각화하여 무엇이 잘못되었는지 살펴보겠습니다.

신경망 모델 시각화

모델의 예측을 시각화하기 위해 다음과 같은 기능을 수행하는plot_decision_boundary() 함수를 만들 것입니다.

  • 훈련된 모델, 기능, 라벨을 받아들입니다.
  • 다양한 X 값의 메쉬그리드를 만듭니다.
  • meshgrid 전반에 걸쳐 예측을 수행합니다.
  • 선으로 예측을 그립니다.

참고 :  이 기능은 다음 두 가지 리소스에서 조정되었습니다.

CS231n ML 기본 사항으로 제작됨 

defplot_decision_boundary(model, X, y): # 플롯의 축 경계를 정의하고 메쉬그리드를 만듭니다. x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1 y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np .linspace(y_min, y_max, 100)) # X 값을 생성합니다(이 모든 것에 대해 예측할 것입니다) x_in = np.c_[xx.ravel(), yy.ravel()] # 훈련된 값을 사용하여 예측합니다. model y_pred = model.predict(x_in) # 다중 클래스 확인
 if len(y_pred[0]) > 1: print("다중 클래스 분류 중...") # 그래프를 그릴 수 있도록 예측을 재구성해야 합니다 y_pred = np.argmax(y_pred, axis=1).reshape( xx.shape) else: print("이진 분류 중...") y_pred = np.round(y_pred).reshape(xx.shape) # 플롯 결정 경계 plt.contourf(xx, yy, y_pred, cmap=plt. cm.RdYlBu, 알파=0.7) plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.RdYlBu) plt.xlim(xx.min( ), xx.max()) plt.ylim(yy.min(), yy.max())plot_decision_boundary(model_3, X, y)
결정 경계

여기있어! 다시 한번 시각화를 통해 무엇이 잘못되었고 무엇을 해야 하는지 보여줍니다. 우리 모델은 데이터를 통해 직선을 그리려고 노력하고 있지만 데이터는 직선으로 분리될 수 없습니다. 분류 문제에 뭔가 빠진 것이 있나요? 그것은 무엇입니까?

이것은 비선형성입니다! 비선형 선이 필요합니다. 지금은 혼란스러울 수도 있습니다. 이전에 그런 종류의 기능을 본 적이 없다고 생각한다면 틀린 것입니다. 왜냐하면 이미 봤기 때문입니다. 시각적으로 살펴보겠습니다. 시각화는 항상 더 잘 작동합니다!

신경망에는 다음과 같이 사용할 수 있는 몇 가지 활성화 함수가 있습니다. 르루, 시그 모이 드. 조금 만들어보자 장난감 텐서 그리고 그 기능을 확인해 보세요.

신경망 활성화 기능

A = tf.cast(tf.range(-12,12), tf.float32) print(A) >> tf.Tensor( [-12. -11. -10. -9. -8. -7. - 6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.], 모양=(11,), dtype=float24)

장난감 텐서가 어떻게 생겼는지 볼까요?

plt.plot(A)
신경망 활성화 기능

이렇게 생겼어요, 직선이에요! 

이제 활성화 함수를 다시 만들어 텐서에 어떤 영향을 미치는지 살펴보겠습니다.

시그모이드:

def 시그모이드(x): 1 / (1 + tf.exp(-x)) 반환 sigmoid(A) plt.plot(sigmoid(A))
시그 모이 드 기능

비직선!

리루:

이제 ReLu가 무엇을 하는지 확인해 볼까요? Relu는 모든 음수 값을 0으로 바꾸고 양수 값은 동일하게 유지합니다.

def relu(x): tf.maximum(0,x) plt.plot(relu(A)) 반환
르루

또 다른 비직선!

이제 비선형 활성화 함수를 보셨고 이것이 우리에게 도움이 될 것입니다. 모델은 선형 활성화 함수를 사용하는 비선형 데이터 세트에서 아무것도 배울 수 없습니다! 이것을 배웠다면 이제 데이터를 훈련 세트와 테스트 세트로 나누고 강력한 모델을 구축해야 할 때입니다.

X_train, y_train = X[:800], y[:800] X_test, y_test = X[800:], y[800:] X_train.shape, X_test.shape >>((800, 2), (200, 2 ))

 

좋습니다. 이제 훈련 세트와 테스트 세트가 준비되었습니다. 훈련 데이터를 모델링하고 모델이 테스트 세트에서 학습한 내용을 평가해 보겠습니다.

tf.random.set_seed(42)
model_4 = tf.keras.Sequential([ tf.keras.layers.Dense(4, 활성화 = 'relu'), # "tf.keras.activations.relu"도 맞을 수 있습니다 tf.keras.layers.Dense(4 , 활성화 = 'relu'), tf.keras.layers.Dense(1, 활성화 = 'sigmoid') ]) model_4.compile( 손실= tf.keras.losses.binary_crossentropy, 최적화 프로그램 = tf.keras.optimizers.Adam( lr = 0.01), 측정항목 = ['정확도']) model_4.fit(X_train, y_train, epochs = 25, verbose = 0)

모델 평가

loss, Accuracy = model_4.evaluate(X_test, y_test) print(f' 테스트 세트의 모델 손실: {loss}') print(f' 테스트 세트의 모델 정확도: {100*accuracy}')
>> 7/7 [==============================] - 0초 2ms/단계 - 손실: 0.1247 - 정확도: 1.0000 테스트 세트의 모델 손실: 0.1246885135769844 테스트 세트의 모델 정확도: 100.0

짜잔! 정확도 100%! 이 결과를 시각적으로 확인해보자

plt.Figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.title("기차")plot_decision_boundary(model_4, X=X_train, y=y_train) plt.subplot(1, 2, 2) plt.title("테스트")plot_decision_boundary(model_4, X=X_test, y=y_test) plt.show()
Tensorflow를 사용한 분류를 위한 이진 신경망

몇 가지만 수정하면 이제 모델이 파란색과 빨간색 원을 거의 완벽하게 예측할 수 있습니다.

결론

이 글에서 우리가 이야기하고 있는 내용을 간략하게 살펴보겠습니다. 우리는 TensorFlow를 사용하여 신경망에서 분류 작업에 접근하는 방법을 함께 살펴보았습니다. 우리는 가장 먼저 떠오른 방식으로 3가지 모델을 만들었고, 시각화의 도움으로 우리가 어디가 잘못되었는지 깨닫고 선형성, 비선형성을 탐색하고 마지막으로 일반화된 모델을 구축했습니다. 내가 이 모든 코드와 내가 따르고 있는 단계를 통해 보여주려고 했던 것은 100% 정확하거나 고정된 것은 없으며 모든 것이 매일 계속 변한다는 것입니다. 어떤 종류의 데이터에서 어떤 문제가 발생할지 추측하고 어떤 조합이 더 나은 결과를 가져오는지 확인하려면 훨씬 더 많은 코드를 작성하고 경험을 쌓는 것이 필요합니다.

이 글이 여러분에게 조금이나마 도움이 되기를 바라며, 기여를 하였기를 바랍니다.

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

출처: https://www.analyticsvidhya.com/blog/2021/11/neural-network-for-classification-with-tensorflow/

타임 스탬프 :

더보기 분석 Vidhya