调试错误:ValueError: Protocol message Feature has no "feature" field ——将MNIST数据转换TFRecord程序报错经历

在学习《Tensorflow:实战Google深度学习框架》,分享一下自己的出错经历。

一、TFRecord 文件中的数据都是通过 tf.train.Example Protocol Buffer 的格式存储的。

在7.1.2 样例程序,如下:

# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('D:\\Program Files\\Anaconda3\\envs\\tensorflow\\mnist\\input_data\\',one_hot=True)


def _int64_feature(value):       # 生成整数型的属性
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))


def _bytes_feature(value):       # 生成字符串型的属性
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


images = mnist.train.images
labels = mnist.train.labels   # 训练数据所对应的正确答案,可作为一个属性保存在TFRecord中
pixels = images.shape[1]
num_examples_train = mnist.train.num_examples  # 训练数据的图像分辨率,可以作为Example中的一个属性


filename = "D:/Python/TF/AllDataProcess/data/output.tfrecords"  # 输出TFRecord文件的地址
writer = tf.python_io.TFRecordWriter(filename) # 通过writer来写TFRecord文件
for index in range(num_examples_train):
    image_raw = images[index].tostring() # 将图像矩阵转化为一个字符串
    example = tf.train.Example(
        features=tf.train.Features(
            feature={
                'pixels': _int64_feature(pixels),
                'label': _int64_feature(np.argmax(labels[index])),
                'image_raw': _bytes_feature(image_raw)
            }
        )
    )
    writer.write(example.SerializeToString())  # 将一个Example写入TFRecord文件
writer.close()

很经典的代码,没什么问题。

      可是,如果你把

example = tf.train.Example(
    features=tf.train.Features(

这一句后面的Features 的 s 漏掉了的话,就会报这样的错误:

调试错误:ValueError: Protocol message Feature has no

注:我的编译器是spyder。

二、Tips

1、学习一样新内容,常常用到博客。当你复制一篇经典代码,却调试出错时,不妨找两个类似的博客运行一下试试。有些小错还是挺难注意到的。

2、发布博客的兄弟们,对自己的博客还是认真运行过后再上传吧,咱也不说啥大道理,别让后来的小白们泪奔的去调试错误!



你可能感兴趣的:(软件知识)