【问题标题】:Dropout setting layer weights array to emptyDropout 将层权重数组设置为空
【发布时间】:2018-03-08 00:34:25
【问题描述】:

我正在尝试访问该网络的训练权重值:

X = [[1] , [2], [3], [4], [5], [6], [7], [8]]
Y = [[1] , [2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8]]

from keras.callbacks import History 
history = History()

from keras import optimizers

inputDim = len(X[0])
print('input dim' , inputDim)
model = Sequential()

model.add(Dense(1, activation='sigmoid', input_dim=inputDim))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.add(Dropout(0.2))

sgd = optimizers.SGD(lr=0.009, decay=1e-10, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd , metrics=['accuracy'])
model.fit(X,Y , validation_split=0.1 , verbose=2 , callbacks=[history] , epochs=5,batch_size=32)

可以访问第一层的权重:

weights = model.get_layer(index=1).get_weights()
weights
[array([[-0.93537247]], dtype=float32), array([ 0.00989669], dtype=float32)]

但不在第二层:

weights = model.get_layer(index=2).get_weights()
weights
[]

似乎添加 dropout 导致了这个作为删除 dropout:

model.add(Dense(1, activation='sigmoid', input_dim=inputDim))
model.add(Dense(1, activation='sigmoid'))

导致访问权重成功

weights = model.get_layer(index=1).get_weights()
weights

[array([[-0.62137389]], dtype=float32), array([-0.05591233], dtype=float32)]

weights = model.get_layer(index=2).get_weights()
weights

[array([[-1.09568715]], dtype=float32), array([ 0.53271592], dtype=float32)]

阅读关于 Dropout 的信息:https://keras.io/layers/core/

“Dropout 包括在训练期间的每次更新时将输入单元的分数率随机设置为 0,这有助于防止过度拟合。”

辍学可视化: 源代码:http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf

所以神经元的一个子集被丢弃了。但是在我的示例中,似乎所有神经元都被丢弃了,因为第 2 层中的权重参数是一个空数组? 为什么添加 dropout 会导致后续层中的权重参数变得无法访问?

【问题讨论】:

    标签: keras dropout


    【解决方案1】:

    辍学没有权重。密集层(和一些其他类型)有。

    您的第一个模型有这些层:

    0: input layer - no weights 
    1: Dense(...) - weights and biases    
    2: Dropout(...) - no weights    
    3: Dense(...) - weights and biases
    4: Dropout(...) - no weights
    

    权重是属于单个层的可训练参数。

    dropout 只是有一个无法训练的常量参数。此参数仅删除部分结果。


    密集层使用它们的权重来改变输入并抛出输出:

    #pseudocode
    output = Weights x input + biases
    

    Dropout 层只会丢弃一些输出:

    #pseudocode - suppose the dropout parameter is 0.2
    output = input[take 80% of the elements]    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2019-01-19
      • 2018-02-25
      • 2019-08-09
      相关资源
      最近更新 更多