精华内容
下载资源
问答
  • 隐马氏模型作为一种具有双重随机过程统计模型,具有可靠概率统计理论基础和强有力数学结构,已被广泛应用于语音识别、生物序列分析、金融数据分析等领域.由于传统一阶隐马氏模型无法表示更远状态距离间...
  • 2、定义网络权重 (1)使用tf.Variable(initial_value,name) (2)使用tf.get_Variable(name,shape,initializer,collections) (3)随机数生成常用函数 3、定义网络偏置 (1)使用tf.Variable(initial_...

    注意:这是一个完整的项目,建议您按照完整的博客顺序阅读。

    文章目录

    前言

    一、定义全连接神经层

    1、tf.Variable()或者tf.get_variable()的区别

    2、定义网络的权重

    (1)使用tf.Variable(initial_value,name)

    (2)使用tf.get_Variable(name,shape,initializer,collections)

    (3)随机数生成的常用函数

    3、定义网络的偏置

    (1)使用tf.Variable(initial_value,name)

    (2)使用tf.get_Variable(name,shape,initializer,collections)

    (3)张量生成的常用函数

    4、网络的激活函数

    5、定义全连接神经层

    (1)使用tf.Variable自定义方式

    (2)使用tf.get_Variable自定义方式

    (3)使用tf.layers.dense()

    (4)使用tf.layers.dense()

    二、定义全连接网络

    三、定义计算图

    1、定义计算图的输入结构

    2、定义计算图的输出变量

    3、定义一个滑动平均模型

    4、定义计算图的损失函数

    5、定义计算图的准确率

    6、定义计算图的学习率

    7、定义计算图的优化器

    提示

     


    前言

    全连接网络是深度学习中的最简单的神经网络,在定义该网络时有许多不同的方式,本文尽可能将使用TensorFlow定义FNN的常见方式总结下


    一、定义全连接神经层

    众所周知,一个现代神经元的基本元素是权重偏置激活函数,其中使用非线性激活函数可以将多层网络从线性模型转换为非线性模型,这也是目前深度学习技术可以处理复杂非线性问题的原因之一。

    使用TensorFlow来创建网络的权重和偏置参数是学习神经网络的基础,在TensorFlow中一般使用tf.Variable()或者tf.get_variable()是创建模型的参数变量。

    1、tf.Variable()或者tf.get_variable()的区别

    tf.Variable()每次调用都在创建一个新对象,所以无法进行参数复用;tf.Variable如果检测到命名冲突,系统会自己处理。tf.Variable可以使用tf.variable_scope()和tf.name_scope()来定义命名空间。

    tf.get_variable()每次调用时如果存在该名称的变量并且自身reuse=True,那么就将之前已经创建的对象返回,否则才创建一个新对象。tf.get_variable()如果检测到命名冲突系统会报错;tf.get_variable()要使用tf.variable_scope()来定义命名空间,

    2、定义网络的权重

    网络的权重一般使用随机初始化一个正态分布的二维数字矩阵,有以下两种方式:

    (1)使用tf.Variable(initial_value,name)

    with tf.name_scope('weights'):
       weights = tf.Variable(initial_value=tf.random_normal([in_size, out_size]), name='w')
       tf.summary.histogram('weights', weights) #在 tensorboard中检测变量

    (2)使用tf.get_Variable(name,shape,initializer,collections)

    with tf.variable_scope('biases'):
        biases = tf.get_variable(name='b',
                    shape=[1, units],
                    initializer=tf.constant_initializer(0.1),
                    collections=c_names)

    (3)随机数生成的常用函数

    # 正态分布
    tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=Noneshape,mean,stddev)
    # 正态分布
    tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
    # 均匀分布
    tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)
    # Gamma分布
    tf.random_gamma: 
    tf.random_shuffle(value, seed=None, name=None)

    3、定义网络的偏置

    (1)使用tf.Variable(initial_value,name)

    with tf.name_scope('biases'):
        biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')# 推荐不为0,此处加0.1
        tf.summary.histogram('biases', biases)# 在 tensorboard中绘制图片

    (2)使用tf.get_Variable(name,shape,initializer,collections)

    with tf.variable_scope('biases'):
        biases = tf.get_variable(name='b',
                    shape=[1, units],
                    initializer=tf.constant_initializer(0.1),
                    collections=c_names)

    (3)张量生成的常用函数

    tf.zeros(shape, dtype=tf.float32, name=None)
    tf.zeros_like(tensor, dtype=None, name=None)
    tf.constant(value, dtype=None, shape=None, name='Const')
    tf.fill(dims, value, name=None)
    tf.ones_like(tensor, dtype=None, name=None)
    tf.ones(shape, dtype=tf.float32, name=None)

    4、网络的激活函数

    最常见的是以下三类:

    tf.nn.relu() 
    tf.nn.sigmoid() 
    tf.nn.tanh() 

    5、定义全连接神经层

    (1)使用tf.Variable自定义方式

    在定义激活函数时,我们在定义变量时要考虑顺便定义好其name,激活函数也要参数化,默认为空,因为有些神经层不需要经过激活函数处理

    同时我们要为该神经层定义一个整体的命名空间,方便在TensorBoard中区分,这里我们以layer1、layer2的形式命名,则我们的定义可以如下处理:

    def _define_layer(self,inputs, in_size, out_size, index_layer, activation_function=None):
            """ 定义一个全连接神经层"""
            layer_name = 'layer%s' % index_layer # 定义该神经层命名空间的名称
            with tf.name_scope(layer_name):
                with tf.name_scope('weights'):
                    weights = tf.Variable(initial_value=tf.random_normal([in_size, out_size]), name='w')
                with tf.name_scope('biases'):
                    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
                with tf.name_scope('wx_plus_b'):
                    # 神经元未激活的值,矩阵乘法
                    wx_plus_b = tf.matmul(inputs, weights) + biases
                # 使用激活函数进行激活
                if activation_function is None:
                    outputs = wx_plus_b
                else:
                    outputs = activation_function(wx_plus_b)
                
            # 返回神经层的输出
            return outputs

    注意在上述中我们使用的是tf.name_scope()来定义命名空间

    接下来,为了让我们的神经层更通用,我们可以考虑将着正则化函数(regularizer__function)和是否在TensorBoard中监控参数(is_historgram)两个选项参数化。

    若需要正则化,我们只需要将权重参数输入正则化参数中,再将返回值添加到TensorFlow的自定义集合(collection)中,这样当我们需要这个变量的时候就可以在指定地方(一般是定义损失函数)调用该集合。

    若需要监控参数,我们则需要tf.summary.histogram()来标记该参数,

    所以我们的定义方法修改如下: 

    def _define_layer(self,inputs, in_size, out_size, index_layer, activation_function=None,regularizer__function=None,is_historgram=True):
            """ 定义一个全连接神经层"""
            layer_name = 'layer%s' % index_layer # 定义该神经层命名空间的名称
            with tf.name_scope(layer_name):
                with tf.name_scope('weights'):
                    weights = tf.Variable(initial_value=tf.random_normal([in_size, out_size]), name='w')
                    if regularizer__function != None: # 是否使用正则化项
                        tf.add_to_collection('losses', regularizer__function(weights))  # 将正则项添加到一个名为'losses'的列表中
                    if is_historgram: # 是否记录该变量用于TensorBoard中显示
                        tf.summary.histogram(layer_name + '/weights', weights)#第一个参数是图表的名称,第二个参数是图表要记录的变量
                with tf.name_scope('biases'):
                    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
                    if is_historgram:  # 是否记录该变量用于TensorBoard中显示
                        tf.summary.histogram(layer_name + '/biases', biases)
                with tf.name_scope('wx_plus_b'):
                    # 神经元未激活的值,矩阵乘法
                    wx_plus_b = tf.matmul(inputs, weights) + biases
                # 使用激活函数进行激活
                if activation_function is None:
                    outputs = wx_plus_b
                else:
                    outputs = activation_function(wx_plus_b)
                if is_historgram:  # 是否记录该变量用于TensorBoard中显示
                    tf.summary.histogram(layer_name + '/outputs', outputs)
                # 返回神经层的输出
            return outputs

    (2)使用tf.get_Variable自定义方式

    使用tf.get_Variable和之前的定义方式差不多,唯一有区别的可能就是该API输入的参数不同使用tf.variable_scope()来定义命名空间

    下面直接给出方法定义:

    def _define_layer(self,inputs, in_size, out_size, index_layer, activation_function=None,regularizer__function=None,is_historgram=True):
            """ 定义一个全连接神经层"""
            layer_name = 'layer%s' % index_layer # 定义该神经层命名空间的名称
            with tf.variable_scope(layer_name,reuse=tf.AUTO_REUSE):
                with tf.variable_scope('weights'):
                    weights = tf.get_variable('w', [in_size, out_size], initializer=tf.truncated_normal_initializer(stddev=0.1))
                    if regularizer__function != None: # 是否使用正则化项
                        tf.add_to_collection('losses', regularizer__function(weights))  # 将正则项添加到一个名为'losses'的列表中
                    if is_historgram: # 是否记录该变量用于TensorBoard中显示
                        tf.summary.histogram(layer_name + '/weights', weights)#第一个参数是图表的名称,第二个参数是图表要记录的变量
                with tf.variable_scope('biases'):
                    biases = tf.get_variable('b', [1, out_size], initializer=tf.constant_initializer(0.0))
                    if is_historgram:  # 是否记录该变量用于TensorBoard中显示
                        tf.summary.histogram(layer_name + '/biases', biases)
                with tf.variable_scope('wx_plus_b'):
                    # 神经元未激活的值,矩阵乘法
                    wx_plus_b = tf.matmul(inputs, weights) + biases
                # 使用激活函数进行激活
                if activation_function is None:
                    outputs = wx_plus_b
                else:
                    outputs = activation_function(wx_plus_b)
                if is_historgram:  # 是否记录该变量用于TensorBoard中显示
                    tf.summary.histogram(layer_name + '/outputs', outputs)
            # 返回神经层的输出
            return outputs

    当然除了自定义全连接神经层这种,TensorFlow本身也提供了封装好的方法来让我们直接定义全连接神经层,下面给出常见的两个API。

    (3)使用tf.layers.dense()

    tf.layers.dense(
        inputs,# 输入2维的Tensor,第1维表示数据数量
        units, # 该层的神经元数量
        activation=None, # 激活函数
        use_bias=True,# 是否使用偏置项
        kernel_initializer=None,# 运算核的初始化
        bias_initializer=tf.zeros_initializer(),# 运算核的初始化
        kernel_regularizer=None,# 运算核的正则化函数,可选
        bias_regularizer=None,# 运算核的正则化函数,可选
        activity_regularizer=None,# 输出的正则化函数
        trainable=True,# 该层参数是否参与训练
        name=None,# 层的名字
        reuse=None # 是否重复使用参数
    )

    (4)使用tf.layers.dense()

    tf.contrib.layers.fully_connected(
        inputs,# 输入2维的Tensor
        units, # 该层的神经元数量
        activation=None, # 激活函数
        use_bias=True,# 是否使用偏置项
        kernel_initializer=None,# 运算核的初始化
        bias_initializer=tf.zeros_initializer(),# 运算核的初始化
        kernel_regularizer=None,# 运算核的正则化函数,可选
        bias_regularizer=None,# 运算核的正则化函数,可选
        activity_regularizer=None,# 输出的正则化函数
        trainable=True,# 该层参数是否参与训练
        name=None,# 层的名字
        reuse=None # 是否重复使用参数
    )

    二、定义全连接网络

    在上述定义好了全连接层方法后,我们就可以很容易的搭建我们的全连接网络

    为了让不想下载源码的同学方便复现,我们这里也给出定义全连接网络的方法:

        def _define_net(self, input,regularizer__function=None,is_historgram=True):
            """ 定义一个全连接神经网络"""
            # 定义layer1层
            layer1 = self._define_layer(input, # 输入张量
                                        self.n_input, # 输入维度
                                        self.n_layer_1, # 输出维度
                                        index_layer=1,  # 本神经层命名序号
                                        activation_function=tf.nn.relu,# 激活函数
                                        regularizer__function=regularizer__function,# 正则化函数
                                        is_historgram=is_historgram)  # 是否用TensorBoard可视化该变量
            # 定义layer2层
            output = self._define_layer(layer1,
                                        self.n_layer_1,
                                        self.n_output,
                                        index_layer=2,
                                        activation_function=None,
                                        regularizer__function=regularizer__function,
                                        is_historgram=is_historgram)  # 预测值
            return output

    三、定义计算图

    现在我们已经定义好了我们的全连接网络,但是想在TensorFlow中进行训练还是不行的,我们要继续定义一个计算图来包含该网络。

    1、定义计算图的输入结构

    计算图的输入结构就是定义输入数据集的样本标签的数据格式。

    我们一般以tf.placeholder()是用来创建模型的输入格式,该方法可以帮助我们定义一个不需要立即初始化的占位节点。

    上述tf.Variable()和tf.get_variable()是用来定义模型的参数变量,一般定义该参数节点要立即进行初始化。

         with tf.name_scope('input'):
                self.x_input = tf.placeholder(dtype=tf.float32, shape=[None, self.n_input], name='x-input')  # 网络输入格式
                self.y_input = tf.placeholder(dtype=tf.float32, shape=[None, self.n_output], name='y-input')  # 网络标签格式

    2、定义计算图的输出变量

    计算图的输出就是我们网络的输出,我们直接调用前面的_define_net()方法,注意我们这里定义了L2正则化参数,正则化操作是用来缓解过拟合现象

         with tf.name_scope('output'):
                regularizer = tf.contrib.layers.l2_regularizer(REGULARIZTION_RATE)  # L2正则化函数
                self.output = self._define_net(self.x_input,regularizer__function = regularizer,is_historgram=True)

    3、定义一个滑动平均模型

    滑动平均模型是深度学习中的一个常见技术,该技巧用于使神经网络更加健壮,在未知数据中表现更好。该技术的思路就是让网络的权重参数更新时以一定的速率来变化:

             # 定义一个不用于训练的step变量,用来更新衰减率
            self.global_step = tf.Variable(0, trainable=False,name='global_step')
            # 定义一个滑动平均模型,该技巧用于使神经网络更加健壮
            with tf.name_scope('moving_averages'):
                variable_averages = tf.train.ExponentialMovingAverage(self.moving_average_decay,self.global_step)  # 生成一个滑动平均的类:v/ExponentialMovingAverage:0
                variable_averages_op = variable_averages.apply(tf.trainable_variables())  # 定义一个更新变量滑动平均的操作

    4、定义计算图的损失函数

    我们的项目是一个分类器,所以在分类网络中经常使用交叉熵损失函数,因为我们之前使用了正则化操作,所以这里也需要添加一个正则化损失

            with tf.name_scope('loss'):
                #cross_entropy = tf.reduce_mean(-tf.reduce_sum(self.y_input * tf.log(self.output), reduction_indices=[1]))  # 使用交叉熵计算损失函数
                cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.output, labels=tf.argmax(self.y_input, 1))
                cross_entropy_mean = tf.reduce_mean(cross_entropy)
                self.loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))  # 交叉熵损失添加上正则化损失
                tf.summary.scalar("loss", self.loss) # 使用TensorBoard监测该变量

    5、定义计算图的准确率

    对比本批次输出和我们的标签,可以计算准确率

            with tf.name_scope('accuracy'):
                correct_prediction = tf.equal(tf.argmax(self.output, 1), tf.argmax(self.y_input, 1))  # 计算本次预测是否正确
                self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # 将正确值转化为浮点类型,再转化为概率
                tf.summary.scalar("accuracy", self.accuracy) # 使用TensorBoard监测该变量

    6、定义计算图的学习率

    学习率是一个超参数,在实际实验要经常调整其大小,其中最常用的就是指数衰减法

    即让学习率按照一定的衰减率在指定回合内衰减到指定大小,我们直接调用tf的API:

     # 定义计算图的学习率
            with tf.name_scope('learning_rate'):
                # 学习率的变化
                learning_rate = tf.train.exponential_decay(self.learn_rate_base,
                                                           self.global_step,
                                                           mnist.train.num_examples / BATCH_SIZE,
                                                           self.learn_rate_decay)
                tf.summary.scalar("learning_rate", learning_rate)  # 使用TensorBoard监测该变量

    7、定义计算图的优化器

    优化器定义了我们进行反向传播的操作方式,是优化神经网络的重要操作节点。

    因为前面我们使用了滑动平均模型,所以我们这里要将优化器滑动平均操作组合在一起,这样两个操作就可以同时执行:

     # 定义计算图的优化器
            with tf.name_scope('optimizer'):
                # 定义优化器
                train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(self.loss,global_step=self.global_step)
                self.optimizer = tf.group(train_step, variable_averages_op)

     


    提示

    如果本项目对您的学习有帮助,欢迎点赞支持!

    展开全文
  • 然后,根据因子分析,我们定义Xij生成模型为: 这个模型可以看成两个部分:等号右边前两项只跟说话人有关而跟说话人具体某一条语音无关,称为信号部分,这描述了说话人类间差异;等号右边后两项描述了同一...

    PLDA算法解释

    概念理解

    在声纹识别领域中,我们假设训练数据语音由I个说话人的语音组成,其中每个说话人有J段自己不同的语音。那么,我们定义第i个说话人的第j条语音为Xij。然后,根据因子分析,我们定义Xij的生成模型为: 
    这里写图片描述

    这个模型可以看成两个部分:等号右边前两项只跟说话人有关而跟说话人的具体某一条语音无关,称为信号部分,这描述了说话人类间的差异;等号右边后两项描述了同一说话人的不同语音之间的差异,称为噪音部分。这样,我们用了这样两个假想变量来描述一条语音的数据结构。

    我们注意到等号右边的中间两项分别是一个矩阵和一个向量的表示形式,这便是因子分析的又一核心部分。这两个矩阵F和G包含了各自假想变量空间中的基本因子,这些因子可以看做是各自空间的特征向量。比如,F的每一列就相当于类间空间的特征向量,G的每一列相当于类内空间的特征向量。而两个向量可以看做是分别在各自空间的特征表示,比如hi就可以看做是Xij在说话人空间中的特征表示。在识别打分阶段,如果两条语音的hi特征相同的似然度越大,那么这两条语音就更确定地属于同一个说话人。

    模型训练

    容易理解,PLDA的模型参数一个有4个,分别是数据均值miu,空间特征矩阵F和G,噪声协方差sigma。模型的训练过程采用经典的EM算法迭代求解。为什么用EM呢?因为模型含有隐变量。

    模型测试

    在测试阶段,我们不再像LDA那样去基于consine距离来计算得分,而是去计算两条语音是否由说话人空间中的特征hi生成,或者由hi生成的似然程度,而不用去管类内空间的差异。在这里,我们使用对数似然比来计算得分。如下图所示: 
    这里写图片描述 
    公式中,如果有两条测试语音,这两条语音来自同一空间的假设为Hs,来自不同的空间的假设为Hd,那么通过计算对数似然比,就能衡量两条语音的相似程度。得分越高,则两条语音属于同一说话人的可能性越大。

    一个简化版本的PLDA

    由于我们只关心区分不同的说话人的类间特征而不用去管同一个说话人的类内特征,所以其实没有必要向上面一样对类内空间G参数进行求解。于是,我们可以得到一个简化版本的PLDA,如下如: 
    这里写图片描述

    转载于:https://www.cnblogs.com/mmziscoming/p/5750853.html

    展开全文
  • 在单个标点句的话头自足句识别任务中,对该任务在形式上进行了完整的定义,将其形式化为机器阅读理解任务。从结果来看,在《围城》语料上取得了83.46%的准确率,在“鱼类百科”语料上的准确率达到91.21%。在标点句...
  • 通过CNN训练MNIST模型如何应用来识别手写数字图片(图片来自网上)? 这个问题困扰了我2天,网上找很多代码都是训练模型和调用模型包含在一个.py文件中,这样子每一次调用模型都需要重新训练一次模型,这种方法...

    1 思考训练模型如何进行应用

    通过CNN训练的MNIST模型如何应用来识别手写数字图片(图片来自网上)?

    这个问题困扰了我2天,网上找的很多代码都是训练模型和调用模型包含在一个.py文件中,这样子每一次调用模型都需要重新训练一次模型,这种方法显然效率低下;

    我想到要把训练模型的.py文件和调用模型预测的.py文件分开,但是调用模型的.py文件该怎么写,很多回答都是如下所示:

    saver = tf.train.Saver() # 定义saver
    with tf.Session() as sess:
        sess.run(intt) 
        # 载入模型
        saver.restore(sess,"./save/model.ckpt")
    

    这个回答不是我要的答案,我觉得载入的模型要起作用,起码应该有个输入输出的参数,于是我想要在两个.py文件之间传递参数,我收到的结果是:

    from xxx import 参数
    获取xxx.py文件的参数
    

    但是我这样写之后,直接是把训练模型的文件重新跑了一遍,这不是我要的效果,而且最后的图片识别也报错,程序执行中断;

    终于我无意间看到了下面这篇文章:

    多层神经网络建模与模型的保存还原
    https://www.cnblogs.com/HuangYJ/p/11681357.html
    在这里插入图片描述
    简单来说,saver.restore() 是加载模型的参数:首先定义相同结构的模型(要定义一个和以前存盘模型相同结构的模型,只有它们的结构相同,这些变量才能吻合,才能把读取出来的变量的值赋给等待着被覆盖的变量的值)。

    2 训练模型的 main graph

    在这里插入图片描述

    从上图(main graph)可以直观看出我们一共需要定义的模型结构有10个:

    input
    image
    conv_layer1
    pooling_layer1
    conv_layer2
    pooling_layer2
    fc_layer3
    dropout
    output_fc_layer4
    softmax
    

    10个结构的代码(函数定义的代码没放上来):

    with tf.name_scope('input'):
        x=tf.placeholder(tf.float32,[None,784])
        y_=tf.placeholder('float',[None,10])
        
    with tf.name_scope('image'):
        x_image=tf.reshape(x,[-1,28,28,1])
        tf.summary.image('input_image',x_image,8)
      
    with tf.name_scope('conv_layer1'):
        W_conv1=weight_variable([5,5,1,32])
        b_conv1=bias_variable([32])
        h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
    
    with tf.name_scope('pooling_layer1'):
        h_pool1=max_pool_2x2(h_conv1)
    
    with tf.name_scope('conv_layer2'):
        W_conv2=weight_variable([5,5,32,64])
        b_conv2=bias_variable([64])
        h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
        
    with tf.name_scope('pooling_layer2'):
        h_pool2=max_pool_2x2(h_conv2)
        
    with tf.name_scope('fc_layer3'):
        W_fc1=weight_variable([7*7*64,1024])
        b_fc1=bias_variable([1024])
        h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
        h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
      
    with tf.name_scope('dropout'):
        keep_prob=tf.placeholder(tf.float32)
        h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
    
    with tf.name_scope('output_fc_layer4'):
        W_fc2=weight_variable([1024,10])
        b_fc2=bias_variable([10])
      
    with tf.name_scope('softmax'):
        y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
    

    3 构造模型的输入和输出

    换一种说法,我们要调用这个训练好的模型,是希望我们输入一张手写数字图片,模型能自动帮我们识别出这张图片上的数字,并打印出来。以上是我们要达到的目的,但是训练的模型本质还是做数学运算,图片输入和识别数字输出都要根据模型来确定。

    模型的输入要求的是一维张量(向量),图像要求是28*28的尺寸,一共784个像素点,需要由2维张量(矩阵)展开成一维张量,以下代码实现:

    
    text = Image.open('./images/text3.png') # 载入图片
    data = list(text.getdata())
    picture=[(255-x)*1.0/255.0 for x in data] #picture作为调用模型的输入
    
    

    模型的输出是经过softmax函数运算的输出,是一长串概率数组,我们要找出最大的概率对应的数字,这个数字就是调入的模型预测到的结果,以下代码实现:

        # 进行预测
        prediction = tf.argmax(y_conv,1)#找概率最大对应的数字
        predict_result = prediction.eval(feed_dict={x: [picture],keep_prob:1.0},session=sess)
        print("你导入的图片是:",predict_result[0])
        
    

    4 应用模型进行识别的完整.py代码

    
    from PIL import Image
    import tensorflow.compat.v1 as tf
    tf.disable_v2_behavior()
    
    #---设置模型参数---
    def weight_variable(shape):#权重函数
        initial=tf.truncated_normal(shape,stddev=0.1)
        return tf.Variable(initial)
     
    def bias_variable(shape):#偏置函数
        initial=tf.constant(0.1,shape=shape)
        return tf.Variable(initial)
    
    def conv2d(x,W):
        return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
    
    def max_pool_2x2(x):
        return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
    
    with tf.name_scope('input'):
        x=tf.placeholder(tf.float32,[None,784])
        y_=tf.placeholder('float',[None,10])
        
    with tf.name_scope('image'):
        x_image=tf.reshape(x,[-1,28,28,1])
        tf.summary.image('input_image',x_image,8)
      
    with tf.name_scope('conv_layer1'):
        W_conv1=weight_variable([5,5,1,32])
        b_conv1=bias_variable([32])
        h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
    
    with tf.name_scope('pooling_layer1'):
        h_pool1=max_pool_2x2(h_conv1)
    
    with tf.name_scope('conv_layer2'):
        W_conv2=weight_variable([5,5,32,64])
        b_conv2=bias_variable([64])
        h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
        
    with tf.name_scope('pooling_layer2'):
        h_pool2=max_pool_2x2(h_conv2)
        
    with tf.name_scope('fc_layer3'):
        W_fc1=weight_variable([7*7*64,1024])
        b_fc1=bias_variable([1024])
        h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
        h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
      
    with tf.name_scope('dropout'):
        keep_prob=tf.placeholder(tf.float32)
        h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
    
    with tf.name_scope('output_fc_layer4'):
        W_fc2=weight_variable([1024,10])
        b_fc2=bias_variable([10])
      
    with tf.name_scope('softmax'):
        y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
    
    #---加载模型,用导入的图片进行测试--
    text = Image.open('./images/text2.png') # 载入图片
    data = list(text.getdata())
    picture=[(255-x)*1.0/255.0 for x in data]  
    
    intt=tf.global_variables_initializer()
    saver = tf.train.Saver() # 定义saver
    
    with tf.Session() as sess:
        sess.run(intt)
    
        # 载入模型参数
        saver.restore(sess,"./save/model.ckpt")
     
        # 进行预测
        prediction = tf.argmax(y_conv,1)
        
        predict_result = prediction.eval(feed_dict={x: [picture],keep_prob:1.0},session=sess)
    
    
        print("你导入的图片是:",predict_result[0])
    
    

    text2.png
    在这里插入图片描述
    识别结果(Spyder编译)
    在这里插入图片描述
    模型和图片下载链接
    https://download.csdn.net/download/weixin_42899627/12672965

    5 运行小提示

    每次代码运行完都需要 restart kernel 才能再次运行,否则会报错,具体什么原因我没深究。
    在这里插入图片描述
    参考文章:
    1 [Python]基于CNN的MNIST手写数字识别 - 东聃 - 博客园
    2 TensorFlow下利用MNIST训练模型识别手写数字 - qiuhlee - 博客园
    3 多层神经网络建模与模型的保存还原
    4 TensorFlow实战(三)分类应用入门:MNIST手写数字识别

    以上是个人理解,有不对的希望批评指正

    展开全文
  • 它整合了隐马尔可夫模型对时序数据建模能力与模糊神经网络模糊规则构建与推理能力,并将其应用到复杂动态手势的识别中.复杂动态手势具备两大特点:运动特征可分解性与定义描述模糊性.针对这两种特性,复杂手势...
  • thinkphp5模型的定义

    2019-10-05 10:24:49
    使用Model类 namespace app\index\model; use think\Model; ...class User extends Model ...默认识别主键 namespace app\index\model; use think\Model; class User extends Model { protected $p...

    使用Model类

    namespace app\index\model;
    
    use think\Model;
    
    class User extends Model
    {
    }

    默认识别主键

    namespace app\index\model;
    
    use think\Model;
    
    class User extends Model
    {
        protected $pk = 'uid';
    }

    转载于:https://www.cnblogs.com/CWJDD/p/11458987.html

    展开全文
  • 名词定义和分类识别名词定义手写体Mnist数据集中10个字符 (0-9)分类识别三级目录 名词定义 1.查准率 查准率(精度)是衡量某一检索系统信号噪声比一种指标,即检出相关文献量与检出文献总量百分比。...
  • 文中定义了目标逻辑模型概念。...以目标高度、目标速度和散射面积为目标逻辑模型参量,任意抽取三组目标参数样本对逻辑模型识别法进行了仿真,结果表明该方法具有原理简单、易于实现、可信度高等特点。
  • 通过贝叶斯分析,构建了基于协方差矩阵描述子刻画图像区域度量先验模型和似然模型;应用随机算法得到极大后验估计,求得目标所在位置和角度;再通过以目标所在位置为中心,获得多个随机矩形;最终以覆盖范围最大者为所...
  • 提出方法提供了93.8%平均准确度、94.2%平均敏感性、93.3%平均特异性和93.4%平均阳性预测值,揭示了很高评价标准,表明该方法有能力准确地检测识别J波,并且可以利用该方法检测心电图中其他病变...
  • 持久化基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 python3.5.0 MNIST...
  • 使用TensorFlow打造自己图像识别模型

    千次阅读 热门讨论 2018-11-11 19:13:20
    2)定义自己datasets文件 3)准备训练文件夹 4)开始训练 5)模型准确率验证 6)导出模型对单张图片进行识别 5.问题总结 本文为笔者学习《21个项目玩转深度学习:基于TensorFlow实践详解》这本书...
  • 构建一种基于发音特征音视频双流动态贝叶斯网络(DBN)语音识别模型(AF_AV_DBN),定义节点条件概率关系,使发音特征状态变化可以异步。在音视频语音数据库上语音识别实验表明,通过调整发音特征之间异步约束...
  • 由于单纯根据视觉纹理信息进行文字识别缺少了对上下文字符语义信息挖掘,时常会导致错误文本识别结果(之后会详细说明)。因此如何获得鲁棒语言信息来提升识别性能成为了最近场景文本识别任务中比较受欢迎...
  • 使用模型选出最佳策略进行步态融合,以得到较高的识别和校验性能。通过在CMU和CASIA数据集上穷举组合对比实验,验证了所提方法有效性,并且该方法可在运算量较小情况下取得最佳识别性能。
  • 对于模型的保存和加载,下面以最熟悉实例(mnist手写数字识别)来做实验。 本文主要通过mnist手写数字识别来练习模型的保存和加载,建议了解了手写数字识别再研究这个。 下面共有三个文件: train:用于训练数据并...
  • 在基于手势用户界面设计中,...最后,将所提出方法应用于识别十个用户定义的动态手势,以控制智能房间中交互式数字电视。实验结果表明,与传统手势识别方法相比,该方法在识别可靠性和识别精度方面表现更好。
  • 语音识别语言模型介绍

    千次阅读 2020-06-07 01:09:23
    语言模型技术广泛应用于语音识别、OCR、机器翻译、输入法等产品上。语言模型建模过程中,包括词典、语料、模型选择,对产品性能有至关重要影响。语言模型的建模需要利用复杂的模型公式进行模拟计算,是人工智能...
  • 从影响煤喷吹性能诸多因素中筛选出适合定量分析性能指标,建立喷吹性能评价指标标准体系,定义各指标相对隶属度计算方法,采用层次分析法计算指标权重,运用多级模糊模式识别模型得到评价结果。运用该模型对某...
  • 基于深度学习识别模型的缺陷检测

    千次阅读 2020-03-01 23:48:37
    根据读者反映,咱们的这个PCB...所以就当是一次瑕疵识别的实践,具体的数据集你可以自己定义。代码在Github: Source code : https://github.com/Ixiaohuihuihui/Tiny-Defect-Detection-for-PCB 一点心路历程,供需...
  • 1、模糊模型识别的第二类问题 上节讲到的模型识别问题本质是讨论一个对象(只有一种属性)对于多个标准模型的匹配程度。而还有一类问题是:被识别的对象是由多个对象组成的一个集合,或者被识别对象具有多种属性时的...
  • 报 Vo]12No5 i998年 10月 0ctl998 手模型分析及手势 曾芬芳 奎董 归宝琪 袁 野 陈良良贵贵 东船舶工业学院电子与信息系 江苏 镇江 摘 要对手结构和关节运动作了深^地分析并建立丁对其施加约束模型根据所定义的 ...
  • Task3 字符识别模型

    2020-05-26 22:46:37
    字符识别模型 在本章学习了CNN模型,该模型是计算机视觉领域主流模型,简略学习了本章,觉得CNN模型就是从原图像中不停分化出特征,并对不同特征与结果进行比较,然后对...构建的模型较为简单,只需要定义好参数,
  • 具体标准定义为:对于语言序列w1,w2,…wn,语言模型就是计算该序列概率即P(w1,w2,…wn)。 2. 为什么需要语言模型? 文本图像中包含两层信息:视觉纹理信息和语言信息。由于单纯根据视觉纹理信息进行文字识别...
  • 该网络估计程序eLasso基于Ising模型,将l1正则逻辑回归与基于扩展贝叶斯信息准则(EBIC)的模型选择相结合。 EBIC是一种适合度量,用于识别变量之间相关关系。 生成网络由变量(作为节点)和相关关系(作为边...
  • 使用L2正则化和平均滑动模型的LeNet-5MNIST手写数字识别模型 觉得有用话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 python3.5.0 MNIST数据集将四个...
  • 给出了带线性方程间限制联立方程组模型的识别定义及间接最小二乘估计量、两步最小二乘估计量、三步最小二乘估计量解析表达式。进一步在可以理解条件下证明了这些估计量相合性和渐近正态性。随机模拟例子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,159
精华内容 863
关键字:

模型识别的定义