【发布时间】:2017-12-18 05:03:07
【问题描述】:
我有一个代码(如下),它仅在从 CMD 执行时运行。我需要修改它,它必须在 IDE 控制台 (Eclipse) 中运行。
当我尝试在 Eclipse 中执行此操作时,出现此错误:
Traceback (most recent call last):
File "C:\Users\User\workspace\TF\TF\predict_2.py", line 138, in <module>
main(sys.argv[1])
IndexError: list index out of range
需要做什么?
我正在阅读有关__main__ 和sys.argv 的内容,但我不太了解...
"""Predict a handwritten integer (MNIST expert).
Script requires
1) saved model (model2.ckpt file) in the same location as the script is run from.
(requried a model created in the MNIST expert tutorial)
2) one argument (png file location of a handwritten integer)
Documentation at:
http://niektemme.com/ @@to do
"""
#import modules
import sys
import tensorflow as tf
from PIL import Image, ImageFilter
import os
from datetime import datetime
def predictint(imvalue):
"""
This function returns the predicted integer.
The input 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]))
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x, [-1,28,28,1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
"""
Load the model2.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)
saver.restore(sess, "model2.ckpt")
#print ("Model restored.")
prediction=tf.argmax(y_conv,1)
return prediction.eval(feed_dict={x: [imvalue],keep_prob: 1.0}, session=sess)
def imageprepare(argv):
"""
This function returns the pixel values.
The input 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 (nheight == 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])
【问题讨论】:
-
您可能没有传递参数。如果没有你给出你用来产生错误的命令,就很难说出你做错了什么。您要做什么也不是很清楚。您的意思是如何从 IDE 终端运行此代码?或者你如何把这段代码变成一个独立的脚本?请编辑更多信息。
-
感谢您的回答。我要做的是从 IDE 终端执行此代码,而不是从 CMD 执行。我收到的错误就在上面。
-
我可以看到错误,但看不到您为得到错误而输入的内容。请使用完整信息编辑您的问题。请参阅How to Ask 了解如何提出问题以获得最佳帮助。
-
啊,所以你不是指IDE终端。您只是指从 IDE 运行脚本。这是因为脚本希望您将参数与图像文件一起传递。只需删除参数要求并在代码中传递图像
-
尝试将路径字符串传递给图像,而不是底部的
sys.argv[1]。