我负责前端和神经网络搭建
神经网络
输入层(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),其他象限类推,从而找到最接近的一个整数坐标代替。例如