Estoy tratando de convertir cadenas (que leí de un JSON) a argumentos que pueden ser utilizados por las capas de Keras. Sin embargo, cuando encuentro que todos los objetos de regularizador creados por la función eval son los mismos.

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

Da:

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

No debería evaluar ('l1 (0.1)') dar

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

Cualquier idea sobre por qué está sucediendo esto sería muy apreciada.

1
siby 2 oct. 2019 a las 20:00

1 respuesta

La mejor respuesta

L1L2 almacena tanto l1 como l2; en el regularizador, ejecute, por ejemplo:

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

Para acceder a uno u otro:

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

En su código, a establece l1, b establece l2, y c establece ambos.


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)
1
OverLordGoldDragon 2 oct. 2019 a las 17:08