一、背景
今天基于TensorFlow跑DNN,报了一个异常InvalidArgumentError (see above for traceback): Unquoted fields cannot have quotes/CRLFs inside”,在decode csv文件的时候报上面这个错,中文解释是“未加引号的字段中不能包含引号/ CRLF”,异常如下:
二、解决
1.处理引号
本实验中DNN的训练集是将各个特征通过’\t’进行拼接,通过异常显示应该是字符串中有引号,导致在decode的时候无法区分拼接的特征,使得抛出了异常,google了一波,找到了答案,在tf.decode_csv()函数中,有个参数是use_quote_delim 参数,看原始代码的解释为:
se_quote_delim: An optional
bool
. Defaults toTrue
.
If false, treats double quotation marks as regular
characters inside of the string fields (ignoring RFC 4180, Section 2,
Bullet 5).
此参数默认True,会把双引号当成引用,在使用tf.decode_csv读取文件的时候如果某一行有双引号会报错。
所以需要将其设置为False,这样就会把双引号当做为一个普通的字符串变量,在这里读取不会报错,如下:
code如下:
features_tuple = tf.decode_csv(raw_features, use_quote_delim=False,record_defaults=features_default,field_delim="\t")
总结:添加use_quote_delim=False或者数据中去除",一般情况这样处理了就不会再报错了,但use_quote_delim=False只能处理双引号"的情况,无法处理回车换行的问题。
2.处理回车换行
有的时候,在数据清洗阶段并未做的很好,在特征中存在了一些回车(CR, ASCII 13, “\r”) 换行(LF, ASCII 10, “\n”)时,也会抛此异常。
小编翻看了tensorflow这段的源码:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/decode_csv_op.cc,如下:
存在回车换行符也会抛异常。
解决:将训练集中的回车换行全部替换成空串,重新训练
三、总结
经过以上两步,“Unquoted fields cannot have quotes/CRLFs inside”此异常彻底解决了。
经验总结:当使用一些开源框架时,出现了异常,莫慌,先google一波,如果发现google也没办法解决你的问题,直接看对应的源码,分析一下源码,找到是什么原因?什么条件导致这个异常产生,既能快速解决问题,也让你的技术得到了提升。