2

我有一个包含1700万观察值的数据集,我试图用它来训练DNNRegressor模型。但是,培训根本不起作用。损失大约10^15,这真是令人震惊。我已经尝试了几个星期的不同事情,无论我做什么,我都无法承受损失。TensorFlow培训不起作用:模型没有学习数据

例如,训练后我进行测试predition与用于训练数据相同的观察结果中的一个。预期的结果是140944.00,但预测产品-169532.5,这是很荒谬的。训练数据中甚至没有任何负面的价值,我不明白它如何可以如此。

下面是一些示例训练数据:

Amount  Contribution ServiceType  Percentile  Time Result 
214871.00 3501.00   SM23   high    50  17807828.00 
214871.00 3501.00   SM23   high    51  19216520.00 
214871.00 3501.00   SM23   high    52  19676064.00 
214871.00 3501.00   SM23   high    53  21038840.00 
214871.00 3501.00   SM23   high    54  22248295.00 
214871.00 3501.00   SM23   high    55  22412713.00 
28006.00 83.00   SM0    i_low   0  28006.00 
28006.00 83.00   SM0    i_low   1  28804.00 
28006.00 83.00   SM0    i_low   2  30140.00 
28006.00 83.00   SM0    i_low   3  31598.00 
28006.00 83.00   SM0    i_low   4  33130.00 
28006.00 83.00   SM0    i_low   5  34663.00 

这是我的代码:

feature_columns = [ 
    tf.feature_column.numeric_column('Amount', dtype=dtypes.float32), 
    tf.feature_column.numeric_column('Contribution', dtype=dtypes.float32), 
    tf.feature_column.embedding_column(
     tf.feature_column.categorical_column_with_vocabulary_list(
      'ServiceType', 
      [ 
       'SM0', 'SM1', 'SM2', 'SM3', 
       'SM4', 'SM5', 'SM6', 'SM7', 
       'SM8', 'SM9', 'SM10', 'SM11', 
       'SM12', 'SM13', 'SM14', 'SM15', 
       'SM16', 'SM17', 'SM18', 'SM19', 
       'SM20', 'SM21', 'SM22', 'SM23' 
      ], 
      dtype=dtypes.string 
     ), 
     dimension=16 
    ), 
    tf.feature_column.embedding_column(
     tf.feature_column.categorical_column_with_vocabulary_list(
      'Percentile', 
      ['i_low', 'low', 'mid', 'high'], 
      dtype=dtypes.string 
     ), 
     dimension=16 
    ), 
    tf.feature_column.numeric_column('Time', dtype=dtypes.int8) 
] 

model = tf.estimator.DNNRegressor(
    hidden_units=[64, 32], 
    feature_columns=feature_columns, 
    model_dir=os.getcwd() + "\job", 
    label_dimension=1, 
    weight_column=None, 
    optimizer='Adagrad', 
    activation_fn=tf.nn.elu, 
    dropout=None, 
    input_layer_partitioner=None, 
    config=RunConfig(
     master=None, 
     num_cores=4, 
     log_device_placement=False, 
     gpu_memory_fraction=1, 
     tf_random_seed=None, 
     save_summary_steps=100, 
     save_checkpoints_secs=0, 
     save_checkpoints_steps=None, 
     keep_checkpoint_max=5, 
     keep_checkpoint_every_n_hours=10000, 
     log_step_count_steps=100, 
     evaluation_master='', 
     model_dir=os.getcwd() + "\job", 
     session_config=None 
    ) 
) 

print('Training...') 
model.train(input_fn=get_input_fn('train'), steps=100000) 

print('Evaluating...') 
model.evaluate(input_fn=get_input_fn('test'), steps=4000) 

print('Predicting...') 
prediction = model.predict(input_fn=get_input_fn('predict')) 

print(list(prediction)) 

input_fn计算如下:

def split_input(): 
    data = pd.read_csv('C:\\all_data.txt', sep='\t') 

    x = data.drop('Result', axis=1) 
    y = data.Result 

    return train_test_split(x, y, test_size=0.2, random_state=123) 


def get_input_fn(input_fn_type): 
    train_x, test_x, train_y, test_y = split_input() 

    if input_fn_type == 'train': 
     return tf.estimator.inputs.pandas_input_fn(
      x=train_x, 
      y=train_y, 
      num_epochs=None, 
      shuffle=True 
     ) 
    elif input_fn_type == 'test': 
     return tf.estimator.inputs.pandas_input_fn(
      x=test_x, 
      y=test_y, 
      num_epochs=1, 
      shuffle=False 
     ) 
    elif input_fn_type == 'predict': 
     return tf.estimator.inputs.pandas_input_fn(
      x=pd.DataFrame(
       { 
        'Amount': 52050.00, 
        'Contribution': 1394.00, 
        'ServiceType': 'SM0', 
        'Percentile': 'i_low', 
        'Time': 5 
       }, 
       index=[0] 
      ), 
      num_epochs=1, 
      shuffle=False 
     ) 

的输出如下:

Training... 
INFO:tensorflow:loss = 6.30944e+15, step = 1 
INFO:tensorflow:global_step/sec: 457.091 
INFO:tensorflow:loss = 3.28245e+15, step = 101 (0.219 sec) 
INFO:tensorflow:global_step/sec: 533.271 
INFO:tensorflow:loss = 2.65647e+15, step = 201 (0.188 sec) 
INFO:tensorflow:global_step/sec: 533.274 
... 
INFO:tensorflow:loss = 1.06601e+15, step = 99701 (0.203 sec) 
INFO:tensorflow:global_step/sec: 533.289 
INFO:tensorflow:loss = 2.12652e+15, step = 99801 (0.188 sec) 
INFO:tensorflow:global_step/sec: 533.273 
INFO:tensorflow:loss = 1.31647e+15, step = 99901 (0.203 sec) 
INFO:tensorflow:Saving checkpoints for 100000 into C:\projection_model\job\model.ckpt. 
INFO:tensorflow:Loss for final step: 2.88956e+15. 
Evaluating... 
INFO:tensorflow:Evaluation [1/4000] 
INFO:tensorflow:Evaluation [2/4000] 
INFO:tensorflow:Evaluation [3/4000] 
... 
INFO:tensorflow:Evaluation [3998/4000] 
INFO:tensorflow:Evaluation [3999/4000] 
INFO:tensorflow:Evaluation [4000/4000] 
INFO:tensorflow:Finished evaluation at 2017-08-30-19:04:03 
INFO:tensorflow:Saving dict for global step 100000: average_loss = 1.37941e+13, global_step = 100000, loss = 1.76565e+15 
Predicting... 
[{'predictions': array([-169532.5], dtype=float32)}] # Should be somewhere around 140944.00 

为什么模型没有学习数据?我试过不同的回归器和输入规范化,没有任何工作。

+0

,应该是比较快一个建议尝试:作为测试,这只是一个测试,请尝试使用每万分之一的数据点,使得数据集大小更小,故障排除相应速度更快。 –

回答

1

tf.contrib.learn.DNNRegressor隐藏了太多的细节,这是伟大的,如果一切都工作向右走,但相当令人沮丧,当它需要一些调试。

例如,很有可能学习率太高。你不会在代码中看到学习率,因为它是由DNNRegressor选择的。默认情况下,it's 0.05,这对许多应用程序是合理的,但在您的特定情况下可能太大。我建议你自己实例化优化器AdagradOptimizer(learning_rate)并将它传递给DNNRegressor

初始权重太大也可能是有可能的。 DNNRegressor使用tf.contrib.layers.fully_connected层而不重写 weights_initializerbiases_initializer。就像以前一样,默认值是非常合理的,但如果你希望它不同,你根本无法控制它。

我最常做的检查,如果神经网络是至少在某种程度上是工作减少训练设置为几个例子,并尝试过拟合神经网络。这个实验速度非常快,所以我可以尝试各种学习速率和其他超参数来找到最佳点,然后转向更大的数据集。

此外故障排除:可视化激活的分布在每一层中,梯度或权重的分布在tensorboard来缩小的问题。

+0

我已经尝试了许多不同的学习速率值,但没有成功。但是,我会研究体重值,并且也会尝试仅使用一些训练示例。 – jshapy8

相关问题