如何使用TensorFlow实现keras激活功能?

时间:2019-01-30 08:11:54

标签: python tensorflow keras neural-network reinforcement-learning

我正在尝试将神经网络的一些keras代码更改为张量流代码。我选择了一些使用keras的片段,用于深层sarsa,如下所示。

模型的整个keras代码:

    model = Sequential()
    model.add(Dense(30, input_dim=15, activation='relu'))
    model.add(Dense(30, activation='relu'))
    model.add(Dense(5, activation='linear'))
    model.summary()
    model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate))

整个模型的张量流代码:

W1 = tf.Variable(tf.random_uniform([15, 30], -1., 1.))
W2 = tf.Variable(tf.random_uniform([30, 30], -1., 1.))
W3 = tf.Variable(tf.random_uniform([30, 5], -1., 1.))

b1 = tf.Variable(tf.zeros([30]))
b2 = tf.Variable(tf.zeros([30]))
b3 = tf.Variable(tf.zeros([5]))

L1 = tf.add(tf.matmul(X, W1), b1)
L1 = tf.nn.relu(L1)
L2 = tf.add(tf.matmul(L1, W2), b2)
L2 = tf.nn.relu(L2)
model = tf.add(tf.matmul(L2, W3),b3)

cost = tf.reduce_mean(tf.squared_difference(model,Y))
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)

但是我发现它们之间模型输出的规模非常不同。     例如,低于keras代码的输出为[0.4208471 -0.58310926 0.00578364 0.09069238 -1.1442541],张量流为[9.947895 39.215603 -23.376497 21.344461 -7.0058045]。关键是keras的性能要比张量流代码好得多。

我的问题是在线性激活的keras model.add中它到底在做什么。我猜想已经完成了某种标准化。我做了rando_uniform来初始化权重,但是我不确定random_normal是否比它更好。 无论如何,我想确切地知道如何将其更改为张量流代码。

[keras] 
model.add(Dense(5, activation='linear'))

[changed with tensorflow] 
W3 = tf.Variable(tf.random_uniform([30, 5], -1., 1.))
b3 = tf.Variable(tf.zeros([5]))
tf.add(tf.matmul(L2, W3),b3) 

我尝试使用tf.keras.activation.linear,但看起来还是有点不同。

谢谢。

1 个答案:

答案 0 :(得分:0)

与Dense等效的Tensorflow是tf.layers.dense: https://www.tensorflow.org/api_docs/python/tf/layers/dense
就您而言,应该是:

L1=tf.layers.dense(x,30,activation=tf.nn.relu)
L2=tf.layers.dense(x,30,activation=tf.nn.relu)
model=tf.layers.dense(x,5)

您可能已经注意到由于初始化问题而导致的性能差异。我认为两者都默认使用xavier初始化。如果您不打算添加批处理规范化,那么他的初始化可能会有所帮助。