Использование функции активации сигмоида в Керасе - PullRequest
0 голосов
/ 30 ноября 2018

У меня большой набор данных, состоящий из поля ввода 18260 с 4 выходами.Я использую Keras и Tensorflow для создания нейронной сети, которая может обнаружить возможный выходной сигнал.

Однако я пробовал много решений, но точность не становится выше 55%, если я не использую функцию активации sigmoid во всех слоях модели.кроме первого, как показано ниже:

def baseline_model(optimizer= 'adam' , init= 'random_uniform'):
# create model
model = Sequential()
model.add(Dense(40, input_dim=18260, activation="relu", kernel_initializer=init))
model.add(Dense(40, activation="sigmoid", kernel_initializer=init))
model.add(Dense(40, activation="sigmoid", kernel_initializer=init))
model.add(Dense(10, activation="sigmoid", kernel_initializer=init))
model.add(Dense(4, activation="sigmoid", kernel_initializer=init))
model.summary()
# Compile model
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model

Правильно ли использовать sigmoid для активации во всех слоях?Точность достигает 99,9% при использовании сигмоида, как показано выше.Поэтому мне было интересно, если что-то не так в реализации модели.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Нейронные сети требуют нелинейности на каждом слое для работы.Без нелинейной активации, независимо от того, сколько у вас слоев, вы можете написать одно и то же только одним слоем.

Линейные функции ограничены по сложности, и если "g" и "f" являются линейными функциями, g (f (x)) можно записать как z (x), где z также является линейной функцией.Бессмысленно складывать их без добавления нелинейности.

И именно поэтому мы используем нелинейные функции активации.сигмоид (g (f (x))) не может быть записан как линейная функция.

0 голосов
/ 30 ноября 2018

Сигмоид может работать.Но я предлагаю использовать активацию relu для активации скрытых слоев.Проблема в том, что активация вашего выходного слоя сигмовидная, но она должна быть softmax (потому что вы используете потерю sparse_categorical_crossentropy).

model.add(Dense(4, activation="softmax", kernel_initializer=init))

Редактировать после обсуждения комментариев

Ваши выходные данные являются целыми числами для классаэтикетки.Логистическая функция сигмоида выводит значения в диапазоне (0,1).Выходные данные softmax также находятся в диапазоне (0,1), но функция softmax добавляет еще одно ограничение на выходы: - сумма выходных данных должна быть равна 1. Поэтому выходные данные softmax можно интерпретировать как вероятность входных данных для каждого класса.,

Например


def sigmoid(x): 
    return 1.0/(1 + np.exp(-x))

def softmax(a): 
    return np.exp(a-max(a))/np.sum(np.exp(a-max(a))) 

a = np.array([0.6, 10, -5, 4, 7])
print(sigmoid(a))
# [0.64565631, 0.9999546 , 0.00669285, 0.98201379, 0.99908895]
print(softmax(a))
# [7.86089760e-05, 9.50255231e-01, 2.90685280e-07, 2.35544722e-03,
       4.73104222e-02]
print(sum(softmax(a))
# 1.0
0 голосов
/ 30 ноября 2018

Вы должны использовать одну или другую активацию, так как активация является источником для внесения нелинейности в модель.Если модель не имеет никакой активации, то она в основном ведет себя как однослойная сеть.Подробнее о «Зачем использовать активации здесь ».Вы можете проверить различные активации здесь .

Хотя кажется, что ваша модель переоснащается при использовании сигмоида, так что попробуйте методы преодоления, такие как создание наборов поезд / dev / test, уменьшая сложностьмодель, отсев и т. д.

...