Làm cách nào để áp dụng Softmax làm chức năng Kích hoạt trong Perceptron nhiều lớp trong scikit-learn? [đóng cửa]


9

Tôi cần áp dụng chức năng kích hoạt Softmax cho Perceptron nhiều lớp trong scikit. Các scikit documantation về chủ đề của các mô hình mạng thần kinh (giám sát) nói "MLPClassifier hỗ trợ phân loại đa lớp bằng cách áp dụng softmax như chức năng đầu ra." Câu hỏi là làm thế nào để áp dụng chức năng?

Trong đoạn mã dưới đây, khi tôi thêm Softmax dưới tham số kích hoạt thì nó không chấp nhận.

MLPClassifier(activation='Softmax', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

Mã lỗi là:

ValueError: Kích hoạt 'Softmax' không được hỗ trợ. Các kích hoạt được hỗ trợ là ('danh tính', 'logistic', 'tanh', 'relu').

Có cách nào để áp dụng chức năng kích hoạt Softmax để phân loại nhiều lớp trong scikit-learn không?

Câu trả lời:


7

Tôi cho rằng hàm Softmax được áp dụng khi bạn yêu cầu dự đoán xác suất bằng cách gọi phương thức mlp.predict_proba(X).

Để hỗ trợ cho giả định của mình, tôi đã phát triển thí nghiệm nhỏ này:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
import numpy as np

X,Y = load_iris().data, load_iris().target

mlp = MLPClassifier()
mlp.fit(X, Y)

print mlp.predict([3.1,  2.5,  8.4,  2.2])
print mlp.predict_proba([3.1,  2.5,  8.4,  2.2])
print "sum: %f"%np.sum(mlp.predict_proba([3.1,  2.5,  8.4,  2.2]))

Lưu ý rằng bất kể giá trị nào được cắm vào predict_proba(), vectơ xác suất đầu ra luôn tính tổng bằng 1. Điều này chỉ có thể đạt được bằng chức năng kích hoạt Softmax (Sử dụng một kích hoạt khác mà Softmax không đảm bảo rằng tổng số kích hoạt trong trận chung kết lớp sẽ chính xác một lớp, đặc biệt cho một mẫu chưa nhìn thấy).

Nếu dự đoán của tôi là đúng, nhìn vào tài liệu tôi không thể tìm thấy bất kỳ phương pháp nào để có được đầu ra của mạng trước Softmax ... Có thể vì lớp này chỉ dành cho phân loại (không phải hồi quy hoặc các thiết lập ưa thích khác).


4

MLPClassifier có thể được sử dụng cho "phân loại đa lớp", "phân loại nhị phân" và "phân loại đa nhãn". Vì vậy, lớp đầu ra được quyết định dựa trên loại Y:

  1. Đa lớp : Lớp ngoài cùng là lớp softmax

  2. Đa lớp hoặc Binary-class : Lớp ngoài cùng là logistic / sigmoid.

  3. Hồi quy : Lớp ngoài cùng là danh tính

Một phần mã từ sklearn được sử dụng trong MLPClassifier xác nhận nó:

        # Output for regression
        if not is_classifier(self):
            self.out_activation_ = 'identity'
        # Output for multi class
        elif self._label_binarizer.y_type_ == 'multiclass':
            self.out_activation_ = 'softmax'
        # Output for binary class and multi-label
        else:
            self.out_activation_ = 'logistic'
  1. Phân loại nhiều lớp: Đối với Tính năng X, chỉ có thể có một lớp. ví dụ: Phân tích tình cảm Cho một văn bản (X), là đầu ra (Y) là dương, trung tính hoặc âm. Nhị phân là một trường hợp của Multiclass khi chỉ có 2 đầu ra có thể.
  2. Phân loại đa nhãn: Đối với Tính năng X, có thể có nhiều lớp.

1

Không thể đồng ý với câu trả lời từ Daniel Lopez. Trong trường hợp của tôi, câu trả lời dự đoán_proba () không trả về kết quả softmax.

Câu trả lời từ TrideepRath có thể dễ dàng giải quyết vấn đề này. Để áp dụng softmax, hãy xác định out_activation_:

your_model.out_activation_ = 'softmax'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.