Путаница в отношении функций активации нейронных сетей

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

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

набор данных

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

Прочитав некоторую документацию, я обнаружил, что слой 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'))

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


person M. Ozn    schedule 17.06.2019    source источник
comment
Вам действительно нужно relu. Ваши данные не имеют значения. Нелинейность все еще присутствует, потому что ваши веса могут стать отрицательными. (Рассмотрим сеть image baswd, которая всегда положительна, и эти сети обычно имеют много функций relu.) Также вам нужен сигмоидальный выход. Тем не менее, диапазон выходных данных исходных данных здесь не имеет значения, поскольку в противном случае выходные данные сети могут по-прежнему давать значения за пределами этого диапазона.   -  person BlueRine S    schedule 17.06.2019
comment
Спасибо, теперь стало понятнее! Тогда я оставлю это так   -  person M. Ozn    schedule 17.06.2019
comment
Да, я добавил это и в качестве ответа для полноты картины.   -  person BlueRine S    schedule 17.06.2019


Ответы (2)


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

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

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

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

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

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

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

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

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

person BlueRine S    schedule 17.06.2019

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

person user8426627    schedule 17.06.2019
comment
Мой набор данных случайный, но желания постоянны. В основном покупатели покупают камень только в том случае, если он соответствует их желанию, поэтому я думаю, что сеть может оценить рыночный тренд? И я не использую слой Conv2D, особенно потому, что моему набору данных он не нужен. Я просто спросил, прав ли я? Думаю, в моем случае полезны только плотные слои, но какую функцию активации мне нужно использовать? - person M. Ozn; 17.06.2019
comment
да у вас здесь нет конво, так как все поля взаимосвязаны. Берем один скрытый слой с sig или relu, без активации на выходе. Если вы возьмете реальный набор данных о желаниях, это сработает, и вы извлечете реальную взаимосвязь с миром. Если вы просто сгенерируете его, он извлечет только что сгенерированное отношение - ›тупой ход. Таксы на самом деле очень простые, может быть, вы добавите некоторые другие поля, а не только 4. И если соотношение простое, NN - это излишне, и вы можете использовать там только классификатор KNN. - person user8426627; 17.06.2019