Tensorflow模型的性能明显低于Keras模型

时间:2019-05-10 01:01:04

标签: python tensorflow keras deep-learning regression

我的Tensorflow模型出现问题,决定尝试Keras。至少对我来说,我似乎在创建具有相同参数的相同模型,但是Tensorflow模型仅输出train_y的平均值,而Keras模型实际上根据输入而变化。我在tf.Session中缺少什么吗?我通常使用Tensorflow,从来没有像这样的问题。 Tensorflow代码:

score_inputs = tf.placeholder(np.float32, shape=(None, 100))
targets = tf.placeholder(np.float32, shape=(None), name="targets")

l2 = tf.contrib.layers.l2_regularizer(0.01)

first_layer = tf.layers.dense(score_inputs, 100, activation=tf.nn.relu, kernel_regularizer=l2)
outputs = tf.layers.dense(first_layer, 1, activation = None, kernel_regularizer=l2)

optimizer = tf.train.AdamOptimizer(0.001)
l2_loss = tf.losses.get_regularization_loss()
loss = tf.reduce_mean(tf.square(tf.subtract(targets, outputs)))
loss += l2_loss
rmse = tf.sqrt(tf.reduce_mean(tf.square(outputs - targets)))
mae = tf.reduce_mean(tf.sqrt(tf.square(outputs - targets)))
training_op = optimizer.minimize(loss)

batch_size = 32

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(10):
        avg_train_error = []
        for i in range(len(train_x) // batch_size):
            batch_x = train_x[i*batch_size: (i+1)*batch_size]
            batch_y = train_y[i*batch_size: (i+1)*batch_size]
            _, train_loss = sess.run([training_op, loss], {score_inputs: batch_x, targets: batch_y})

    feed = {score_inputs: test_x, targets: test_y}
    test_loss, test_mae, test_rmse, test_ouputs = sess.run([loss, mae, rmse, outputs], feed)

平均绝对误差为0.682,均方根误差为0.891。

Keras代码:

inputs = Input(shape=(100,))
hidden = Dense(100, activation="relu", kernel_regularizer = regularizers.l2(0.01))(inputs)
outputs = Dense(1, activation=None, kernel_regularizer = regularizers.l2(0.01))(hidden)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=keras.optimizers.Adam(lr=0.001), loss='mse', metrics=['mae'])
model.fit(train_x, train_y, batch_size=32, epochs=10, shuffle=False)
keras_pred = model.predict(test_x)

平均绝对误差为0.601,均方根误差为0.753。

在我看来,我在两种情况下都定义了相同的网络,但是正如我所说的,Tensorflow模型仅输出train_y的平均值,而Keras模型的性能要好得多。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

模型之间没有明显差异,但是由于训练中的随机变化,可能会解释不同的结果。尤其是因为您只训练了10个纪元,所以结果对模型随机选择的初始权重可能相当敏感。

尝试以更多的时间段(例如1000)运行并且每次运行几次(例如5)-平均结果应该相当接近。

答案 1 :(得分:0)

我将尝试指出两个代码之间的区别。

Keras文档here显示,权重由'glorot_uniform'初始化,而您的权重默认情况下被初始化,这很可能是随机的,因为文档没有明确说明tensorflow intialization是什么。所以初始化很可能与众不同 很重要。

第二个差异很可能是由于输入数据类型的差异,一个是numpy.float32,另一个是keras默认输入类型,文档也未指定

答案 2 :(得分:0)

@Priyank Pathak和@lehiester提供了一些有效的观点。考虑到他们的建议,我建议您更改以下内容并再次检查:

  1. 使用相同的kernel_initializerdata_type
  2. 使用更多的时代来更好地概括
  3. 植入您的randomnumpytensorflow函数