为什么在转换为张量流估计量后,这种简单的tf.keras模型无法训练?

时间:2019-08-01 21:19:55

标签: python tensorflow machine-learning tensorflow-estimator tf.keras

我正在尝试使用tf.keras.estimator.model_to_estimator将tf.keras模型转换为张量流估计量,但是所得的估计量似乎不可训练。

我尝试使用顺序和功能性tf.keras API对y =(x_1 + x_2)/ 2进行建模,尽管tf.keras模型工作得很好,但在转换为估计量后都无法正常工作。将tf.estimator.LinearRegressor与相同的输入函数配合使用可以起作用,因此我认为输入函数没有问题。

这是依次定义的tf.keras模型的最小工作示例:

import numpy as np
import tensorflow as tf
import functools

sample_size = 1000

x_train = np.random.randn(sample_size, 2).astype(np.float32)
y_train = np.mean(x_train, axis=1).astype(np.float32) 

x_test = np.random.randn(sample_size, 2).astype(np.float32)
y_test = np.mean(x_test, axis=1).astype(np.float32) 

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(1, input_shape=(2,), name="Prediction"))
adam = tf.keras.optimizers.Adam(lr=0.1)
model.compile(loss='MSE', optimizer=adam)
#model.fit(x=x_train, y=y_train, epochs=10, batch_size=64)  # This works

est = tf.keras.estimator.model_to_estimator(keras_model=model)

def train_input_fn(batch_size):
    dataset = tf.data.Dataset.from_tensor_slices(({"Prediction_input": x_train}, y_train))
    return dataset.shuffle(sample_size).batch(batch_size).repeat()

def eval_input_fn(batch_size):
    dataset = tf.data.Dataset.from_tensor_slices(({"Prediction_input": x_test}, y_test))
    return dataset.batch(batch_size)

est.train(input_fn=functools.partial(train_input_fn, 64), steps=10)

eval_metrics = est.evaluate(input_fn=functools.partial(eval_input_fn, 1))
print('Evaluation metrics:', eval_metrics)

估计器接受了10个步骤的训练,应该足以减少损失。据我所知,增加步骤数没有什么区别。

当我在tensorflow 1.5.0上运行此代码时,我收到警告,关于在编译tf.keras模型时不赞成使用reduce_mean调用keep_dims的警告,但它可以很好地进行训练。 / p>

这是一个错误,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

事实证明,我要做的就是将目标重塑为(sample_size, 1)形状,并增加训练步骤。我仍然不确定目标形状为(sample_size, )时估算器在做什么,或者为什么这对于固定估算器来说不是问题,但至少我知道如何避免这种情况。