2017-01-22 1435 views
5

我使用Keras做一些实验,我只是监督权更新了一个简单的MLP模型:`layer.get_weights()`返回什么?

# model contains one input layer in the format of dense, 
# one hidden layer and one output layer. 
model=mlp() 
weight_origin=model.layers[0].get_weights()[0] 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
model.fit(.....) # with adam optimizer 
weight_updated=model.layers[0].get_weights()[0] 
print weight_origin-weight_updated 

对于第一致密层,我得到了零矩阵。我认为训练不会改变这个重量。但是,其他图层中的权重会发生变化。所以我很困惑,为什么第一层没有改变? 我检查了源代码,但仍然没有得到答案,然后我试图监控:

model.layers[0].get_weights()[1] # get_weight() returns a list of weights 

这一次,权做了改变。所以我想知道在训练过程中哪个重量是真正的重量?为什么权重列表中有两个元素?


mlp()定义:

def mlp(): 
    model=Sequential() 
    model.add(Dense(500, input_dim=784)) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(10, activation='softmax')) 
    return model 
+1

你能否给我们提供mlp()函数?这真是奇怪的行为 –

+0

@MarcinMożejko我已经更新了它。我对'layer.weights'列表中的第二个权重感到困惑。 –

+0

你编译过你的模型吗? –

回答

3

对于layer.get_weights()问题:

我跑在这个问题上的一些测试,并检查了源代码。我发现Dense层是Layer及其权重的子类,其是一种类型的蟒list的具有存储在layer.get_weights()[0]该层的两个元件重量和bias存储在layer.get_weights()[1]

有一两件事要注意的是,bias可以定义层中被禁用:model.add(Dense(503,init='normal',activation='relu',bias=False))。在这种情况下,列表layer.get_weights()只有一个元素。如果在定义它之后将bias属性设置为False,则仍然会有bias的元素,并且在拟合模型后会更新它。

对于问题不更新

我设置了序贯模型仅具有一个致密层:

def mlp_2(): model=Sequential() model.add(Dense(10, input_dim=784, activation='softmax', bias =False)) return model

然后我用同样的方式上述编译和适合它。这是我的了:

enter image description here

它似乎仍然没有更新的权重,但是,我们可以告诉重量肯定改变。因为准确度在增加。我认为唯一的解释是第一个dense图层(您定义input_dim)的更新对于Keras来说太小而无法打印。我没有检查权重的更精确的价值,如果有人能够认定它,这将是非常好的。