Категориальная кроссэнтропия(categorical_crossentropy)

Идель

Новичок
Пользователь
Окт 24, 2020
4
0
1
Python:
pip install tensorflow==1.15
pip install keras==2.3
import gym         # загружаем "тренажер" Gym из платформы OpenAi, предоставляющий среду для работы над обучением с подкреплением 
import numpy as np # импортируем библиотеку для работы с массивами данных
import keras       # импортируем нейросетевую библиотеку 
from keras.models import Model, load_model # из кераса подгружаем абстрактный класс базовой модели, метод загрузки предобученной модели
from keras.layers import Dense, Flatten, Input, Lambda, Conv2D, MaxPooling2D, Reshape, Multiply # из кераса загружаем необходимые слои для нейросети
from keras.optimizers import RMSprop, Adam # из кераса загружаем выбранный оптимизатор
import time                                # модуль для операций со временными характеристиками
import matplotlib.pyplot as plt            # импортируем библиотеку для визуализации данных
%matplotlib inline
###########################
# Функция потерь в керасе имеет вид def loss(yTrue,yPred):...А так как нам нужно включить reward в loss, создаем...
# ...функцию rewardedLoss поверх неё, чтобы на входе добавить episodeReward
###########################
def rewardedLoss(episodeReward): # задаем новую функцию потерь, принимающую episodeReward, награда
  def loss(yTrue,yPred):
    # подаём в кач-ве yTrue фактически сделанное действие(action)
    # если фактически сделанное действие было движением вверх - подаем 1 на yTrue, если нет то подаем 0
    # yPred - выход сетки(вероятность выбора движения вверх)
    # мы не подаём yPred в нейронку, его вычисляет керас
    
    # сначала log(0) and log(1) неопределены - загоняем yPred между значениями:
    tmpPred = Lambda(lambda x: keras.backend.clip(x,0.05,0.95))(yPred)
    # вычисляем логарифм вероятности. yPred - вероятность выбора движения вверх
    # помним что yTrue = 1 когда фактически выбрано движение вверх, и 0 - когда вниз
    # формула похожа на кросс-энтропию в керасе, но здесь мы прописываем её вручную, чтобы умножить на значение награды
    tmpLoss = Lambda(lambda x:-yTrue*keras.backend.log(x)-(1-yTrue)*(keras.backend.log(1-x)))(tmpPred)
    # обновленная функция потерь - "функция политики"
    policyLoss = Multiply()([tmpLoss, episodeReward]) #добавляем в loss умножение на награду за эпизод
    return policyLoss # ввели обновленную функцию политики
  return loss         # возвращаем обновленную функцию политики


у меня есть такой код, он работает как лосс для обучения с подкреплением, где yTrue - это действие, которое было совершено роботом, и yPred - действие, которое предсказал робот, тут прикол в том, что на loss влияет так называемая "награда"(episodeReward)(от -1 до 1), т.е на любое действие есть или штраф, или награда. т.е тут шутка еще в том, что если робот должен предсказать не просто действие, а еще и то, чтобы действие было "правильным"(штраф/награда), функция не много изменена, чтобы можно было подавать на питон одновременно ypred,ytrue и саму награду. Еще формула изменена, чтобы нейронка, даже если вероятность дейсвтия номер 1- 70 % и вероятность дествия номер 2 - 30 % совершала не тупо действие - 1, а была вероятнсть, что оно совершит действие 2. Фишка в том, что это реализовано на 2 действия.

Но у меня сейчас встал вопрос на три дейтсвия, и тут нужно как-то это перенести на categrotrical_crossentropy, [0.2, 0.1, 0.7]. Только я не знаю, как это сделать, помогите....
 

Форум IT Специалистов