-3

내가 사용하는 학습 데이터 세트는 각 픽셀이 개별 샘플을 나타내는 회색 음영 이미지 인 flatten입니다. 두 번째 이미지는 이전 이미지에서 Multilayer perceptron (MLP) 분류자를 학습 한 후 픽셀 단위로 분류됩니다.감독 분류에서 fit()보다 성능이 떨어지는 partial_fit()가있는 MLP

문제는 청크 (partial_fit())와 비교하여 훈련 데이터 세트를 한 번에 받으면 (fit()) MLP이 더 잘 수행된다는 것입니다. 두 경우 모두 Scikit-learn에 의해 제공되는 기본 매개 변수를 유지할 것입니다.

훈련 데이터 세트가 수백만 개의 샘플 순서로되어 있기 때문에 MLP을 청크로 훈련 시키려면 partial_fit()을 사용해야합니다. 나는 그것이 데이터의 덩어리에 의해 훈련 때 더 허용의 결과를 확인하기 위해 MLP 분류에 조정해야하는 매개 변수

def batcherator(data, target, chunksize): 
    for i in range(0, len(data), chunksize): 
     yield data[i:i+chunksize], target[i:i+chunksize] 

def classify(): 
    classifier = MLPClassifier(verbose=True) 

    # classifier.fit(training_data, training_target) 

    gen = batcherator(training.data, training.target, 1000) 
    for chunk_data, chunk_target in gen: 
     classifier.partial_fit(chunk_data, chunk_target, 
           classes=np.array([0, 1])) 

    predictions = classifier.predict(test_data) 

내 질문은?

나는 hidden_layer_sizes을 사용하여 숨겨진 레이어의 뉴런 수를 늘리려고했지만 아무런 개선이 없었습니다. 기본 레이어 relu에서 logistic으로 숨겨진 레이어의 활성화 기능을 activation 매개 변수로 변경해도 개선되지 않습니다.

아래는 내가 일하고 있어요 이미지는 그들이 numpy 배열에서 CSV로 내 보낸 Google Fusion 테이블에 대한 링크 (그들 모두 512x512 이미지가) (부동 소수점 대신 int로 이미지를 떠날) :

Training_data : 흰색 영역은 마스크 아웃된다

: Google Fusion Table (training_data)

Class0 :

,

enter image description here

클래스 1 :

enter image description here

Training_target :

Google Fusion Table (training_target)

Test_data :

,536,913 (partial_fit 포함) 63,210

enter image description here

Google Fusion Table (test_data)

예측 :

enter image description here

Google Fusion Table (predictions)

+2

매개 변수 조정의 영향을 덜받는 선형 분류기와 영향을받는 비선형 분류기를 사전 처리 및 공동 작업을 표시하지 않고 알 수없는 데이터 집합의 기본 설정과 비교하면서 이 지배에 대한 통계를 보여줍니다. 게다가 : 하나가 선형이고, 다른 하나가 비선형인데, 비선형적인 것을 개선하려고했습니다. 더 비선형 적으로 만들었습니다. 이것의 대부분은별로 의미가 없으며 재현 할 수 없으므로 도움이되지 않습니다. 예외를 말하면 어떨까요? 숨겨진 레이어를 제거하거나 정규화를 늘립니다. – sascha

+2

또한 SGD는 5 개의 신기원을 수행 할 수 있습니다. MLP는 1 개입니다 (꽤 큰 미니 바). – sascha

+0

@ sascha 문제가 조금 바뀌면서 방금 질문을 업데이트했습니다. 질문의 어떤 부분이 더 자세한 내용이 필요한지 알려주십시오. – h4k1m

답변

1

TL, DR : 소규모 학습 속도와 다른 사용하여 데이터에 여러 루프를 만들 관측 순서와 partial_fit은처럼 훌륭하게 수행됩니다..

많은 청크가있는 partial_fit의 문제점은 모델이 마지막 청크를 완료하면 첫 번째 청크를 잊어 버릴 수 있다는 것입니다. 즉, 초기 배치로 인한 모델 가중치의 변경은 늦은 배치에서 완전히 덮어 쓰게됩니다.

이 문제는, 그러나,의 조합으로 충분히 쉽게 해결할 수 있습니다

  1. 낮은 학습 속도을. 모델이 느리게 학습하면 느리게 잊어 버리며 초기 배치는 늦은 배치에서 덮어 쓰지 않습니다. MLPClassifier의 기본 학습률은 0.001이지만, 3 또는 10의 배수로 변경할 수 있으며 어떤 일이 발생하는지 볼 수 있습니다.
  2. 여러 신기원. 학습 속도가 느린 경우 모든 학습 샘플에 대해 하나의 루프가 모델이 수렴하기에 충분하지 않을 수 있습니다. 따라서 교육 데이터에 대해 여러 개의 루프를 만들 수 있으며 결과가 향상 될 것입니다. 직관적 인 전략은 학습 속도를 줄이는 것과 동일한 요인으로 루프의 수를 늘리는 것입니다.
  3. 셔플 링 관측. 개 이미지가 고양이 이미지보다 먼저 나타나면 최종 모델에서는 강아지보다 고양이에 대해 더 많이 기억할 것입니다.그러나 배치 생성기에서 관찰 장치를 임의로 섞으면 문제가되지 않습니다. 가장 안전한 전략은 각 신기원 이전에 데이터를 새로 개편하는 것입니다.
+0

"셔플"이 필요하다는 것이 옳았습니다. 추가 할 때'fit()'으로 얻은 결과와 partial_fit()을 사용하여 비슷한 결과를 얻습니다. 분류의 정확성을 약간 향상시킨 또 다른 요소는 데이터 집합의 [밸런싱] (http://contrib.scikit-learn.org/imbalanced-learn/stable/generated/imblearn.over_sampling.SMOTE.html)입니다 하나의 트레이닝 클 래스는 다른 트레이닝 클 래스에 비해 상당히 큽니다). 나는 아직 학습 속도와 신기원을 조정하려하지 않았다. – h4k1m

관련 문제