Нужен пример кода на Питоне обучения НС с подкреплением. Есть у кого?
Пытаюсь разобраться в обучении с учителем, но на русском как-то не много информации. В такой ситуации для меня будет проще разобраться через код.
Интересует пример кода обучения нейронной сети с подкреплением. Желательно в связке Python+Tensorflow. В сети находится много кода, но всё это обучение с учителем. В данном случае больше интересует часть, как в алгоритме обучения сделать свою функцию расчёта ошибки сети с последующей корректировкой весов.
Есть у кого-то что-то готовое или ссылка по теме на что-то русское?
Похоже там много интересного, но всё на английском, включая сам курс. А в таком объёме кода без описания мне кажется нереально разобраться.
Честно говоря, я ожидаю код в 15-20 строчек, в котором в первых пяти создаётся обычная НС, потом несколько строчек описывающих свою функцию расчёта ошибки сети и строчку-две корректирующих веса сети.
Неужели не существует стандартных операторов/функций позволяющих создать свою функцию "ошибки" и дать команду на пересчёт весов НС?
Владимир Олохтонов, это конечно не совсем то (тут обучение с учителем), но я так понимаю, меня интересует вот этот код
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
но как эту строчку criterion = nn.CrossEntropyLoss() заменить на нужную мне функцию? и что моя функция по-идее должна возвращать? в смысле в каком формате и в каких" рамках".
criterion = nn.CrossEntropyLoss()
...
loss = criterion(outputs, labels)
loss.backward()
Подскажите пожалуйста.
Я так понимаю, то что меня интересует переменная loss.
В примерах outputs это ответ НС, в моём случае outputs это должно быть какое-то расчётное значение моей функции основанное на ответе НС. labels это максимальное значение, которое может выдать моя функция.
Дальше backward делает обратное распространение ошибки.
Дальше это заворачиваем в один или два цикла (краткосрочная/долгосрочная выгода) и в принципе всё.
Я что-то упускаю или не правильно понимаю?
Владимир Олохтонов, огромнейшее спасибо, вы мне очень помогли. =)
Если можете ответить, то ещё один вопрос.
Моя функция будет тангенсоидом и выдавать значение в промежутке от -1 до +1 (меньше нуля - измеряется плохость, выше нуля - измеряется хорошесть).
В этом случае labels мне указывать как +1 или 0? Или как это всё организовать?
Просто по моей логике тангенсоид стремится к единице, но никогда её не пересекает. Если labels равно +1, тогда НС чуть больше или чуть меньше, но всегда будет наказана.
Если labels прировнять 0, то НС будет стремиться к бездействию, иначе тоже будет "наказана" при отклонении от нуля.
Как в этой ситуации лучше организовать логику оценок?
Или лучше тангенсоид не использовать? Но тогда непонятно как задать границы, потому что нормальное значение в рамках 100, но в исключительных ситуациях может в десятки разов отклоняться.
Ещё как вариант labels ровнять 0, а тангенсоиду в функции дать смещение в плюсовую сторону? ... но так я ограничу положительный результат рамками смещения.
FerroPanda, здесь не подскажу, к сожалению :)
Из общих соображений: отрезок [0, 1] эквивалентен [-1, 1]. Это нам, людям, удобнее смотреть, а сети лишь бы штраф прилетал :)