最近接触TensorFlow,需要训练自己的数据集,看到很多博客资料,了解到TensorFlow中自带的tfrecord文件,但是自己具体实现起来发现自己的情况与资料的一些不太一样,所以把自己遇到的问题归纳整理出来。新手一枚,水平有限,有许多问题的解决可能仅限于解决,代码并有优化,有些思路可能走了弯路,希望能跟大家交流。
1.问题1:对于多分类情况,怎么确定标签?
(1)多分类:大多资料中给出的是针对两种分类的情况,采用的是直接用class={class1 , class2}这种格式,但是对于很多类的话,依次写出类别有点麻烦,那么可以采用先定义一个列表classes = []来存储目录中所有的分类,比如对于字符识别,那么classes = {1,2,3,4...,A,B,C},然后用for index, name in enumerate(classes)将对应文件夹的名字与整数一一对应起来。
其中enumerate是python中的一个函数,目的会将index和classes中的name对应起来,比如classes = {1,2,3,A,...}那么index = {1, 2, 3, 4,..}并且与classes中的1,2,3 ,A这些对应。
为什么要这样做?因为在存入tfrecord的时候,标签一般用的是整型,当目录文件中包含A,B,或者字符串的时候要将其变为整型,我尝试过读入tfrecord的时候用tobyte格式,也就是直接用字符串的形式读入,但是会报错,也可能是我知识水平不够,没有找到正确的方法。
classes = [] for class1 in os.listdir(cwd): classes.append(class1) for index, name in enumerate(classes): class_path = cwd + name + '\\' for img_name in os.listdir(class_path): img_path = class_path + img_name # 每一个图片的地址
2.问题二:如何在读入的时候分数据集和测试集(其中测试集占50%)
(1)我采用的是在逐层访问文件夹的时候用两个字典(一对多)存入图片的标签和对应图片地址。
for class1 in os.listdir(cwd): classes.append(class1) for index, name in enumerate(classes): class_path = cwd + name +