【深度学习】TensorFlow:输入数据处理框架

将MNIST数据集中的所有训练数据存储到TFRecord文件中:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np

#生成整数型属性  转换类型 将输入的value转换成整数型
def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
#生成字符串类型属性  将输入的value转换成字符串类型
def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

# 将数据转化为tf.train.Example格式。
def _make_example(pixels, label, image):
    image_raw = image.tostring()  #将图像转换成字符串表示 传给image_raw
    #将一个样例转换成Example Protocol Buffer  将所有信息写入这个数据结构
    example = tf.train.Example(features=tf.train.Features(feature={
        'pixels': _int64_feature(pixels),
        'label': _int64_feature(np.argmax(label)),
        'image_raw': _bytes_feature(image_raw)
    }))
    return example

# 读取mnist训练数据。
mnist = input_data.read_data_sets("D:/MNIST_data",dtype=tf.uint8, one_hot=True)
images = mnist.train.images  #训练的图片
labels = mnist.train.labels  #训练图片对应的正确答案
pixels = images.shape[1] #训练图像的分辨率
num_examples = mnist.train.num_examples

# 输出包含训练数据的TFRecord文件。
with tf.python_io.TFRecordWriter("D:/output.tfrecords") as writer:
    for index in range(num_examples):
        example = _make_example(pixels, labels[index], images[index])
        writer.write(example.SerializeToString())  #将一个Example写入文件
print("TFRecord训练文件已保存。")

利用转换好的TFRecord文件作为神经网络的输入:

import tensorflow as tf
# match_filenames_once 获取一个符合正则表达式的所有文件
files = tf.train.match_filenames_once("output.tfrecords")
#通过函数 有效的管理文件队列 不打乱队列
filename_queue = tf.train.string_input_producer(files,shuffle=False) 

#解析TFRecord文件数据
# 读取文件
reader = tf.TFRecordReader()
_,serialized_example = reader.read(filename_queue)

#解析一行读取的数据
features = tf.parse_single_example(
    serialized_example,
    features = {
        'image_raw':tf.FixedLenFeature([],tf.string),  #FixedLenFeature 属性解析方法,输出结果为tensor
        'pixels':tf.FixedLenFeature([],tf.int64),
        'label':tf.FixedLenFeature([],tf.int64),
    })

# 从原始图像数据解析出像素矩阵,并根据图像尺寸还原图像
decode_images = tf.decode_raw(features['image_raw'],tf.uint8)
# 转换图像格式
retype_images = tf.cast(decode_images,tf.float32)
images = tf.reshape(retype_images,[784])
labels = tf.cast(features['label'],tf.int32)
pixels = tf.cast(features['pixels'],tf.int32)

# 组合训练数据
# 将文件以100个为一组打包
min_after_dequeue = 10000  #出队时,队列中元素的最少个数
batch_size = 100
capacity = min_after_dequeue + 3 * batch_size #队列的最大容量
image_batch,label_batch = tf.train.shuffle_batch([images,labels],
                                                 batch_size = batch_size,
                                                 capacity = capacity,
                                                 min_after_dequeue=min_after_dequeue)

# 训练模型
# 定义前向传播
def inference(input_tensor,weights1,biases1,weights2,biases2):
    layer1 = tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1)
    return tf.matmul(layer1,weights2)+biases2

# 函数相关模型
INPUT_NODE = 784
OUTPUT_NODE = 10
LAYER1_NODE = 500
REGULARAZTION_RATE = 0.0001
TRAINING_STEPS = 5000

# 初始化变量
weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER1_NODE],stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))
weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE,OUTPUT_NODE],stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

# 前向传播结果
y = inference(image_batch,weights1,biases1,weights2,biases2)

# 计算反向传播
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=label_batch)
cross_entropy_mean = tf.reduce_mean(cross_entropy)  #交叉熵平均值

# 正则化损失函数
regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
regularaztion = regularizer(weights1) + regularizer(weights2)

# 损失函数
loss = cross_entropy_mean + regularaztion
# 优化损失函数
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

# 初始化会话,并开始训练过程
with tf.Session() as sess:
    sess.run((tf.global_variables_initializer(),tf.local_variables_initializer()))  #局部变量 全局变量
    coord = tf.train.Coordinator() #协同启动的线程
    threads = tf.train.start_queue_runners(sess=sess,coord=coord) #启动所有线程
    #循环神经网咯
    for i in range(TRAINING_STEPS):
        if i % 1000 == 0:
            print("After %d training steps,loss is %g"%(i,sess.run(loss)))
        sess.run(train_step)
    coord.request_stop()
    coord.join(threads)

训练结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值