为什么Python eval为Keras正则化程序返回相同的对象?

问题描述 投票:0回答:1

我正在尝试将字符串(我从JSON读取)转换为Keras层可以使用的参数。但是,当我发现由eval函数创建的所有正则化器对象都相同时。

a = eval('l1(0.1)')
b = eval('l2(0.1)')
c = eval('l1_l2(0.1)')
print(a,b,c)

给出:

<tensorflow.python.keras.regularizers.L1L2 object at 0x0000013F003C2F60>
<tensorflow.python.keras.regularizers.L1L2 object at 0x0000013F003C2D68> 
<tensorflow.python.keras.regularizers.L1L2 object at 0x0000013F0032F160>

不应该eval('l1(0.1)')给出

<function tensorflow.python.keras.regularizers.l1(l=0.01)>

对于为什么发生这种情况的任何想法都将不胜感激。

python tensorflow keras eval
1个回答
0
投票

L1L2同时存储l1l2;在正则化器上运行,例如:

print(model.layers[1].kernel_regularizer.__dict__)
# {'l1': array(0., dtype=float32), 'l2': array(1., dtype=float32)}

访问一个或另一个:

print(model.layers[1].kernel_regularizer.l1) # 0.0
print(model.layers[1].kernel_regularizer.l2) # 1.0


完整的示例脚本:
from keras.layers import Input, Dense
from keras.regularizers import l2
from keras.models import Model

ipt   = Input(shape=(100,4))
x     = Dense(10, activation='relu', kernel_regularizer=l2(1))(ipt)
out   = Dense(1, activation='sigmoid', name='output')(x)
model = Model(ipt,out)
model.compile(optimizer='adam', loss='binary_crossentropy')


print(model.layers[1].kernel_regularizer.__dict__)
print(model.layers[1].kernel_regularizer.l1)
print(model.layers[1].kernel_regularizer.l2)
© www.soinside.com 2019 - 2024. All rights reserved.