我刚开始学习python。当我执行下面的代码时,我收到一个错误。它告诉我们 Traceback(最近一次调用最后一次): 文件" predict_1.py",第87行,in 主(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])
答案 0 :(得分:0)
您应该为脚本提供一个参数,即将其称为
predict_1.py path_to_your_file
答案 1 :(得分:0)
首先,在按索引访问列表中的项之前,您始终必须检查列表的边界或捕获异常并处理“超出范围”的情况(在案例中为IndexError
)。
其次,更好的方法是开始使用argparse
模块。还有更简单的getopt
模块,您可以在Web,Python标准文档等中找到它们的许多示例。它们允许您的脚本具有更方便的命令行参数,例如在Unix工具中(可选,位置,使用默认值等,等等。)