Использование softmax в нейронных сетях для определения метки ввода

Я использую модель keras со следующими слоями, чтобы предсказать метку ввода (из 4 меток)

embedding_layer = keras.layers.Embedding(MAX_NB_WORDS, 
                                         EMBEDDING_DIM, 
                                         weights=[embedding_matrix], 
                                         input_length=MAX_SEQUENCE_LENGTH,
                                         trainable=False)

sequence_input = keras.layers.Input(shape = (MAX_SEQUENCE_LENGTH,), 
                                    dtype = 'int32')

embedded_sequences = embedding_layer(sequence_input)

hidden_layer = keras.layers.Dense(50, activation='relu')(embedded_sequences)
flat = keras.layers.Flatten()(hidden_layer)
preds = keras.layers.Dense(4, activation='softmax')(flat)
model = keras.models.Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
model.fit(X_train, Y_train, batch_size=32, epochs=100)

Однако функция softmax возвращает количество выходов из 4 (потому что у меня 4 метки)

Когда я использую функцию прогнозирования для получения прогнозируемого Y с использованием той же модели, я получаю массив из 4 для каждого X, а не одну единственную метку, определяющую метку для ввода.

model.predict(X_test, batch_size = None, verbose = 0, steps = None)

Как сделать так, чтобы выходной слой модели keras или функция model.predict выбирали одну единственную метку, а не выводили веса для каждой метки?


person spark problems    schedule 02.12.2017    source источник


Ответы (1)


Ниже приводится общая функция для выборки из вектора вероятности.

def sample(preds, temperature=1.0):
    # helper function to sample an index from a probability array
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)

Взято из здесь.

Параметр температуры определяет, насколько взвешиваются различия между весами вероятности. Температура, равная 1, рассматривает каждый вес «как есть», температура больше 1 уменьшает разницу между весами, температура меньше 1 увеличивает их.

Вот пример использования вектора вероятности на 3 метках:

p = np.array([0.1, 0.7, 0.2]) # The first label has a probability of 10% of being chosen, the second 70%, the third 20%

print(sample(p, 1)) # sample using the input probabilities, unchanged
print(sample(p, 0.1)) # the new vector of probabilities from which to sample is [  3.54012033e-09,   9.99996371e-01,   3.62508322e-06]
print(sample(p, 10)) # the new vector of probabilities from which to sample is [ 0.30426696,  0.36962778,  0.32610526]

Чтобы увидеть новый вектор, сделайте sample return preds.

person gionni    schedule 02.12.2017
comment
нет ли способа заставить сам слой softmax нормализовать значения или добавить какой-либо слой, который может нормализовать значение, вместо того, чтобы работать с выводом, который он производит (это означает, что выходное значение функции прогнозирования принадлежит одному из 4 возможных слои)? - person spark problems; 02.12.2017
comment
Не то, что я знаю из. Учтите, что слой softmax - это просто слой активации, а softmax - заданная функция, которую нельзя изменить. Если вам это нужно, вы можете создать свою собственную функцию активации. - person gionni; 02.12.2017