регуляризатор по-разному применяется между Keras и Tensorflow - PullRequest
0 голосов
/ 01 ноября 2019

Я хотел поиграть с регуляризаторами. Я думаю, что мои первоначальные интересы были удовлетворены путем устранения неполадок этой проблемы. Хотя проблема все еще остается. Регуляризатор не применяется при запуске из моего старомодного определения графа. Я не уверен, почему и задаюсь вопросом, может ли кто-нибудь помочь.

Этот код демонстрирует проблему.

>>> 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

Если kernel_regularizer в dl1 измененот 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, поэтому никаких комментариев к коду, только проблема, плз. Вот мой предпочтительный стиль кода.

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, но это не изменило вывод. Потери точно такие же, как если бы регуляризатора там вообще не было.

Как ни странно, аргументы работают при применении к GRU, определенным keras.layers таким же образом, только не к этим плотным слоям.

Я понимаю, что могу просто регулировать вручную, но это довольно сложно, и у Кераса есть этот хороший аргумент высокого уровня, который я могу добавить. Но это просто не работает. Кто-нибудь знает, почему он не регулирует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...