tensorflow - Tensorflow 密集层比 keras 顺序层差
问题描述
我尝试在逆摆(类似于购物车极点)问题上训练代理,这是强化学习的基准。我使用神经拟合 Q 迭代算法,该算法使用多层神经网络来评估 Q 函数。
我使用 Keras.Sequential 和 tf.layers.dense 分别构建神经网络,其他一切保持不变。然而,Keras 给了我一个很好的结果,而 tensorflow 没有。事实上,张量流根本不起作用,它的损失在增加,并且代理从训练中什么也没学到。
这里我介绍一下 Keras 的代码如下
def build_model():
model = Sequential()
model.add(Dense(5, input_dim=3))
model.add(Activation('sigmoid'))
model.add(Dense(5))
model.add(Activation('sigmoid'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
adam = Adam(lr=1E-3)
model.compile(loss='mean_squared_error', optimizer=adam)
return model
张量流版本是
class NFQ_fit(object):
"""
neural network approximator for NFQ iteration
"""
def __init__(self, sess, N_feature, learning_rate=1E-3, batch_size=100):
self.sess = sess
self.N_feature = N_feature
self.learning_rate = learning_rate
self.batch_size = batch_size
# DNN structure
self.inputs = tf.placeholder(tf.float32, [None, N_feature], 'inputs')
self.labels = tf.placeholder(tf.float32, [None, 1], 'labels')
self.l1 = tf.layers.dense(inputs=self.inputs,
units=5,
activation=tf.sigmoid,
use_bias=True,
kernel_initializer=tf.truncated_normal_initializer(0.0, 1E-2),
bias_initializer=tf.constant_initializer(0.0),
kernel_regularizer=tf.contrib.layers.l2_regularizer(1E-4),
name='hidden-layer-1')
self.l2 = tf.layers.dense(inputs=self.l1,
units=5,
activation=tf.sigmoid,
use_bias=True,
kernel_initializer=tf.truncated_normal_initializer(0.0, 1E-2),
bias_initializer=tf.constant_initializer(0.0),
kernel_regularizer=tf.contrib.layers.l2_regularizer(1E-4),
name='hidden-layer-2')
self.outputs = tf.layers.dense(inputs=self.l2,
units=1,
activation=tf.sigmoid,
use_bias=True,
kernel_initializer=tf.truncated_normal_initializer(0.0, 1E-2),
bias_initializer=tf.constant_initializer(0.0),
kernel_regularizer=tf.contrib.layers.l2_regularizer(1E-4),
name='outputs')
# optimization
# self.mean_loss = tf.losses.mean_squared_error(self.labels, self.outputs)
self.mean_loss = tf.reduce_mean(tf.square(self.labels-self.outputs))
self.regularization_loss = tf.losses.get_regularization_loss()
self.loss = self.mean_loss # + self.regularization_loss
self.train_op = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(self.loss)
两个模型是一样的。它们都有两个相同维度的隐藏层。我希望问题可能来自内核初始化,但我不知道如何解决它。
解决方案
使用 Keras 很棒。如果您想要更好的 TensorFlow 集成,请查看tf.keras。如果 Keras(或 tf.keras)默认值更好,则没有特别的理由使用 tf.layers。
在这种情况下, glorot_uniform 看起来像默认的初始化程序。这也是全局 TensorFlow 默认值,因此请考虑kernel_initializer
在您的问题中删除参数而不是显式截断正常初始化(或显式传递 Glorot)。
推荐阅读
- javascript - 为什么排序会立即完成?
- git - Azure DevOps ,git fetch failed with exit code 128,fatal:Authentication failed for
- java - When we use this type of syntax :- int a[]=new int[3<<1];
- python - 如何在 Tkinter 中强制注意弹出窗口
- angular - Common object change in all component when one of them edit it
- python - TFIDF Vectorizer throws ValueError: empty vocabulary
- arrays - 如何防止数组在 VBA 中的子过程之间重置值
- php - 是否可以将用大写字母书写的 Wordpress/woocommerce 标题更改为大写?
- typescript - 'shuterstock_init' 仅指一种类型,但在此处用作值
- javascript - 一个承诺的多个等待的解决顺序