代码:
import numpy as np
import tensorflow as tf
import pandas as pd
from sklearn.model_selection import train_test_split
x_data = np.linspace(0, 1000000, 1000)
y_true = np.sin(x_data)
y_true += np.random.randn(len(x_data))
feature_columns = [tf.feature_column.numeric_column('x', shape=[1])]
estimator = tf.estimator.DNNRegressor(feature_columns=feature_columns, hidden_units=[10,10,10], optimizer=lambda:
tf.train.AdamOptimizer(
learning_rate=0.1
))
X_train, X_test, y_train, y_test = train_test_split(x_data, y_true, test_size=0.3)
input_function = tf.estimator.inputs.numpy_input_fn({'x': X_train},y_train,
batch_size=8, num_epochs=None,
shuffle=True)
train_input_function = tf.estimator.inputs.numpy_input_fn({'x': X_train},y_train,
batch_size=8, num_epochs=1000,
shuffle=False)
test_input_function = tf.estimator.inputs.numpy_input_fn({'x': X_test},y_test,
batch_size=8, num_epochs=1000,
shuffle=False)
estimator.train(input_fn=input_function, steps=1000)
train_metrics = estimator.evaluate(input_fn=train_input_function, steps=1000)
test_metrics = estimator.evaluate(input_fn=test_input_function, steps=1000)
print('TRAINING DATA METRICS')
print(train_metrics)
print()
print('TEST DATA METRICS')
print(test_metrics)
print()
效果很好。
但是,如果我将y_true = np.sin(x_data)行更改为y_true=tf.square(x_data),我会收到错误:
Traceback (most recent call last):
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 1576, in _create_c_op
c_op = c_api.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape must be rank 1 but is rank 2 for 'strided_slice' (op: 'StridedSlice') with input shapes: [1000], [1,700], [1,700], [1].
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File"C:/Users/Admin/Documents/PycharmProjects/TF_API_2/api.py", line 21, in
X_train, X_test, y_train, y_test = train_test_split(x_data, y_true, test_size=0.3)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\model_selection_split.py", line 2059, in train_test_split
safe_indexing(a, test)) for a in arrays))
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\model_selection_split.py", line 2059, in
safe_indexing(a, test)) for a in arrays))
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\utils__init__.py", line 162, in safe_indexing
return X[indices]
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\ops\array_ops.py", line 524, in _slice_helper
name=name)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\ops\array_ops.py", line 690, in strided_slice
shrink_axis_mask=shrink_axis_mask)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 10187, in strided_slice
name=name)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper
op_def=op_def)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\util\deprecation.py", line 454, in new_func
return func(*args, **kwargs)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 3155, in create_op
op_def=op_def)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 1731, in init
control_input_ops)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 1579, in _create_c_op
raise ValueError(str(e))
ValueError: Shape must be rank 1 but is rank 2 for 'strided_slice' (op: 'StridedSlice') with input shapes: [1000], [1,700], [1,700], [1].
如果我使用** 2而不是tf.square,代码也无法编译,错误:
错误:tensorflow:模型与损失= NaN分歧。
Traceback(最近一次调用最后一次):
File"C:/Users/Admin/Documents/PycharmProjects/TF_API_2/api.py", line 35, in
estimator.train(input_fn=input_function, steps=1000)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 376, in train
loss = self._train_model(input_fn, hooks, saving_listeners)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 1145, in _train_model
return self._train_model_default(input_fn, hooks, saving_listeners)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 1173, in _train_model_default
saving_listeners)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 1451, in _train_with_estimator_spec
_, loss = mon_sess.run([estimator_spec.train_op, estimator_spec.loss])
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\monitored_session.py", line 583, in run
run_metadata=run_metadata)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\monitored_session.py", line 1059, in run
run_metadata=run_metadata)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\monitored_session.py", line 1150, in run
raise six.reraise(*original_exc_info)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\six.py", line 693, in reraise
raise value
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\monitored_session.py", line 1135, in run
return self._sess.run(*args, **kwargs)
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\monitored_session.py", line 1215, in run
run_metadata=run_metadata))
File"C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\training\basic_session_run_hooks.py", line 635, in after_run
raise NanLossDuringTrainingError
tensorflow.python.training.basic_session_run_hooks.NanLossDuringTrainingError: NaN loss during training.
这一行[y_true = tf.square(x_data)]有什么问题?
不要混合numpy和tensorflow操作。我建议y_true=np.square(x_data)。
好。但仍然得到相同的"tensorflow.python.training.basic_session_run_hooks.NanLossDuringTrainingError:培训期间NaN损失。"错误。
看起来你遇到了数字溢出。你的数字太大了。如果您正在尝试教网络如何对数字进行平方,则可能需要在较小的数字上进行尝试。
哦。对。我将x_data更改为x_data = np.linspace(0,1000,1000)并且不会发生此问题。请将您的上一条评论添加为答案,这样我就可以将其标记为解决方案。
@coldspeed请告诉我,为什么程序输出大损失:培训数据指标{'average_loss':13975338000.0,'label / mean':349618.28,'loss':111802700000.0,'prediction / mean':359011.06,'global_step':1000测试数据度量{'average_loss':12280204000.0,'label / mean':293979.97,'loss':98241634000.0,'prediction / mean':325393.22,'global_step':1000}
我没有运行你的代码,所以我不给我几分钟。
好。没问题 :)
所以,我认为这只是DNNRegressor计算损失的方式(所有例子的损失总和),我认为因为值很大,你会看到很大的损失值。准确度如何?它应该仍然是体面的。
我预测了一些值,并且所有x_values的程序预测相同的y,如0.9783435
@coldspeed新行:new_data = np.linspace(0,1000,10)input_function_predict = tf.estimator.inputs.numpy_input_fn({'x':new_data},shuffle = False)print(list(estimator.predict(input_fn = input_function_predict) )))给出输出:[{'predictions':array([0.9783435],dtype = float32)},{'predictions':array([0.9783435],dtype = float32)},{'predictions':array([ 0.9783435],dtype = float32)},...
从简单开始,尝试使用数字1-10?
同样的问题
不太确定问题是什么。也许打开一个新问题,其他人会搞清楚吗?
@coldspeed好的。我会。还是,非常感谢你的帮助!
这里有两个不同的问题:
#1,不要将numpy和tensorflow操作混合在一起。 除非您在急切的执行模式下评估图表,否则它们几乎永远不会在一起。
#2,当你的网络在几次迭代后产生NaN时,这通常是一个好的迹象,你正在遇到数字溢出/下溢。 在这种情况下,罪魁祸首是x_data,其输入太大。 要么标准化它(0-1)还是减少生成数据的范围(np.random.randint?)。