Почему обновления Keras для весов не всегда на месте? - PullRequest
0 голосов
/ 11 марта 2019

Я исследую, как Керас использует память. Один из моих первых вопросов состоял в том, выполняется ли обновление матриц весов во время обучения (т. Е. Данные базовых массивов Numpy изменены, но сам массив остается в том же месте в памяти) или нет (т. Е. Новый Numpy массив выделяется и заменяет старый, который освобождается). Я предположил, что обновление было сделано на месте.

Чтобы проверить это, я использую следующий метод.

def show_layers_data(model):
    for l in model.layers:
        if(len(l.weights) == 0):
            print('Layer '+str(l.name)+' has no weights')
        for w in l.weights:
            arr = w.get_value(borrow=True)
            pointer, read_only_flag = arr.__array_interface__['data']
            print('Layer '+str(l.name)+' has array pointer '+str(pointer)+' (shape is '+str(arr.shape)+')')

Я использовал объект Keras Callback для вызова этой функции в конце каждой эпохи.

Я использую бэкэнд Theano и попробовал использовать модель ResNet50, которая поставляется с Keras и некоторыми наборами данных, которые я нашел в Интернете. Используя SGD или Adam в качестве оптимизаторов, я всегда получаю одно и то же заключение:

Все матрицы весов обновляются на месте (их значение указателя не изменяется), за исключением самого первого, у которого есть данные (в случае ResNet50, который поставляется с Keras: матрица ядра уровня conv1) .

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

...