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里进行调参的工作,希望能有所收获。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值