Как оптимизировать мою нейронную сеть? - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в нейронных сетях, и наблюдаю за тем, как много сумматоров сумели построить мою первую, но что-то не так.

Вход состоит из 100 входов, все цифры от 0 до 100. Выход имеет три класса [x, y, z], где только один из них может быть 1, а остальные должны быть 0, поэтому есть только 3 результата [1,0,0], [0,1,0] и [0,0,1]

Я экспериментирую со следующей настройкой

model = Sequential([
    Dense(32, input_shape=(100,), activation='sigmoid'),
    Dense(64, activation='sigmoid'),
    Dense(3, activation='sigmoid')
    ])

model.compile(Adam(lr=0.0001),loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(bets, results, validation_split= 0.20, batch_size=10, epochs=200, shuffle=True, verbose=3)

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

например [0,1, 0,3, 0,6] или [0,7, 0,2, 0,1] или [0,1, 0,8, 0,1]

Но когда я запускаю прогноз, я получаю что-то вроде

например [0,8, 0,2, 0,9]

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

есть идеи?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Нейронная сеть в нормальных условиях никогда не даст вам сумму возможностей, что означает, что P(a) не равно 1-P(b) в случае двух результатов. Вместо этого он дает приблизительное значение, близкое к этому после достаточного обучения, в зависимости от весовой функции.

Теперь, глядя на ваш код, вы, вероятно, обучаете наш NN неправильной логике. [0.8, 0.2, 0.9] выглядит как [1, 0 ,1], который дополняет один из ваших желаемых выходов [0, 1 ,0].

Распечатайте все ваши выходы, чтобы увидеть, так ли это, затем действуйте соответствующим образом, чтобы сместить вывод.

И еще одна вещь: с вашими желаемыми выходами NN даст вам что-то вроде [0.06, 0.93, 0.15], два близки к 0, а другой близок к 1. Значения не должны равняться 1, если они есть, то вы делаете что-то не так.

0 голосов
/ 17 мая 2018

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

Это должно работать:

model = Sequential([
    Dense(32, input_shape=(100,), activation='sigmoid'),
    Dense(64, activation='sigmoid'),
    Dense(3, activation='softmax')
])
model.compile(Adam(lr=0.0001),loss='categorical_crossentropy', metrics = ['accuracy'])
model.fit(bets, results, validation_split= 0.20, batch_size=10, epochs=200, shuffle=True, verbose=3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...