我正在研究Keras如何使用内存。我的第一个问题是训练期间权重矩阵的更新是否就地完成(即,基础的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回调对象在每个时期结束时调用此函数。
我使用的是Theano后端,我尝试使用Keras附带的ResNet50模型以及我在网上找到的一些数据集。使用SGD或Adam作为优化程序,我总是得出相同的结论:
所有权重矩阵都会就地更新(其指针值不会更改),只有第一个具有数据的权重矩阵(对于Keras附带的ResNet50:conv1层的内核矩阵)
我正在尝试找出每次重新分配此特定权重矩阵而不是就地修改的原因。有想法吗?