【问题标题】:Shape must be rank 0 but is rank 1 for 'file_reader' (op: 'ReadFile') with input shapes: [0]形状必须为 0 级,但对于具有输入形状的“file_reader”(操作:“ReadFile”)为 1 级:[0]
【发布时间】:2018-07-12 09:14:35
【问题描述】:

我试图运行下面的代码,但它向我抛出了这个错误:“形状必须为 0 级,但对于 'file_reader'(操作:'ReadFile')的输入形状为 1 级:[0]”。我试图从我的目录中读取 jpeg 格式的图像列表,然后将它们一个接一个地分类。任何帮助将不胜感激!

代码:

class image_recognition_algorithm():

def __init__(self, file_name, model_file, label_file):
    self.model_file = model_file
    self.label_file = label_file
    self.file_name = file_name

def load_graph(self):
    graph = tf.Graph()
    graph_def = tf.GraphDef()

    with open(model_file, "rb") as f:
        graph_def.ParseFromString(f.read())
    with graph.as_default():
        tf.import_graph_def(graph_def)

    return graph

def read_tensor_from_image_file(self, file_name, input_height=299, input_width=299,
                input_mean=128, input_std=128):
    input_name = "file_reader"
    output_name = "normalized"
    file_reader = tf.read_file(file_name, input_name)
    image_reader = tf.image.decode_jpeg(file_reader, channels = 3, name='jpeg_reader')
    float_caster = tf.cast(image_reader, tf.float32)
    dims_expander = tf.expand_dims(float_caster, 0);
    resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
    normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
    sess = tf.Session()
    result = sess.run(normalized)

    return result

def load_labels(self, label_file):
    label = []
    proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
    for l in proto_as_ascii_lines:
        label.append(l.rstrip())
    return label

def main(self, file_name):
    self.model_file = "tf_files/retrained_graph.pb"
    self.label_file = "tf_files/retrained_labels.txt"
    self.input_height = 299
    self.input_width = 299
    self.input_mean = 128
    self.input_std = 128
    input_layer = "Mul"
    output_layer = "final_result"

    graph = self.load_graph()
    t = self.read_tensor_from_image_file(file_name,
                                         input_height = self.input_height,
                                         input_width = self.input_width,
                                         input_mean = self.input_mean,
                                         input_std = self.input_std)


    input_name = "import/" + input_layer
    output_name = "import/" + output_layer
    input_operation = graph.get_operation_by_name(input_name);
    output_operation = graph.get_operation_by_name(output_name);
    config = tf.ConfigProto(device_count={"CPU": 4},
                            inter_op_parallelism_threads=1,
                            intra_op_parallelism_threads=4)
    self.sess = tf.Session(graph=graph, config=config)
    start = time.time()
    results = self.sess.run(output_operation.outputs[0],
                      {input_operation.outputs[0]: t})
    end=time.time()
    results = np.squeeze(results)

    top_k = results.argsort()[-5:][::-1]
    labels = load_labels(label_file)

    print('\nEvaluation time (1-image): {:.3f}s\n'.format(end-start))

    for i in top_k:
        print(file_name, labels[i], results[i])

if __name__ == '__main__':
            model_file = "tf_files/retrained_graph.pb"
            label_file = "tf_files/retrained_labels.txt"
            list_of_imgs = []
            img_dir = "./test_images/"
            for img in os.listdir("."):
                       img = os.path.join(img_dir, img)
                       a = cv2.imread(img)
                       if img.lower().endswith(".jpg"):
                           list_of_imgs.append(a.flatten())
            file_name = np.array(list_of_imgs)
            image_recognition_algorithm_obj = 
            image_recognition_algorithm(model_file, label_file, file_name)
            image_recognition_algorithm_obj.main(file_name)

【问题讨论】:

    标签: python-3.x class tensorflow


    【解决方案1】:

    您收到此错误是因为您将一个 numpy 数组提供给 tf.read_file 函数。

    您需要为每个图像名称作为字符串调用tf.read_file
    正如它在doc for tf.read_file 中所说,输入filename: A Tensor of type string.

    示例用法:

    file_reader = tf.read_file("test.jpeg", "file_reader")

    【讨论】:

    • 谢谢!所以我基本上应该修改这部分脚本吧? list_of_imgs = [] img_dir = "./test_images/" for img in os.listdir("."): img = os.path.join(img_dir, img) a = cv2.imread(img) if img.lower() .endswith(".jpg"): list_of_imgs.append(a.flatten()) file_name = np.array(list_of_imgs)
    • @Matthew 是的。基本上你需要为单个图像调用 image_recognition_algorithm_obj.main(file_name),而不是列表或 numpy 数组。
    • 甜蜜!谢谢!
    猜你喜欢
    • 2020-10-17
    • 2019-05-10
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2018-08-12
    • 2021-11-21
    相关资源
    最近更新 更多