【发布时间】:2017-11-03 14:05:45
【问题描述】:
我刚开始学习python。当我执行下面的代码时,我得到一个错误。它告诉我们 回溯(最近一次通话最后): 文件“predict_1.py”,第 87 行,在 主要(sys.argv [1]) IndexError: 列表索引超出范围
非常感谢任何帮助。感谢您的阅读!
#import modules
import sys
import tensorflow as tf
from PIL import Image,ImageFilter
def predictint(imvalue):
"""
This function returns the predicted integer.
The imput is the pixel values from the imageprepare() function.
"""
# Define the model (same as when creating the model file)
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
"""
Load the model.ckpt file
file is stored in the same directory as this python script is started
Use the model to predict the integer. Integer is returend as list.
Based on the documentatoin at
https://www.tensorflow.org/versions/master/how_tos/variables/index.html
"""
with tf.Session() as sess:
sess.run(init_op)
new_saver = tf.train.import_meta_graph('model.ckpt.meta')
new_saver.restore(sess, "model.ckpt")
#print ("Model restored.")
prediction=tf.argmax(y,1)
return prediction.eval(feed_dict={x: [imvalue]}, session=sess)
def imageprepare(argv):
"""
This function returns the pixel values.
The imput is a png file location.
"""
im = Image.open(argv).convert('L')
width = float(im.size[0])
height = float(im.size[1])
newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixels
if width > height: #check which dimension is bigger
#Width is bigger. Width becomes 20 pixels.
nheight = int(round((20.0/width*height),0)) #resize height according to ratio width
if (nheigth == 0): #rare case but minimum is 1 pixel
nheigth = 1
# resize and sharpen
img = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozition
newImage.paste(img, (4, wtop)) #paste resized image on white canvas
else:
#Height is bigger. Heigth becomes 20 pixels.
nwidth = int(round((20.0/height*width),0)) #resize width according to ratio height
if (nwidth == 0): #rare case but minimum is 1 pixel
nwidth = 1
# resize and sharpen
img = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozition
newImage.paste(img, (wleft, 4)) #paste resized image on white canvas
#newImage.save("sample.png")
tv = list(newImage.getdata()) #get pixel values
#normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
tva = [ (255-x)*1.0/255.0 for x in tv]
return tva
#print(tva)
def main(argv):
"""
Main function.
"""
imvalue = imageprepare(argv)
predint = predictint(imvalue)
print (predint[0]) #first value in list
if __name__ == "__main__":
main(sys.argv[1])
【问题讨论】:
-
不,this 代码只会给出缩进错误。发布 Python 代码时,您需要准确地复制缩进。严重缩进的 Python 代码是无稽之谈。
-
请阅读How to Ask 并尝试提供minimal reproducible example - 目前您的代码存在严重的缩进问题(很可能是由于格式问题)。
-
为什么我们需要查看所有代码?其中大部分与此错误无关。你是如何运行脚本的?您是否在命令行中提供了正确的
imageprepare参数字符串? -
您的错误清楚地表明您尝试访问第二个命令行参数(
sys.argv[1]),这显然不存在,因此抛出IndexError。
标签: python