正则化器在Keras和Tens中的不同应用

2024-10-06 12:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想和正规军一起玩。我认为通过解决这个问题,我最初的兴趣已经得到了满足。不过,问题依然存在。从我的老式图形定义运行时不应用正则化器。我不知道为什么,不知道是否有人能帮忙

这段代码演示了这个问题

>>> tf.__version__ = '1.13.1' 
>>> python3.5
import tensorflow as tf
import numpy as np
inputsData = np.array([[1.0, 2.0, 4.0, 8.0, 10.0],[2.0, 4.0, 8.0, 16.0, 32.0],[5.0, 10.0, 20.0, 40.0, 80.0]], dtype=np.float32)
outputsData = np.array([[5.3], [12.0], [25.2]])

我将从一个包含预定义权重初始值设定项的工作示例开始,以确保模型之间的一致性。在Keras风格中,一个简单的完全连接的模型可以工作

dl1 = tf.keras.layers.Dense(units=5, activation=tf.nn.relu, use_bias=True, kernel_initializer=tf.constant_initializer(value=[-0.01,-0.1,0.,0.1,0.01],dtype=tf.float32,verify_shape=False),bias_initializer=tf.constant_initializer(value=0.0,dtype=tf.float32,verify_shape=False),kernel_regularizer=None)
dl2 = tf.keras.layers.Dense(units=1, activation=tf.nn.relu, use_bias=False, kernel_initializer=tf.constant_initializer(value=0.1,dtype=tf.float32,verify_shape=False),bias_initializer=tf.constant_initializer(value=0.0,dtype=tf.float32,verify_shape=False),kernel_regularizer=None)
out = tf.keras.Sequential([dl1,dl2])
out.compile('adam','mean_squared_error')
history=out.fit(inputsData, outputsData, epochs=10, verbose=2)

损失被打印出来,表示正在学习

253.8417
252.1171
250.3671
248.5913
246.7898
244.9624
243.1089
241.2293
239.3234
237.3910

如果dl1中的内核正则化器从无更改为

tf.keras.regularizers.l2(l=100000.0)

那么,预计损失会更大,而且确实如此

2473.8416
2393.6802
2318.3376
2248.1445
2183.0325
2122.8918
2067.6382
2017.0981
1970.7825
1928.3906

现在,因为我觉得用这种老式的模型描述更好,所以我就是这么做的。我花了一段时间才停止使用tf.Variable,所以没有对代码的注释,只是问题plz。这是我喜欢的代码风格

inputLayer = tf.placeholder(shape=[None, 5],dtype=tf.float32)
outputTruths = tf.placeholder(shape=[None, 1],dtype=tf.float32)
dl1 = tf.keras.layers.Dense(units=5, activation=tf.nn.relu, use_bias=True, kernel_initializer=tf.constant_initializer(value=[-0.01,-0.1,0.,0.1,0.01],dtype=tf.float32,verify_shape=False),bias_initializer=tf.constant_initializer(value=0.0,dtype=tf.float32,verify_shape=False),kernel_regularizer=None)(inputLayer)
dl2 = tf.keras.layers.Dense(units=1, activation=tf.nn.relu, use_bias=False, kernel_initializer=tf.constant_initializer(value=0.1,dtype=tf.float32,verify_shape=False),bias_initializer=tf.constant_initializer(value=0.0,dtype=tf.float32,verify_shape=False),kernel_regularizer=None)(dl1)
loss = tf.losses.mean_squared_error(labels=outputTruths,predictions=dl2,loss_collection=tf.GraphKeys.LOSSES)
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
updateOps = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(updateOps):
  trainOp = optimizer.minimize(loss)

init = tf.global_variables_initializer()
with tf.Session() as sess:
  sess.run(init)
  for i in range(10):
    lossValue, _, out, hl = sess.run(fetches=[loss,trainOp,dl2,dl1],feed_dict={inputLayer: inputsData,outputTruths: outputsData})
    print(lossValue)

由于预定义的权重,此代码生成与上面第一个模型相同的损失值

当我重新添加正则化器时,问题就来了。似乎正则化器没有被识别。我尝试将tf.GraphKeys.loss调整为正则化的\u损失,但它没有改变输出。损失是完全一样的,如果正则化不存在

奇怪的是,当参数以相同的方式应用于keras.layers定义的GRU时,它们也能工作,只是不能应用于这些密集层

我意识到我可以手动调节,但这有点痛苦,keras有一个很好的高层论点,我可以补充。但是,它就是不起作用。有人知道为什么它不规范吗


Tags: nonefalsevaluetfkernelkerasinitializerverify