Я считаю, что после некоторых разговоров с коллегами я понимаю эту ситуацию и могу найти правильное решение проблемы. Хотя я знал, что Theano предоставлял тензорные функции с отложенным вычислением, которые запускали матричные операции на GPU, я не понимал, что функции потерь Кераса на самом деле написаны таким образом, что скомпилированный граф выполнения theano достаточно умен, чтобы кэшировать определенные значений для правильного обратного распространения значений потерь обратно по сети. Из-за типа сети, которую я создаю, я погрузился в написание моей собственной функции потерь, не полностью понимая, как Theano на самом деле обрабатывает потерю после того, как она была рассчитана функцией.
Насколько я могу судить, мое беспокойство было правильным, что использование Керасом последней оси является проблемой. В моем случае у меня есть полностью сверточная глубокая нейронная сеть, и входными данными для функции потерь являются (x, 7, 16, 16), где x - размер мини-пакета. Обычно нейронные сети выводят матрицу, в которой первое измерение - это размер мини-пакета, а второе (обычно последнее) измерение - это фактический размер выходного вектора. Из-за этого использование последней оси в выходном тензоре для получения фактической «средней» части среднеквадратичной ошибки некорректно. Вместо этого ось должна быть 1 (в случае индексации с нуля), потому что это 7 фактических выходных функций регрессии, которые необходимо дифференцировать для обратного распространения.
Изначально я знал, что ось = -1 может быть неправильной, и причина, по которой я разместил этот вопрос, заключалась в том, что я не мог полностью объяснить, почему. Прошло много времени с тех пор, как мне пришлось погрузиться в математику, лежащую в основе нейронных сетей, но когда я наконец это сделал, я смог устранить пробелы (Я думаю). Я отправляю этот ответ здесь для будущих людей, которые могут столкнуться с той же проблемой или пробелом в понимании тензорной структуры Теано.
person
Corey J. Nolet
schedule
18.01.2017