python - 为什么 Python eval 为 Keras 正则化器返回相同的对象?
问题描述
我正在尝试将字符串(我从 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)>
任何关于为什么会发生这种情况的想法将不胜感激。
解决方案
L1L2
存储l1
和l2
; 在正则化器上,运行,例如:
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
在您的代码中,a
sets l1
、b
setsl2
和c
sets 两者。
完整示例脚本:
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')(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)
推荐阅读
- html - GRID CSS - 定义网格列时如何使子级居中?
- javascript - 如何将签名与反应挂钩一起使用?
- r - R shinyFiles:警告:[:“闭包”类型的对象中的错误不是子集[没有可用的堆栈跟踪]
- c++ - C ++在数组中查找值的索引
- python - 父目录符号在html中不起作用
- javascript - load 事件不适用于 addEventListener 但适用于 onload 属性
- jenkins - Jenkins 管道执行作业并获取状态
- python - 代理地址的正确格式
- python - 如何在 django 中添加多个地址?
- jupyter - 如何编写可用于两个测试的函数?