python报错invalid argument_关于python:TensorFlow InvalidArgumentError / Value错误,代码变化很小...

博客讨论了在使用TensorFlow进行深度学习时遇到的两个错误:InvalidArgumentError和NanLossDuringTrainingError。通过示例代码,解释了错误产生的原因——将numpy和TensorFlow操作混合以及输入数值过大导致数字溢出。解决方案包括避免混合操作和调整输入数据的范围。
摘要由CSDN通过智能技术生成

代码:

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?)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值