本人在2016年7月份刚开始学习神经网络,原来是VS写C++,现在什么都换了,VS换成eclipse,C++换成Python,Windows换成Ubuntu,虽说Python比C++简单,可是对于一个写惯了的人来说,刚开始肯定是Python要难过C++。研一下半年那会刚搞C++,也把C++常见错误给罗列出来,方便日后自己知道错误方向,慢慢写得多了,错误基本上一看就知道是哪里蹦错了,到后期也就没有再继续往下写,不过出现的Bug真的是学习语言的最好老师。现在开始学Python调用tensorflow库进行深度学习,也决定将错误规整一下,而且错误解决的程度比C++难多了,因为现在用tensorflow的人还没有用C++的人那么多,时间那么久远。现在只能靠自己慢慢摸索前进。本博客会不断更新,毕竟我博士期间就打算使用神经网络干活了。现在的实习也是要用到神经网络。
不多说了,说多了都是泪,现在开始解决一个个bug,解决过程中也会不断增加我的成就感,fighting。。。
1、SyntaxError: Non-ASCII character ‘\xe5’ in file
弹出的错误提示:
这个错误是初学者常犯的错误,在写代码时一定要注意:
问题原因:
Python默认是以ASCII作为编码方式的,如果在自己的Python源码中(即使是注释部分)包含了中文(或者其他非英语系的语言),此时即使你把自己编写的Python源文件以UTF-8格式保存了,但实际上,这依然是不行的
解决方法:
源代码文件第一行添加:#coding:utf-8,这样就可以避免了,
也可以改为,在第一行增加:#-- coding: UTF-8 --
注:此语句一定要添加在源代码的第一行。
几个概念要先搞清楚:
•默认的python文件是采用ascii编码的,在头部加入# -- coding: utf-8 -- 则指定文件的编码格式是utf-8,那么就是说文件内你可以用中文或其他的文字了。
•cn = u”中文”,这个前缀u代表“中文”是采用unicode编码,也就是cn并不是string而是一个unicode。
•当你用print输出的时候会自动根据本地的语言环境转换成string。
2、IndentationError: expected an indented block
弹出的错误提示:
解决方法:
Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分别的。
在编译时会出现这样的错IndentationError:expected an indented block说明此处需要缩进,你只要在出现错误的那一行,按空格或Tab(但不能混用)键缩进就行。
往往有的人会疑问:我根本就没缩进怎么还是错,不对,该缩进的地方就要缩进,不缩进反而会出错,,比如:
if xxxxxx:
(空格)xxxxx
或者
def xxxxxx:
(空格)xxxxx
还有
for xxxxxx:
(空格)xxxxx
一句话 有冒号的下一行往往要缩进,该缩进就缩进
3、SyntaxError: ‘return’ outside function
原因:缩进错误
解决方法:语句调整缩进
4、类型错误
TypeError: Input ‘value’ of ‘Assign’ Op has type float64 that does not match type float32 of argument ‘ref’.*
这是弹出的问题界面,从问题界面中我们可以看到具体出错是在哪一行出错的。如图中绿色框中便是代码出错的语句。根据提示的错误是传入数据的类型不对,通过调整数据类型来解决问题。
5、
IOError: broken data stream when reading image file
今天运行代码时出现一个奇怪的错误,如果不是这个错误,估计以后可能要想半天,因为今天出错误的代码就几行,来来回回也是试了改了好多次才突发奇想想到的问题的关键。
对于这个错误给出的提示我们很容易知道这是在读取图像时出现的错误,但是这个读取图像的程序我刚刚运行过是没有问题的。如下图所示代码运行时是没有任何问题存在的。
<span style="font-size:12px;">#显示图像尺寸与通道
import matplotlib.imageas mpimg
#1、读入图像
filename ="MarshOrchid.jpg"
image = mpimg.imread(filename)
</span>
运行这个没有问题,为什么转换到了tensorflow下就出现问题呢,下面是问题代码:
<span style="font-size:12px;">import tensorflowas tf
import matplotlib.imageas mpimg
import matplotlib.pyplotas plt
#加载图像
filename ="MarshOrchid.jpg"
image = mpimg.imread(filename)
#创建tensorflow变量
x = tf.Variable(image,name='x')
model = tf.initialize_all_variables()
</span>
来来回回害怕自己拼写错误复制粘贴好几次,字符拼了一遍又一遍,到网上查说是jpg的包未安装,可是这个明显在我这里是不成立的。因为刚刚已经加载成功了。毕竟现在tensorflow的错误解决方案不多,只好自己动手了。找来找去,发现当导入tensorflow库时imread就会出现错误,只要把tensorflow去掉是不会提示有错误的。OK,现在错误定位出来了,是tensorflow的问题。可是我们不能因此把tensorflow给删掉呀,删了不就是本末倒置了嘛,我们现在就想用tensorflow来解决问题的,去掉就啥都没有了。
言归正传,找到是import tensorflow as tf 这句话导致的错误。可又不能去掉,工科生的本能就是——不断的尝试解决方案。所以当时就抱着试试的态度将import tensorflow as tf 的位置由最开始的位置,调到了后面的位置,如下所示:
<span style="font-size:12px;">import matplotlib.imageas mpimg
import matplotlib.pyplotas plt
import tensorflowas tf
</span>
调完之后就不会再报那个错误了。可是这我就好奇了,为了解释我的好奇,我将我的代码全部粘出,有懂的还请指教指教。
<span style="font-size:12px;">import matplotlib.imageas mpimg
import matplotlib.pyplotas plt
import tensorflowas tf
#加载图像
filename ="MarshOrchid.jpg"
image = mpimg.imread(filename)
#创建tensorflow变量
x = tf.Variable(image,name='x')
model = tf.initialize_all_variables()
with tf.Session()as session:
x = tf.transpose(x, perm=[1,0,2])
session.run(model)
result = session.run(x)
plt.imshow(image)
plt.show()
</span>
按照刚刚那个错误的解决逻辑,是按照运行属性来排列import导入库的,那该程序的运行顺序为:image库--->tensorflow库---->pyplot库,那我相应的调整其import,将tensorflow放在了pyplot前面,竟然会报错误,放在后面就没有关系了。我现在唯一能让自己想通的就是image与pyplot属于一家,均为matplotlib。此问题待大牛或者我再深入了解之后再做深入回答。
在个人看来,import其实就是相当于C 语言中的头文件,受到C的影响,在写Python时直观的也认为import导入的库是没有先后顺序的。这就是这个问题出现的根本。在Python中,就目前看来,其import导入的库是有先后顺序的。
6、
python报错<type 'exceptions.TypeError'>: 'NoneType' object is not callable
这个错误分为两种情况,一种情况是运行时出现这个错误,另一种情况是运行时不弹出错误,但是在调试代码时出现错误。下面根据两方面来探讨解决方法。
无论是调试还是运行,如果单从错误看来是你使用的对象没有定义,你需要检查程序中函数是否写正确。这一点是必须要做的。