tensorflow数据读入——TFRecord的使用基础
写在前面
试着利用tensorflow做一个辐射源识别的项目,正好可以利用这个机会学习tensorflow的使用,写给自己也写给大家,希望我们都能踏实的不断通过实战积累,并有所收获。
为什么要使用TFRecord
TFRecord是TensorFlow内定的统一标准数据格式,可以支持多线程数据读取,并且可以通过batch size和epoch参数来控制训练时单次batch的大小和样本文件迭次数,同时能更好的利用内存和方便数据的复制和移动,所以是利用TensorFlow进行大规模深度学习训练的首选。
Matlab生成*.mat数据(matlab)
数据集简介:1030个500 * 2的样本(即每个样本是一个500 * 2的矩阵)。分5类,每类206个样本。
话不多说,先贴代码。
clc;close all;clear all;
A = xlsread('测试用数据集(5类)-均衡20181105 -206个.xlsx');
A = single(A); %double--->single single处理起来会较快
A1 = zeros(size(A,1)/5,size(A,2)); %取前五分之一
Ai = zeros(206 ,500 ,2); %单个数据500*2 共206个样本
Ai = single(Ai)
cc=randperm(206); %随机取1-206的数 用来随机分配train和test的index
k=0;
for i =cc(1:206) %随机index
Ai(i,:,1) = A2(i,1:2:end);
Ai(i,:,2) = A2(i,2:2:end);
a = num2str(i);
temp = Ai(i,:,:);
data = squeeze(temp); %1*500*2 ---> 500*2 去掉单独位
if k<50 %取前50个随机数为index的文件 输出到test文件夹内
save(strcat('D:\project\matlab data preprocessing\test\',a),'data') ;
else %剩下的输出到train
save(strcat('D:\project\matlab data preprocessing\train\',a),'data') ;
end
k =k +1;
end
生成效果:
test集:
train集:
分5类存储以后,整理成train和test文件夹
tensorflow环境下使用writer读入.mat数据并创建TFRecord文件
cwd = 'D:/project/matlab data preprocessing/test/'
#cwd = 'D:/project/matlab data preprocessing/train/' #分别对train和test文件夹制作TFRecord文件
classes = {'0', '1','2','3','4'} #
#TFfile=cwd+"mat_train.tfrecords"
TFfile=cwd+"mat_test.tfrecords"
writer = tf.python_io.TFRecordWriter(TFfile) # to be generated TFrecord file
for index, name in enumerate(classes): #遍历类别名
class_path = cwd + name + '/'
for mat_name in os.listdir(class_path):#遍历文件夹内.mat文件名
mat_file = class_path + mat_name # address of every matfile
y = scipy.io.loadmat(mat_file)
# a=y['data'] #read data
a = y['data'] #readdata 读取matlab里输出矩阵的名称(matlab里的名字!!)
example = tf.train.Example(#存2个特征 分别命名 label 和 data
features=tf.train.Features(
feature={ "label": tf.train.Feature(float_list=tf.train.FloatList(value=[index])),
'data': tf.train.Feature(bytes_list=tf.train.BytesList(value=[a.tostring()]))
})) # generate an example
writer.write(example.SerializeToString()) # write example to TFrecord file
writer.close()
顺利分别生成tfrecords!
tensorflow再读入TFrecord文件
filename_queue = tf.train.string_input_producer([TFfile]) #read into stream
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(serialized_example,
features={
'label': tf.FixedLenFeature([], tf.float32),
'mat_data' : tf.FixedLenFeature([], tf.string),
})
mat_data, label = features['mat_data'], features['label']
最后读入部分还有待完善。
如自己动手,可参考https://blog.csdn.net/BBZZ2/article/details/60581006
问题回顾
花了半天时间解决了调试中出现的问题:
1、不懂为何自己生成的tfrecord文件总是比数据存储空间大一倍,最后发现原来是存储时自己用了double类型(matlab)。改用(single)类型就对了。
2、读入部分
a = y['data']
之前怎么都读不进去数据,最后发现原来是应该在中括号内写入的是matlab内输出.mat的矩阵名称。我第一遍输出时用的是temp1输出的,所以出现了读不进数据的问题。
要么matlab里输出的矩阵名称改成data,要么py里改成‘temp1’。
END
接下来可能会在CNN里进行调参的工作,希望能有所收获。