TensorFlow 训练不起作用:模型没有学习数据
TensorFlow training is not working: model is not learning data
我有一个包含超过 1700 万个观察值的数据集,我正在尝试使用它来训练 DNNRegressor
模型。但是,培训根本不起作用。损失在 10^15 量级,这简直是太恐怖了。几周来我一直在尝试不同的事情,无论我做什么我都无法减少损失。
例如,在训练之后,我使用用于训练数据的相同观察之一进行了测试预测。预期结果是 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
为什么模型没有学习数据?我尝试了不同的回归器和输入规范化,但没有任何效果。
tf.contrib.learn.DNNRegressor
隐藏了太多的细节,如果一切正常,这很好,但是当它需要一些调试时就非常令人沮丧。
例如,学习率很有可能太大了。您不会在代码中看到学习率,因为它是由 DNNRegressor
选择的。默认情况下,it's 0.05 对于许多应用程序来说都是合理的,但在您的特定情况下可能太大。我建议你自己实例化优化器 AdagradOptimizer(learning_rate)
并将其传递给 DNNRegressor
.
也有可能是初始权重太大了。 DNNRegressor
使用 tf.contrib.layers.fully_connected
层而不覆盖
weights_initializer
和 biases_initializer
。和以前一样,默认值是相当合理的,但是如果你想要它不同,你根本无法控制它。
为了检查神经网络是否至少以某种方式工作,我通常会做的是将训练集减少到几个例子并尝试过度拟合神经网络。这个实验非常快,所以我可以尝试各种学习率和其他超参数来找到一个最佳点,然后转向更大的数据集。
进一步排查问题:可视化每层中激活的分布,tensorboard中梯度或权重的分布以缩小问题范围。
我有一个包含超过 1700 万个观察值的数据集,我正在尝试使用它来训练 DNNRegressor
模型。但是,培训根本不起作用。损失在 10^15 量级,这简直是太恐怖了。几周来我一直在尝试不同的事情,无论我做什么我都无法减少损失。
例如,在训练之后,我使用用于训练数据的相同观察之一进行了测试预测。预期结果是 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
为什么模型没有学习数据?我尝试了不同的回归器和输入规范化,但没有任何效果。
tf.contrib.learn.DNNRegressor
隐藏了太多的细节,如果一切正常,这很好,但是当它需要一些调试时就非常令人沮丧。
例如,学习率很有可能太大了。您不会在代码中看到学习率,因为它是由 DNNRegressor
选择的。默认情况下,it's 0.05 对于许多应用程序来说都是合理的,但在您的特定情况下可能太大。我建议你自己实例化优化器 AdagradOptimizer(learning_rate)
并将其传递给 DNNRegressor
.
也有可能是初始权重太大了。 DNNRegressor
使用 tf.contrib.layers.fully_connected
层而不覆盖
weights_initializer
和 biases_initializer
。和以前一样,默认值是相当合理的,但是如果你想要它不同,你根本无法控制它。
为了检查神经网络是否至少以某种方式工作,我通常会做的是将训练集减少到几个例子并尝试过度拟合神经网络。这个实验非常快,所以我可以尝试各种学习率和其他超参数来找到一个最佳点,然后转向更大的数据集。
进一步排查问题:可视化每层中激活的分布,tensorboard中梯度或权重的分布以缩小问题范围。