我想和正则表达式一起玩。我认为通过解决这个问题可以满足我的最初兴趣。虽然,问题仍然存在。从我的老式图形定义运行时,不应用正则化器。我不确定为什么,想知道是否有人可以提供帮助。
此代码演示了问题。
>>> 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中的kernel_regularizer从None更改为
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.LOSSES调整为REGULARIZED_LOSSES,但是它没有更改输出。损失与调节器根本不存在时的损失完全相同。
奇怪的是,这些参数以相同的方式应用于keras.layers定义的GRU时才起作用,但不适用于这些Dense层。
我意识到我可以手动调节,但这有点痛苦,而keras可以添加一个很好的高级论点。但是,它只是不起作用。有谁知道为什么它没有监管?