Путаница с функциями активации нейронных сетей - PullRequest
0 голосов
/ 17 июня 2019

Я следовал руководству по классификатору изображений с использованием Python и Tensorflow.

Сейчас я пытаюсь применить глубокое обучение к пользовательской ситуации.Я сделал программу симуляции продавцов / покупателей, где покупатели покупают камень по его желанию.Камни имеют цвет, размер и процент кривой.Чем ближе к клиенту желает ценить камень, тем больше клиент может заплатить.Для продавца чем реже камень, тем выше должна быть цена.Затем программа генерирует 100 000 покупок камня для питания нейронной сети, которая будет пытаться побить других продавцов.Набор данных выглядит так:

dataset

Я сейчас пытаюсь создать свою нейронную сеть.В этом уроке он использует два слоя Conv2D с функцией активации relu и MaxPooling2D, затем слой Flatten, плотный слой и, наконец, еще один плотный слой с функцией активации сигмоида.

После прочтения некоторой документации яобнаружил, что слой Conv2D предназначен для матрицы, но мои данные уже плоские, поэтому я предпочитаю использовать только плотные слои.

Мой первый вопрос: нужен ли моей нейронной сети плотный слой с функцией relu, подобной этой?:

model.add(Dense(64, activation='relu', input_dim(3)))

Если моя программа генерирует только положительные значения?

Мой второй вопрос: нужна ли моей нейронной сети сигмоидальная функция, если я уже нормализовал свои данные, чтобы сделать их между 0 и 1разделив их так?:

X[:,0] /= 256.0
X[:,1] /= 50.0
X[:,2] /= 100.0

Эти значения являются максимальными значениями для каждого столбца.Так нужна ли мне сигмовидная функция?

На самом деле моя нейронная сеть выглядит так:

model = Sequential()
model.add(Dense(64, activation='relu', input_dim(3)))
model.add(Dense(64, activation='relu'))
model.add(Dense(1,  activation='sigmoid'))

Но я не совсем понимаю эффективность моей модели.Может ли моя нейронная сеть работать?Если нет, то какие слои и функции активации я должен использовать?

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Мой первый вопрос: нуждается ли моя нейронная сеть в плотном слое с функцией релю:

Да.Ваша сеть требует ReLU, даже если ваши данные только положительные.Идея ReLU (и функций активации в целом) заключается в том, что они добавляют определенную сложность, так что классификатор может научиться обобщать.

Рассмотрим CNN, который принимает изображения в качестве входных данных.Входные данные здесь также состоят только из положительных значений ([0-1] или [0-255]), и они обычно имеют много и много слоев с нелинейностью ReLU.

Если моя программа генерирует только положительные значения?

Ваша путаница заключается в том, что ваши фактические отношения ввода-вывода дают только положительные значения, но ваш классификатор по-прежнему содержит веса, которые могут быть отрицательными, так что в противном случае выходные данные слоя могут быть отрицательными.

Кроме того, если бы у вас не было таких нелинейностей, как ReLU, не было бы смысла иметь несколько слоев, поскольку они не добавили бы сложности вашему классификатору.

второй вопросis: нужна ли моей нейронной сети сигмовидная функция, если я уже нормализовал свои данные, чтобы сделать их между 0 и 1, разделив их следующим образом?

Да.Вам также нужна сигмовидная кишка.Те же рассуждения, что и выше.Ваши данные могут быть положительными, но ваш выходной слой все равно сможет создавать отрицательные значения или значения, выходящие за пределы ожидаемого диапазона.

Наличие функции активации линейного выхода сделает обучение практически невозможным, особенно если ваш выходной диапазон находится в пределах [0,1].

0 голосов
/ 17 июня 2019

хорошо, если вы нормализуете так (/ max), также вы можете использовать сигмоид на входе, но это будет как-то менее точно при значениях max и min. Но я не понимаю, почему вы используете слой Conv2D, так как он полностью связан только с 4 входами. Также, если вы сгенерируете набор данных полностью случайным образом, сеть ничего не узнает

...