识别验证码:验证码由4位大写字母组成即A-Z,共4*26类(104种可能性)
比如一个验证码:NZPP
预测值模块分析:
先求输出值:每个样本都是4个大写字母组成,所以,经过卷积–>激活–>池化等操作,输出26 * 4=104个预测值,输出值大小[None, 4 * 26],
**计算输出值概率:**使用softmax=(e^x /(ex1+…+exn) )函数,将输出值转为概率
目标值模块分析:
类别:A-Z,使用数字表示,A:0,B :1,…,Z:25
然后将对应的字母使用one_hot编码,所在位置记为1,其余为0
所以,使用one_hot编码:NZPP=[0,0,…,1,…,0] [0,0,…,1][0,0,0,…,1,…0][0,0,0,…,1,…0]
拿到输出值,进行交叉熵损失计算:
即输出值概率和目标值进行计算,
某个样本的损失loss=-(y_true)log(y_predict),其中y_true为one_hot 编码的真实值,y_predict是一个概率值
one_hot编码为0的,与预测概率相乘都为0,所以得到:
step1: 损失值loss= 1 * log(y_predict(N))+1 * log(y_predict(Z))+ 1 * log(y_predict§) + 1 * log(y_predict§)
step2:
优化,通过梯度下降进行优化,使得损失最小,让目标值为1的位置概率相对较大
一下是验证码识别部分的代码,文件转换部分代码未添加
import tensorflow as tf
from deep.mnist import full_connected
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string("captcha_dir", "./tfrecords/captcha.tfrecords","验证码数据的路径")
tf.app.flags.DEFINE_integer("batch_size", 100,"每批次训练的样本数")
tf.app.flags.DEFINE_integer("label_num",4,"每个样本的目标数量值")
tf.app.flags.DEFINE_integer("letter——num",100,"每个目标值取得字母的可能性个数")
#定义一个初始化权重的函数
def weight_variables(shape):
w = tf.compat.v1.Variable(tf.random_normal_initializer(shape=shape, mean=0.0, stddev=1.0))
return w
#定义一个初始化偏置的函数
def bias_variables(shape):
b