Có thể , nhưng lưu ý rằng đây là một trong những trường hợp mà máy học không phải là câu trả lời . Có xu hướng thử và học máy shoehorn trong các trường hợp thực sự, các giải pháp dựa trên quy tắc chuẩn không nhanh hơn, đơn giản hơn và nói chung là lựa chọn đúng: P
Chỉ vì bạn có thể, không có nghĩa là bạn nên
Chỉnh sửa : Ban đầu tôi viết điều này là "Có, nhưng lưu ý rằng ..." nhưng sau đó bắt đầu nghi ngờ bản thân mình, chưa bao giờ thấy nó được thực hiện. Tôi đã thử nó chiều nay và chắc chắn là có thể làm được:
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping
# Create an input array of 50,000 samples of 20 random numbers each
x = np.random.randint(0, 100, size=(50000, 20))
# And a one-hot encoded target denoting the index of the maximum of the inputs
y = to_categorical(np.argmax(x, axis=1), num_classes=20)
# Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y)
# Build a network, probaly needlessly complicated since it needs a lot of dropout to
# perform even reasonably well.
i = Input(shape=(20, ))
a = Dense(1024, activation='relu')(i)
b = Dense(512, activation='relu')(a)
ba = Dropout(0.3)(b)
c = Dense(256, activation='relu')(ba)
d = Dense(128, activation='relu')(c)
o = Dense(20, activation='softmax')(d)
model = Model(inputs=i, outputs=o)
es = EarlyStopping(monitor='val_loss', patience=3)
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(x_train, y_train, epochs=15, batch_size=8, validation_data=[x_test, y_test], callbacks=[es])
print(np.where(np.argmax(model.predict(x_test), axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())
Đầu ra là 0,74576, do đó, nó tìm đúng tối đa 74,5% thời gian. Tôi không có nghi ngờ rằng điều đó có thể được cải thiện, nhưng như tôi nói đây không phải là một usecase tôi muốn giới thiệu cho ML.
EDIT 2 : Thật ra tôi đã chạy lại sáng nay bằng cách sử dụng RandomForestClassifier của sklearn và nó hoạt động tốt hơn đáng kể:
# instantiation of the arrays is identical
rfc = RandomForestClassifier(n_estimators=1000, verbose=1)
rfc.fit(x_train, y_train)
yhat_proba = rfc.predict_proba(x_test)
# We have some annoying transformations to do because this .predict_proba() call returns the data in a weird format of shape (20, 12500, 2).
for i in range(len(yhat_proba)):
yhat_proba[i] = yhat_proba[i][:, 1]
pyhat = np.reshape(np.ravel(yhat_proba), (12500,20), order='F')
print(np.where(np.argmax(pyhat, axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())
Và điểm số ở đây là 94,4% số mẫu được xác định chính xác tối đa, điều này thực sự khá tốt.