zoukankan      html  css  js  c++  java
  • 卷积神经网络入门案例-数字图像识别

      卷积层的原理和优点

        在普通的全连接神经网络基础上,加上了卷积层,卷积层可以把低级别的特征逐步提取成为高级别特征的能力,是实现图像识别、语音识别等人工智能应用的基本原理。所以,由于卷积层这个能自主从原始的数据开始逐步发现特征并最终解决问题的能力,所以卷积层特别适合处理像图片、视频、音频、语音文字等这些相互间位置有一定关系的数据。

      卷积神经网络入门案例-数字图像识别作为这本书中的一个最简单的例子,现在根据我个人目前对这个案例的理解,分析下面的知识点。

      神经网络的结构图是这样的:

                    

       这是一个全连接的神经网络架构图,每一个圆圈都是一个神经元,每一条直线表示两个神经元的连接,并且是层与层之间才有连接,层内的神经元没有连接,从左到友依次是输入层(input layer)、第一层隐藏层(hidden layer1)、第二层隐藏层(hidden layer2)、输出层(output layer).

       输入层:负责接收和输入数据

       隐藏层:处于输入层和输出层之间,隐藏层越多说明这个神经网络越‘深’。隐藏层超过2个都可以叫深度神经网络。

       输出层:输出神经网络输出的数据

       所谓神经网络:按照一定的规则连接起来的神经元,而神经网络结构多种,卷积神经网络就是其中一种。

       卷积神经网络适用于:图像识别,语音任务的神经网络,因为这些神经元之间有密切联系。

       话不多说,理解以上的含义后,用代码解析一个简单的卷积神经网络-数字图像识别案例。

       

    #导入用到的tensorflow、numpy、os和sys包
    import
    tensorflow as tf import numpy as np import os import sys #保存训练模型的文件路径 trainResultPath = './save/check' #初始定义一个命令行变量,是否重新开始训练模型 ifRestartT = False
    #定义一个变量,获取命令行从第二个参数起所有参数 argt
    = sys.argv[1:] #循环这个argt变量 for v in argt:
    #判断如果命令行参数有‘restart’,则ifRestartT = True
    if v == "-restart": ifRestartT = True #从文件中读取数据 fileData = np.loadtxt('checkData.txt',dtype=np.float32,delimiter=',') #算出数据集的列数,.size:取出所有数个数 rowSize = int(fileData[0].size) #算出数据集的行数,用数据集所有个数除于列数等于行数 rowCount = int(fileData.size/rowSize) print('rowSize:%d,rowCount:%d'% (rowSize,rowCount)) #定义x变量为5x5矩阵 x = tf.placeholder(shape=[1,5,5,1],dtype=tf.float32) yTrain = tf.placeholder(shape=[3],dtype=tf.float32) #定义卷积核对象为可变对象,用于和图片进行卷积运算 filterT = tf.Variable(tf.random_normal([2,2,1,1])) #nn.conv2d:卷积运算,参数依次是(输入数据,卷积核,步长,是否填充0) y1 = tf.nn.conv2d(x,filterT,strides=[1,1,1,1],padding='VALID')
    #将y1矩阵数据拉直为一行数据,用于下面全连接的输入数据 yF
    = tf.reshape(y1,[1,-1]) #定义全连接w1权值.形态为[25,64] w1 =tf.Variable(tf.random_normal([yF.get_shape().as_list()[1],64],mean=0.5,stddev=0.1,dtype=tf.float32))
    #定义b1值 b1
    = tf.Variable(0,dtype=tf.float32)
    #定义y2层,进行矩阵运算并加入激活函数tanh y2
    = tf.nn.tanh(tf.matmul(yF,w1)+b1) #定义全连接wn权值,形态为[64,3],选择列数为3,因为输出的值有三个类型 wn =tf.Variable(tf.random_normal([64,3],mean=0.5,stddev=0.1,dtype=tf.float32))
    #定义bn值 bn
    = tf.Variable(0,dtype=tf.float32) #定义mn层,进行矩阵运算 mn = tf.matmul(y2,wn) +bn
    #控制mn值相加为1,概率合为1 yn
    = tf.nn.softmax(mn)
    #将yn拉直为一行数据 yResult
    = tf.reshape(yn,[-1]) #计算损失值 loss = -tf.reduce_mean(yTrain*tf.log(tf.clip_by_value(yResult,1e-10,1.0))) #给定学习率 optimizer = tf.train.RMSPropOptimizer(0.01) # train = optimizer.minimize(loss) #定义一个调用tf.Session()的对象 sess = tf.Session() #sess.run(tf.global_variables_initializer()) if ifRestartT: print("force restart...") sess.run(tf.global_variables_initializer()) elif os.path.exists(trainResultPath + ".index"): print("loading: %s" % trainResultPath) tf.train.Saver().restore(sess, save_path=trainResultPath) else: print("train result path not exists: %s" % trainResultPath) sess.run(tf.global_variables_initializer()) for i in range(100): totalLoss = 0.0 for j in range(rowCount): result = sess.run([train,yResult,yTrain,loss],feed_dict={x:np.reshape(fileData[j][0:25],(1,5,5,1)),yTrain:fileData[j][25:28]}) print(result) totalLoss = totalLoss+ float(result[len(result)-1]) print('avgLoss:%10.10f'% (totalLoss/rowCount)) #保存训练过程文件 #trainResultPath = './save/check' print("saving...") tf.train.Saver().save(sess, save_path=trainResultPath) writer = tf.summary.FileWriter('graph',sess.graph)

        

    如有问题请留言,谢谢!
  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/yunsi/p/11251246.html
Copyright © 2011-2022 走看看