软件杯工作总结

本文总结了软件杯项目中使用神经网络进行银行卡号识别的过程。从神经网络的结构,包括输入层、隐藏层和输出层,到前向传播和反向传播的原理,特别是卷积层的权值更新和反向传播的误差计算。提到了opencv图像识别算法,以及在搭建网络时遇到的问题和解决方案,如随机梯度下降法在优化损失函数中的应用。此外,还探讨了YOLO模型的安装、优势和实现细节,并分享了使用pyqt5的体验。
摘要由CSDN通过智能技术生成

我负责前端和神经网络搭建

神经网络

输入层(Input layer):众多神经元(Neuron)接受大量非线形输入信息。输入的信息称为输入向量。
输出层(Output layer):信息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
隐藏层(Hidden layer):简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

前向传播

用深度学习实现银行卡号识别

前向传播过程中,输入的图形数据经过多层卷积层的卷积和池化处理,提出特征向量,将特征向量传入全连接层中,得出分类识别的结果。
神经网络模型
在这里插入图片描述

反向传播

当卷积神经网络输出的结果与我们的期望值不相符时,则进行反向传播过程。

求出结果与期望值的误差,再将误差一层一层的返回,计算出每一层的误差,然后进行权值更新。该过程的主要目的是通过训练样本和期望值来调整网络权值。

误差的传递过程可以这样来理解,首先,数据从输入层到输出层,期间经过了卷积层,下采样层,全连接层,而数据在各层之间传递的过程中难免会造成数据的损失,则也就导致了误差的产生。

下面是我在银行卡号识别中的部分代码

def backward(data, label):

    x = tf.placeholder(tf.float32, shape = (None, forward.INPUT_NODE))
    y_ = tf.placeholder(tf.float32, shape = (None, forward.OUTPUT_NODE))
    y = forward.forward(x, REGULARIZER)
    global_step = tf.Variable(0, trainable=False)	
	
    ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
    cem = tf.reduce_mean(ce)
    loss = cem + tf.add_n(tf.get_collection('losses'))

    train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss, global_step=global_step)

    ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
    ema_op = ema.apply(tf.trainable_variables())
    with tf.control_dependencies([train_step, ema_op]):
        train_op = tf.no_op(name='train')

    saver = tf.train.Saver()

    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        sess.run(init_op)

        ckpt = tf.train.get_checkpoint_state(MODEL_SAVE_PATH)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)

        for i in range(STEPS):
            start = (i*BATCH_SIZE)%len(data)
            end = start+BATCH_SIZE
            _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={
   x: data[start:end], y_: label[start:end]})
            if i % 100 == 0:
                print("After %d training step(s), loss on training batch is %g." % (step, loss_value))
                saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)


def main():
    data, label = IMG.img_handle()
    for i in range(len(data)):
        x, y = random.randint(0, len(data)-1), random.randint(0, len(data)-1)
        temp_data = data[x]
        data[x] = data[y]
        data[y] = temp_data
        temp_label = label[x]
        label[x] = label[y]
        label[y] = temp_label
    print(len(data), len(label))
    backward(data, label)

卷积层的权值更新

卷积层的误差更新过程为:将误差矩阵当做卷积核,卷积输入的特征图,并得到了权值的偏差矩阵,然后与原先的卷积核的权值相加,并得到了更新后的卷积核。
全连接层的权值更新过程

全连接层中的权值更新过程为:

1、求出权值的偏导数值:学习速率乘以激励函数的倒数乘以输入值;
2、原先的权值加上偏导值,得到新的权值矩阵。具体的过程如图4-9所示(图中的激活函数为Sigmoid函数)

采样方法:

子采样有两种形式,一种是均值子采样(mean-pooling),一种是最大值子采样(max-pooling)。

 (1)均值子采样的卷积核中每个权重都是0.25,卷积核在原图inputX上的滑动的步长为2。均值子采样的效果相当于把原图模糊缩减至原来的1/4。

   (2)最大值子采样的卷积核中各权重值中只有一个为1,其余均为0,卷积核中为1的位置对应inputX被卷积核覆盖部分值最大的位置。卷积核在原图inputX上的滑动步长为2。最大值子采样的效果是把原图缩减至原来的1/4,并保留每个2*2区域的最强输入。

opencv图像识别算法

插值算法:变换后像素的灰度值等于距它最近的输入像素的灰度值

        最近邻插值:(i,j)在第一象限的四个相邻整数坐标为([i],[j]),([i]+1,[j]),([i],[j]+1),([i]+1,[j]+1),其他象限类推,从而找到最接近的一个整数坐标代替。例如
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值