Обучение с использованием Metal Performance Shaders - проблемы с MPSNNGraph.encodeBatch - PullRequest
0 голосов
/ 16 декабря 2018

Я строю (довольно) тривиальную сверточную нейронную сеть (CNN) в MPSCNN и столкнулся с проблемой экспорта весов.

При обучении я сталкиваюсь с проблемами при вызове MPSNNGraph.encodeBatch , когда размер пакета больше 4 (что несколько необычно, учитывая, что MTLTexture имеет 4 канала).Каждый раз, когда я увеличиваю размер пакета, мне возвращают nan для весовых коэффициентов и коэффициентов смещения (как через источники данных, локально хранящиеся в MPSCNNConvolutionWeightsAndBiasesState (из метода обновления), так и экспортируя весовые коэффициенты из связанных узлов фильтра).

Я увеличил точность на графике и всех resultImages узлов для float32, а также добавил отсечение в оптимизатор, но без удачи.Есть ли способ определить, является ли это проблемой с памятью или переполнением используемых типов данных?Будет ли проблема заключаться в оптимизаторе, градиентах, состояниях или переносе из GPU в CPU?

Любые предложения, которые будут высоко оценены - я застрял на этом «вызове» уже большую часть недели- ура.

--- ОБНОВЛЕНИЕ --- Некоторая дополнительная информация

Формат хранения графика по умолчанию установлен на Float32 - Я изменил размер пакета (все остается постоянным) и установил стиль обучения на CPU, чтобызахватить градиенты моего самого верхнего слоя - ниже приведены результаты (вывод первых 10 коэффициентов) - (a, b, ...), просто указывающие повторные прогоны (первый обратный проход для каждого).

ПАРТИЯ SIZE = 4

1020 * Градиент веса l1 (а) ... 1568 ... [0,0032182545, 0,0018722187, 0,004452133, 0,0027766703, 0,004814127, 0,002290076, 0,0005896213, 0,002064481, 0,0019948026, 0,0055566807,0,003961149]

Градиентный вес l1 (b) ... 1568 ... [0,0032182545, 0,0018722187, 0,004452133, 0,0027766703, 0,004814127, 0,002290076, 0,0005896213, 0,002064481, 0,0019948026, 0,0055566807, 0,0023 * 10, 10396, 0,00236 * 10, 10396Вес градиента l1 (c) ... 1568 ... [0,0032182545, 0,0018722187, 0,004452133, 0,0027766703, 0,004814127, 0,002290076, 0,0005896213, 0,002064481, 0,0019948026,0,0055566807, 0,003961149]

Размер партии = 8

Вес градиента l1 (a) ... 1568 ... [-0,35463914, 0,58976394, -0,59485054, 0,22903103,-0,51804817, 0,59701616, 0,5051392, 0,074297816, 0,4284085, -0,8984931, -0,10788263]

Градиентные веса l1 (b) ... 1568 ... [-0,8611915, 0,1266895555, -0,20885014, -0,102,650, -0,102,6020, -0,23424746, -0,4674223, -0,6518867, -0,23104043, -0,40736914, -0,31194344]

Размер партии = 16

Градиентный вес l1 (a) ...1568 ... [1.26359e + 35, 5.4729107e + 35, 3.3159668e + 35, 5.214483e + 35, 3.2493971e + 35, 9.169122e + 35, 9.311691e + 35, 2.1583421e + 35, 3.952557e + 35,2.3942557e + 35, 3.6645236e + 35]

Градиентные веса l1 (b) ... 1568 ... [0,09119261, 0,05756697, 0,07213145, 0,014482293, 0,09319483, 0,038098965, 0,06368228, 0,09818747, 0,034 0,0818987, 0,0340.011597654]

Градиентный вес l1 (c) ... 1568 ... [-nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan]

Размер партии = 32

Градиентный вес l1 (a) ... 1568 ... [1.2068136e + 35, -2.3001325e + 34, 2.1084688e + 35, -2.9456847e + 35, 9,786839e + 33, -6,9434864e + 35, -1,4935384e + 35, -1,0668826e + 35, -1,9871346e + 35, 7,397618e + 34, -2,4444336e + 35]

Градиентный вес l1 (b) ... 1568 ... [-1.3880644e + 35, -2.4221317e + 34, -1.1778572e + 35, -1.7336298e + 35, -1.8964465e + 35, -2.3253935e + 35,-4.467901e + 35, -2.1361668e + 35, -8.294703e + 34, -1.3844599e + 35, -2.800067e + 35]

Градиентные веса l1 (c) ... 1568 ... [-нан, -нан, -нан, -нан, -нан, -нан, -нан, -нан, -нан, -нан, -нан]

Я бы подумал, что градиенты были бы усреднены?Несмотря на это;кажется, что становится нестабильным, когда вы увеличиваете размер пакета, так как размер пакета 4 показывает то, что вы ожидаете - постоянный градиент (все остальное остается постоянным - отсева удаляются).

Переполнение в процессе, проблемы с памятью?

...