模型接口的建立

模型接口建立

模型接口的建立

我们将模型接口都放在cifar_omdel.py文件当中,设计了四个函数,input()作为从cifar_data文件中数据的获取,inference()作为神经网络模型的建立,total_loss()计算模型的损失,train()来通过梯度下降训练减少损失

input代码

def input():
    """
    获取输入数据
    :return: image,label
    """

    # 实例化
    cfr = cifar_data.CifarRead()

    # 生成张量
    image_batch, lab_batch = cfr.read_tfrecords()

    # 将目标值转换为one-hot编码格式
    label = tf.one_hot(label_batch, depth=10, on_value=1.0)

    return image_batch, label, label_batch

inference代码

在这里使用的卷积神经网络模型与前面一致,需要修改图像的通道数以及经过两次卷积池化变换后的图像大小。

def inference(image_batch):
    """
    得到模型的输出
    :return: 预测概率输出以及占位符
    """
    # 1、数据占位符建立
    with tf.variable_scope("data"):
        # 样本标签值
        # y_label = tf.placeholder(tf.float32, [None, 10])

        # 样本特征值
        # x = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH * IMAGE_DEPTH])

        # 改变形状,以提供给卷积层使用
        x_image = tf.reshape(image_batch, [-1, 32, 32, 3])

    # 2、卷积池化第一层
    with tf.variable_scope("conv1"):
        # 构建权重, 5*5, 3个输入通道,32个输出通道
        w_conv1 = weight_variable([5, 5, 3, 32])

        # 构建偏置, 个数位输出通道数
        b_conv1 = bias_variable([32])

        # 进行卷积,激活,指定滑动窗口,填充类型
        y_relu1 = tf.nn.relu(tf.nn.conv2d(x_image, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)

        y_conv1 = tf.nn.max_pool(y_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME‘)

    # 3、卷积池化第二层
    with tf.variable_scope("conv_pool2"):
        # 构建权重, 5*5, 一个输入通道,32个输出通道
        w_conv2 = weight_variable([5, 5, 32, 64])

        # 构建偏置, 个数位输出通道数
        b_conv2 = bias_variable([64])

        # 进行卷积,激活,指定滑动窗口,填充类型
        y_relu2 = tf.nn.relu(tf.nn.conv2d(y_conv1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)

        y_conv2 = tf.nn.max_pool(y_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME‘)

    # 4、全连接第一层
    with tf.variable_scope("FC1"):
        # 构建权重,[7*7*64, 1024],根据前面的卷积池化后一步步计算的大小变换是32->16->8
        w_fc1 = weight_variable([8 * 8 * 64, 1024])

        # 构建偏置,个数位第一次全连接层输出个数
        b_fc1 = bias_variable([1024])

        y_reshape = tf.reshape(y_conv2, [-1, 8 * 8 * 64])

        # 全连接结果激活
        y_fc1 = tf.nn.relu(tf.matmul(y_reshape, w_fc1) + b_fc1)

    # 5、全连接第二层
    with tf.variable_scope("FC2"):

        # droupout层
        droup = tf.nn.dropout(y_fc1, 1.0)

        # 构建权重,[1024, 10]
        w_fc2 = weight_variable([1024, 10])

        # 构建偏置 [10]
        b_fc2 = bias_variable([10])

        # 最后的全连接层
        y_logit = tf.matmul(droup, w_fc2) + b_fc2

    return y_logit

total_loss代码

def total_loss(y_label, y_logit):
    """
    计算训练损失
    :param y_label: 目标值
    :param y_logit: 计算值
    :return: 损失
    """
    with tf.variable_scope("loss"):

        # softmax回归,以及计算交叉损失熵
        cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_label, logits=y_logit)

        # 计算损失平均值
        loss = tf.reduce_mean(cross_entropy)

    return loss

train代码

def train(loss, y_label, y_logit, global_step):
    """
    训练数据得出准确率
    :param loss: 损失大小
    :return:
    """
    with tf.variable_scope("train"):
        # 让学习率根据步伐,自动变换学习率,指定了每10步衰减基数为0.99,0.001为初始的学习率
        lr = tf.train.exponential_decay(0.001,
                                        global_step,
                                        10,
                                        0.99,
                                        staircase=True)

        # 优化器
        train_op = tf.train.GradientDescentOptimizer(lr).minimize(loss, global_step=global_step)

        # 计算准确率
        equal_list = tf.equal(tf.argmax(y_logit, 1), tf.argmax(y_label, 1))

        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

    return train_op, accuracy

完整代码

import tensorflow as tf
import os
import cifar_data
#
#
from tensorflow.examples.tutorials.mnist import input_data

IMAGE_HEIGHT = 32
IMAGE_WIDTH = 32
IMAGE_DEPTH = 3

# 按照指定形状构建权重变量
def weight_variable(shape):
    init = tf.truncated_normal(shape=shape, mean=0.0, stddev=1.0, dtype=tf.float32)
    weight = tf.Variable(init)
    return weight

# 按照制定形状构建偏置变量
def bias_variable(shape):
    bias = tf.constant([1.0], shape=shape)
    return tf.Variable(bias)

def inference(image_batch):
    """
    得到模型的输出
    :return: 预测概率输出以及占位符
    """
    # 1、数据占位符建立
    with tf.variable_scope("data"):
        # 样本标签值
        # y_label = tf.placeholder(tf.float32, [None, 10])

        # 样本特征值
        # x = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH * IMAGE_DEPTH])

        # 改变形状,以提供给卷积层使用
        x_image = tf.reshape(image_batch, [-1, 32, 32, 3])

    # 2、卷积池化第一层
    with tf.variable_scope("conv1"):
        # 构建权重, 5*5, 3个输入通道,32个输出通道
        w_conv1 = weight_variable([5, 5, 3, 32])

        # 构建偏置, 个数位输出通道数
        b_conv1 = bias_variable([32])

        # 进行卷积,激活,指定滑动窗口,填充类型
        y_relu1 = tf.nn.relu(tf.nn.conv2d(x_image, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)

        y_conv1 = tf.nn.max_pool(y_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME‘)

    # 3、卷积池化第二层
    with tf.variable_scope("conv_pool2"):
        # 构建权重, 5*5, 一个输入通道,32个输出通道
        w_conv2 = weight_variable([5, 5, 32, 64])

        # 构建偏置, 个数位输出通道数
        b_conv2 = bias_variable([64])

        # 进行卷积,激活,指定滑动窗口,填充类型
        y_relu2 = tf.nn.relu(tf.nn.conv2d(y_conv1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)

        y_conv2 = tf.nn.max_pool(y_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=‘SAME‘)

    # 4、全连接第一层
    with tf.variable_scope("FC1"):
        # 构建权重,[7*7*64, 1024],根据前面的卷积池化后一步步计算的大小变换是32->16->8
        w_fc1 = weight_variable([8 * 8 * 64, 1024])

        # 构建偏置,个数位第一次全连接层输出个数
        b_fc1 = bias_variable([1024])

        y_reshape = tf.reshape(y_conv2, [-1, 8 * 8 * 64])

        # 全连接结果激活
        y_fc1 = tf.nn.relu(tf.matmul(y_reshape, w_fc1) + b_fc1)

    # 5、全连接第二层
    with tf.variable_scope("FC2"):

        # droupout层
        droup = tf.nn.dropout(y_fc1, 1.0)

        # 构建权重,[1024, 10]
        w_fc2 = weight_variable([1024, 10])

        # 构建偏置 [10]
        b_fc2 = bias_variable([10])

        # 最后的全连接层
        y_logit = tf.matmul(droup, w_fc2) + b_fc2

    return y_logit

def total_loss(y_label, y_logit):
    """
    计算训练损失
    :param y_label: 目标值
    :param y_logit: 计算值
    :return: 损失
    """
    with tf.variable_scope("loss"):
        # 将y_label转换为one-hot编码形式
        # y_onehot = tf.one_hot(y_label, depth=10, on_value=1.0)

        # softmax回归,以及计算交叉损失熵
        cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_label, logits=y_logit)

        # 计算损失平均值
        loss = tf.reduce_mean(cross_entropy)

    return loss

def train(loss, y_label, y_logit, global_step):
    """
    训练数据得出准确率
    :param loss: 损失大小
    :return:
    """
    with tf.variable_scope("train"):
        # 让学习率根据步伐,自动变换学习率,指定了每10步衰减基数为0.99,0.001为初始的学习率
        lr = tf.train.exponential_decay(0.001,
                                        global_step,
                                        10,
                                        0.99,
                                        staircase=True)

        # 优化器
        train_op = tf.train.GradientDescentOptimizer(lr).minimize(loss, global_step=global_step)

        # 计算准确率
        equal_list = tf.equal(tf.argmax(y_logit, 1), tf.argmax(y_label, 1))

        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

    return train_op, accuracy

def input():
    """
    获取输入数据
    :return: image,label
    """

    # 实例化
    cfr = cifar_data.CifarRead()

    # 生成张量
    image_batch, lab_batch = cfr.read_tfrecords()

    # 将目标值转换为one-hot编码格式
    label = tf.one_hot(label_batch, depth=10, on_value=1.0)

    return image_batch, label, label_batch

 

原文地址:https://www.cnblogs.com/alexzhang92/p/10070151.html

时间: 2024-08-01 13:33:50

模型接口的建立的相关文章

数学建模学习笔记(第五章:6个动态模型-微分方程的建立与分析)

第五章:动态模型(微分方程建模) ·  预报与决策类型 ·  描述对象特征随时间或空间的演变过程: ·  分析对象特征的变化规律: ·  预报对象特征的未来特征: ·  研究控制对象特征的手段等. 这类题,要求的是一种趋势,描述一种变化过程,也可以称为预测.(属于动态) 1.    传染病模型 a)      问题描述:描述产染病的传播过程:分析受感染人数的变化规律:预报传染病高潮到来的时刻:预防传染病蔓延的手段:按照传播过程的一般规律,用机理分析方法建立模型:之后使用测试分析,确定最好的模型.

运维管理中IT故障定位、预警与智能恢复模型建立和应用实践解密

运维管理中IT故障定位.预警与智能恢复模型建立和应用实践解密各位大伽先不要说我理的对不对,我们来说用网管软件与IT运维管理系统来做IT的监测管理,先来看下面以SITEVIEW  ITOSS为例的一张图,图最能说明模型的意图:  我们可以从左向右,从上向下来看一下,一开始是需要采集,也即监测源端,监测源包括比如关键的服务器.网络设备.网络.日志和核心的业务应用系统,IT的环境.数据中心.机房环境等等.监测的参数就看如图SITEVIEW ITOSS一体化平台包括的五大模块功能中需要的参数状态数据,这

图像配准建立仿射变换模型并用RANSAC算法评估

当初选方向时就因为从小几何就不好.缺乏空间想像能力才没有选择摄影测量方向而是选择了GIS.昨天同学找我帮他做图像匹配,这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人.于是乎就看着他给的一章节内容开始写程序了,今天总算给他完成了.做的比较简单,中间也遇到了不少问题,尤其是计算量大的问题,由于老师给的数据是粗配准过的数据, RANSAC算法评估时就简化了下. 理论内容: 第5章 图像配准建立几何变换模型 特征点建立匹配关系之后,下一步就是求解图像之间的变换关系.仿射变换能够很好的表

Linux内核部件分析 设备驱动模型之device

来源:Linux社区 -- http://www.linuxidc.com/Linux/2011-10/44627p6.htm 作者 : qb_2008 linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线.设备.驱动.类所组成的关系结构.从本节开始,我们将对linux这一设备驱动模型进行深入分析. 头文件是include/linux/device.h,实现在drivers/base目录中.本节要分析的,是其中的设备,主要在core.c中. struct device {

Keras之函数式(Functional)模型

函数式(Functional)模型 我们起初将Functional一词译作泛型,想要表达该类模型能够表达任意张量映射的含义,但表达的不是很精确,在Keras2里我们将这个词改移为"函数式",函数式模型称作Functional,但它的类名是Model,因此有时候也用Model来代表函数式模型. Keras函数式模型接口是用户定义多输出模型.非循环有向模型或具有共享层的模型等复杂模型的途径.一句话,只要你的模型不是类似VGG一样一条路走到黑的模型,或者你的模型需要多于一个的输出,那么你总应

linux下bus、devices和platform的基础模型 【转】

转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核中由struct kobject结构表示,这个结构使所有设备在底层都具有统一的接口.kobject提供了基本的对象管理能力,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密联系,每个在内核中注册kobject对象都对应与sysfs文件系统中的一个目录;kobject--->sys

概念介绍:POE供电交换机、OSI七层模型、路由协议、访问列表(待整理)

PoE供电交换机 poe供电交换机 是指能够通过网线为远端受电终端提供网络供电的交换机,包含网络交换机和PoE供电两个功能,是PoE供电系统中比较常见的供电设备,端口支持输出功率达15.4W,符合IEEE802.3af标准,端口支持输出功率达30W,符合IEEE802.3at标准,通过网线供电的方式为标准的POE终端设备供电,免去额外的电源布线.符合IEEE802.3aT 标准的POE交换机,端口输出功率可以达到15-60W .通俗的说 ,POE供电交换机就是支持网线供电的交换机,其不但可以实现

MapReduce模型

在并行计算领域最著名的就是MPI模型,MPI是一种消息传递编程模型,在大规模科学计算领域已经成功应用了数年,而MapReduce则是一种近几年出现的相对较新的并行编程技术,但是MapReduce计算模型也是建立在数学和计算机科学基础上的,实践已经证明这种并行编程模型具有简单.高效的特点,最为重要的两个概念就是Map和Reduce.最基本的处理思想就是“分而治之,然后归约”.Hadoop会将一个大任务分解为可以同时执行的多个小任务,从而达到并行计算的目的.举个简单的例子,对于一个大型任务,单机处理

使用接口还是使用抽象类

很多人有过这样的疑问:为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种. 首先来了解一下接口和抽象类的一些具体的区别: 抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节. 类描述了一个实体,包括实体的状态,也包括实体可能发出的动作. 接口定义了一个实体可能发出的动作.但是只是定义了这些动