Лекция 3. Обучение нейронных сетей в Keras. (Анализ данных на Python в примерах и задачах. Ч2)
HTML-код
- Опубликовано: 7 сен 2024
- compscicenter.ru/
Пример обучения нейронной сети. Критерии качества в Keras. Инициализация весов нейронной сети в Keras.
Лекция №3 в курсе "Анализ данных на Python в примерах и задачах. Часть 2" (осень 2018).
Преподаватель курса: Вадим Леонардович Аббакумов
Страница лекции на сайте CS центра: bit.ly/2Q6S6mV
Все видео курса: bit.ly/2NEwnWR
Очень нужная и полезная лекция! Каждое слово на вес золота! Спасибо!
50 эпох, один внутренний слой на 6 нейронов. loss='mse', optimizer='adam'. Качество модели на тестовых данных около 90%
tn_2 = initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=12345)
init_3 = initializers.Constant(value = 1e-3)
model3 = Sequential()
model3.add(Dense(6, input_dim=13, activation='relu', kernel_initializer=tn_2, bias_initializer=init_3))
# model3.add(Dense(10, activation='relu', kernel_initializer=tn_2, bias_initializer=init_3 ))
model3.add(Dense(3, activation='softmax', kernel_initializer=tn_2, bias_initializer=init_3))
model3.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
# Training a model
model3.fit(X_train, y_train_bin, epochs=50, batch_size=10)
>>>Epoch 50/50
119/119 [==============================] - 0s 229us/step - loss: 0.0556 - acc: 0.9244
У тебя же первый внутренний слой (а не один внутренний) на 6 нейронов. Потом еще второй на 10 и выходной слой 3.
Чтобы результаты полностью воспроизводились (получались одни и те же loss и accuracy при одинаковом зерне), нужно еще в model.fit передать параметр shuffle = False, иначе после каждой эпохи данные будут перемешиваться случайным образом и итоговый результат будет чуть отличаться.
Курс лекций просто отличный, пока это лучшее что я видел по нейронным сетям.
Отличная лекция! Спасибо!
Спасибо за знания.
Косинусное расстояние хорошо себя ведет с текстами. Там как раз «смыслы» текстов/фраз кодируются векторами. Косинусное расстояние как мера схожести тут как раз кстати (ведь два текста, описанные сонаправленными векторами, один из которых в n раз больше другого, можно смело записывать одинаковыми по теме/смыслу, просто один из них побольше, длиннее и т.д.)
Также, думаю, это может пойти в рекомендательные системы. Если мы фильмы, понравившиеся человеку, будем кодировать векторами, то схожие вектора помогут натолкнуть, какой фильм предложить человеку
// Хоть эта система и устарела уже((
В Keras Sequential значит, что блоки соединяются последовательно, при этом не обязательно получается сеть прямого распространения.
Сеть может быть такой (не прямого распространения):
model = Sequential()
model.add(Conv1D())
model.add(LSTM())
model.add(Flatten())
model.add(Dense())
Это верно. Вы считаете, что если бы я так и сказал на 3 лекции, то слушателем было бы понятнее?
Вадим Леонардович, меньше шансов запутаться! :-)
@@Vadim_Abbakumov Вадим Леонардович, а почему вы не делали стандартизацию перед подачей в нейронную сеть?
Предположение насчет причины "затыка" в обучении на данных по винишку:
Все входные иксы у нас положительные.
Веса мы инициализировали с распределением от ноля, т.е. половина изначально отрицательные.
Не получилось так, что половина нейронов на релу сразу улетели в ноль, получив отрицательный вход, и никаким образом оттуда уже не вылезли? Может стоит попробовать задавать начальное распределение весов с ожиданием 0,5, а не 0, или использовать сигмоид или елу.
UPD: попробовал поиграться с приложенным файлом. Замена активационной функции и прочие штуки ничего особенно не дают. Видимр, просто из этих данных не получится точно определить принадлежность вина.
Очень странно, что не получилось хотя бы "переобучить" сетку на тестовых данных. Хотябы тестовые данные она должна была по конкретным значениям запомнить.. странно.
UPD2: Все-же доточил до 98 на обучающей / 93 на тестовой. Сигмоид, 1 скрытый слой и аж 100 нейронов в нем. Перебор, конечно, но работает же.
Я бы начал с того, что перебирал зерна датчика. Долго и упорно...
Да, спасибо за совет. Я уже послушал следующую лекцию и понял, что любители использования избыточных ресурсов будут наказаны:) Попробую с меньшим количеством решить.
Вадим Леонардович, это тяжко искать золотое ядро. Лучше архитектуру улучшить или по-хитрому данные подготовить.
@@user-ou8bf3rm3o Это тяжко, согласен. Поэтому запускаем на 100 процессорах обучение с разными инициализациями. Время подбора сократилось в 100 раз... И так далее. GPU хорошо ускоряет обучение. Игры с архитектурами до получения бенчмарка рискованы - переобучением.
@@Vadim_Abbakumov я поигрался с внешними параметрами optimizer и loss. 97% точность на тренировочной выборке и 86% на тестовом наборе при loss='mse', optimizer='adam'.
При смене relu на sigmoid или при увеличении числа слоев с relu качество модели растет еще больше
Ничего не изменяя в коде, который представлен на экране, с первой же попытки получил
Epoch 300/300
12/12 [==============================] - 0s 2ms/step - loss: 0.2315 - accuracy: 0.8992.
Удивительно, как же сильно мне повезло)
Со второй попытки получил
Epoch 300/300
12/12 [==============================] - 0s 4ms/step - loss: 0.1937 - accuracy: 0.9160
На 3 и 4 попытки получилось 94.96%
Epoch 300/300
12/12 [==============================] - 0s 4ms/step - loss: 0.1408 - accuracy: 0.9496
28:10 Ты тычешь, а годы идут. LOL