OpenCV+python计算机视觉图像处理5——数字识别案例

样本介绍

样本地址:http://yann.lecun.com/exdb/mnist/

KNN最近临域

本质:KNN test 样本 k个 max10 8个1 -> 1

#1.load data
#2.knn test train distance 5*500 =2500 784维=28*28
#3.knn k个最近的图片 5 500 1test->500train (4)
#4.k个最近的图片 -> parse content label(解析图片中的内容)
#5.label -> number (具体数字)
#6.检测概率统计 

import tensorflow.compat.v1 as tf
import numpy as np
import random
from tensorflow.examples.tutorials.mnist import input_data
#1.load data  (1.filename 2.one_hot:0 1)
mnist = input_data.read_data_sets('MNIST_data/',one_hot=True)
#属性设置
trainNum = 55000
testNum = 10000
trainSize = 500
testSize = 5
k = 4
#数据分解 (1.trainSize 2.范围0-trainNum 3.replace:是否重复)
trainIndex = np.random.choice(trainNum,trainSize,replace=False)
testIndex = np.random.choice(testNum,testSize,replace=False)
trainData = mnist.train.images[trainIndex]  #train image
trainLabel = mnist.train.labels[trainIndex] #train label
testData = mnist.test.images[testIndex]
testLabel = mnist.test.labels[testIndex]

print('trainData.shape=',trainData.shape)  #500*784  每个图片28*28=784个像素
print('trainLabel.shape=',trainLabel.shape)#500*10
print('testData.shape=',testData.shape)    #5*784
print('testLabel.shape=',testLabel.shape)  #5*10
print('testLabel=\n',testLabel)

#tf input 784->image
tf.disable_v2_behavior()
trainDataInput = tf.placeholder(shape=[None,784],dtype=tf.float32)
trainLabelInput = tf.placeholder(shape=[None,10],dtype=tf.float32)
testDataInput = tf.placeholder(shape=[None,784],dtype=tf.float32)
testLabelInput = tf.placeholder(shape=[None,10],dtype=tf.float32)

#2.knn test train distance 5 500 784(3D) 2500*784
f1 = tf.expand_dims(testDataInput,1)  #维度拓展  5*784->5*1*784
f2 = tf.subtract(trainDataInput,f1)   #distance of train_data and test_data 784 sum(784)
f3 = tf.reduce_sum(tf.abs(f2),reduction_indices=2) #完成数据累加 784 abs

#3.knn k个最近的图片
f4 = tf.negative(f3)  #取反
f5,f6 = tf.nn.top_k(f4,k=4)  #选取f4中最大的四个值 即,f3中最小的四个值

#4.k个最近的图片 -> parse content label(解析图片中的内容)
f7 = tf.gather(trainLabelInput,f6)  #f6 index -> trainLabelInput

#5.label -> number
f8 = tf.reduce_sum(f7,reduction_indices=1)  #竖直方向上的累加
f9 = tf.argmax(f8,dimension=1)  #选取某一维度上最大的值,显示其下标


with tf.Session() as sess:
    p1 = sess.run(f1,feed_dict={testDataInput:testData[0:5]})
    print('p1=',p1.shape)  # p1 = (5,1,784)
    p2 = sess.run(f2,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5]})
    print('p2=',p2.shape)  # p2 = (5,500,784)
    p3 = sess.run(f3,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5]})
    print('p3=',p3.shape)  # p3 = (5,500)
    print('p3[0,0]=',p3[0,0])  # knn distance
    
    p4 = sess.run(f4,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5]})
    print('p4=',p4.shape)  
    print('p4[0,0]=',p4[0,0])  

    p5,p6 = sess.run((f5,f6),feed_dict={trainDataInput:trainData,testDataInput:testData[0:5]})
    print('p5=',p5.shape)  #p5= (5, 4) 每一张测试图片(5张)分别对应4张最近训练图片
    print('p6=',p6.shape)  #p6= (5, 4)
    print('p5[0]=',p5[0]) #p5 distance
    print('p6[0]=',p6[0]) #p6 index
    
    p7 = sess.run(f7,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5],trainLabelInput:trainLabel})
    print('p7=',p7.shape) #p7= (5, 4, 10)
    print('p7[]',p7)
    
    p8 = sess.run(f8,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5],trainLabelInput:trainLabel})
    print('p8=',p8.shape) #p8= (5, 10)
    print('p8[]=',p8)
    
    p9 = sess.run(f9,feed_dict={trainDataInput:trainData,testDataInput:testData[0:5],trainLabelInput:trainLabel})
    print('p9=',p9.shape) #p9= (5,)
    print('p9[]=',p9)
     
    p10 = np.argmax(testLabel[0:5],axis=1)
    print('p10[]=',p10)

#6.检测概率统计 
j = 0
for i in range(0,5):
    if p10[i] == p9[i]:
        j = j+1
print('ac=',j*100/5)   

CNN卷积神经网络

#CNN

#1):输入 -> 激励函数+矩阵 乘法 加法 -> 输出
#  loss = tf.reduce_mean(tf.square(y-layer2))
#2)CNN:输入 -> pool(激励函数+矩阵 卷积 加法)-> softmax(矩阵 乘法 加法)
#  loss:code


#1.import
import tensorflow.compat.v1 as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

#2.load data
mnist = input_data.read_data_sets('MNIST_data',one_hot = True)

#3.input
tf.disable_v2_behavior()
imageInput = tf.placeholder(tf.float32,[None,784])  #28*28
labelInput = tf.placeholder(tf.float32,[None,10])   #knn

#4.data reshape
#[None,784]->M*28*28*1 2D->4D 28*28 wh 1 channel
imageInputReshape = tf.reshape(imageInput,[-1,28,28,1])

#5.卷积 
w0 = tf.Variable(tf.truncated_normal([5,5,1,32],stddev = 0.1))#w0:卷积内核 5*5 in:1 out:32   truncated_normal:正态分布
b0 = tf.Variable(tf.constant(0.1,shape=[32]))

#6.layer1:激励函数+卷积运算
#imageInputReshape:M*28*28*1 w0:5,5,1,32  out:M*28*28*32
layer1 = tf.nn.relu(tf.nn.conv2d(imageInputReshape,w0,strides=[1,1,1,1],padding='SAME')+b0)
#pool 采样 数据量减少很多 数据的抽样  (M*28*28*32)/(1,4,4,1)=M*7*7*32
#max_pool: [1,2,3,4]->[4]
layer1_pool = tf.nn.max_pool(layer1,ksize=[1,4,4,1],strides=[1,4,4,1],padding='SAME')

#7.layer2:激励函数+乘加运算; softmax(激励函数+乘加运算)
#7.1 激励函数+乘加运算;
w1 = tf.Variable(tf.truncated_normal([7*7*32,1024],stddev=0.1)) #[7*7*32,1024]
b1 = tf.Variable(tf.constant(0.1,shape=[1024]))
h_reshape = tf.reshape(layer1_pool,[-1,7*7*32]) #M*7*7*32->N*N1
h1 = tf.nn.relu(tf.matmul(h_reshape,w1)+b1)  #N*7*7*32 [7*7*32,1024]=N*1024

#7.2 softmax(激励函数+乘加运算)
w2 = tf.Variable(tf.truncated_normal([1024,10],stddev=0.1))
b2 = tf.Variable(tf.constant(0.1,shape=[10]))
pred = tf.nn.softmax(tf.matmul(h1,w2)+b2)  #N*1024 1024*10 = N*10
# N*10(概率) N1[0.1 0.2 0.4 0.1 0.2...]
# label        [0   0   1   0   1...]
loss0 = labelInput*tf.log(pred)
loss1 = 0.1

#7.3判断概率
for m in range(0,500):  #test 500
    for n in range(0,10):  #10维
        loss1 = loss1 - loss0[m,n]
loss = loss1/500

#8.train
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)   #梯度下降法

#9.run
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())  #所有变量的初始化
     #遍历图片
    for i in range(100):
        images,labels = mnist.train.next_batch(500)
        sess.run(train,feed_dict={imageInput:images,labelInput:labels}) #添加数据
        
        
        pred_test = sess.run(pred,feed_dict={imageInput:mnist.test.images,labeInput:labels})
        acc = tf.equal(tf.arg_max(pred_test,1),tf.arg_max(mnist.test.labels,1))  #误差概率
        acc = tf.equal(tf.arg_max(pred_test,1),tf.arg_max(mnist.test.labels,1))
        acc_float = tf.reduce_mean(tf.cast(acc,tf.float32))
        acc_result = sess.run(acc_float,feed_dict={imageInput:mnist.test.images,labelInput:mnist.test.labels})
        print(acc_result)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值