【问题标题】:Set attributes of Keras layer afterwards之后设置 Keras 层的属性
【发布时间】:2017-03-06 09:33:53
【问题描述】:

我有一个自定义的正则化器,需要分析模型输出张量。基本上我不能这样放。

model = Sequential()
model.add(Dense(128, name="dense_1", W_regularizer=Custom(0.1)))
model.add(Dense(nb_classes, name='dense_2'))
model.compile(loss='mse', optimizer='adam')
model.fit(..)

自定义函数需要目标标签张量的地方,不幸的是这种张量还没有实现。

我也尝试设置此类图层的属性:

model.add(Dense(128, name="dense_1"))
model.get_layer('dense_1').W_regularizer = Custom(0.1)

当此类层的get_config() 时,我看到它已正确应用,但在训练期间似乎不起作用。或者这种方式可能不是一个明智的实现方式。

【问题讨论】:

    标签: python deep-learning keras regularized


    【解决方案1】:

    要更改此类内容,您需要重新编译模型。这是因为编译过程会生成随后要最小化的训练函数。改变训练函数需要重新编译。

    只要打电话

    model.compile(...)
    

    在您进行更改后,它应该会按照您期望的方式工作。

    【讨论】:

    • 这两种方式都无法完成正确的工作。啊..我正在编辑(等待)
    • 把我目前的发现放在评论中。感谢您的帮助!
    【解决方案2】:

    感谢@Thomas,我尝试重新编译但没有按预期工作(如下所示)

    我尝试了以下方法..
    1) 直接指定(工作)

    #put inf number here for testing
    x = Dense(128,name="dense_1", W_regularizer = l2(1E300))
    model.add(x)
    ...
    model.compile(...)
    

    2) 之后设置属性并编译(不工作)

    x = Dense(128,name="dense_1")
    model.add(x)
    x.W_regularizer = l2(1E300)
    ...
    model.compile(...)
    

    3) 在 topology.layer 中使用add_weight(有效)

    x = Dense(128,name="dense_1")
    model.add(x)
    x.W = x.add_weight((x.input_dim, x.output_dim),
                   initializer='zero',
                   name='{}_W'.format(x.name),
                   constraint=x.W_constraint,
                   regularizer=l2(1E300))
    model.compile(...)
    

    对于 1) 3) 我得到了 loss: nan,这意味着修改已成功应用,并且 3) 是我想要的。而第二个没有。但必须有一个聪明的方法来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2020-02-02
      • 2017-03-31
      • 2018-04-30
      • 1970-01-01
      • 2019-08-21
      • 2018-08-16
      相关资源
      最近更新 更多