在项目小组里面我分配到的任务是深度学习框架和android后台的开发,本帖记录我在寒假期间学习TensorFlow的一些知识和理解,也希望自己能早日成为真·大犇。
--------------------------------------------------分割线----------------------------------------------------
TensorFlow是谷歌的深度学习框架,老师曾经说过一个形象的比喻,它就像是一个黑匣子,输入进去、内部处理、输出结果。深度学习算法与传统的机器学习不同的一点就是多层复杂特征提取,于本项目而言,所需要的就是对于食物图像的训练,通过巨量的图片对其进行训练,以期食物识别算法能够更准确地识别出食物。
TensorFlow的安装主要有两个途径,一个是通过Anaconda进行下载,另一个是通过pip来进行下载,Anaconda如果没有梯子,下载很慢,所以还是推荐通过pip来下载。需要注意到的是,TensorFlow暂时不支持Python3.7,最开始的时候不知道,调了很长时间总是失败,换成Python3.6.8之后成功下载。Python3自带有pip3,输入
pip3 install tensorflow
就可以完成下载,TensorFlow官方有一个API文档对我们来说很有帮助,里面的一些函数的参数数量和类型可以很清楚的看到。
一、基础部分
TensorFlow=Tensor+Flow 本身他的名字就已经很好地解释了它的内涵:张量+流,张量可以简单地理解成矩阵或多维数组(n阶张量可以认为是n维数组),通过计算图来表述计算。
1、定义一个常量
使用tf.constant(),返回一个张量
import tensorflow as tf a=tf.constant(1,name="a") print(a)
输出:
对于某些一开始不知道值的变量,可以用tf.placeholder()占位符,后面再用feed_dict()进行赋值
import tensorflow as tf a=tf.placeholder(tf.int32) #值未知,先不进行初始化 sess=tf.Session() print(sess.run(a,feed_dict={a:1})) sess.close()
2、变量
使用tf.Variable(),而且必须进行初始化
import tensorflow as tf a=tf.Variable(tf.ones([3,3])) #创建一个3*3的一个全为1的矩阵 init=tf.global_variables_initializer() #初始化 print(a)
输出:
3、会话
在TensorFlow中会话拥有并管理程序运行时的所有资源,可以通过Python的上下文管理器来管理此会话,代码如下:
import tensorflow as tf a=tf.constant([[1,2],[2,3]],tf.int32,name="a") b=tf.constant([[2,3],[4,5]],tf.int32,name="b") with tf.Session() as sess: result=tf.matmul(a,b) print(sess.run(result))
其中:tf.matmul()为矩阵相乘。tf.add()为加法,tf.multiply()为乘法
4、前向传播算法
前向传播算法(全连接网络结构)
三层神经网络结构图:输入层、隐藏层、输出层
通过矩阵乘法可以得到几个结点的向量取值。最后得到最后一个点的值。用以判断是否合格。
二、实现简单的神经网络(手写数字识别)
运用前面所学到的一些基础,再加上在博客上膜拜了一些大佬,试写了一下手写数字识别,具体见代码及注释
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets("D:\Mnist_data\mnist/",one_hot=True) #直接读取已经下载好的MNIST数据集 batchSize = 1000 x = tf.placeholder(dtype=tf.float32, shape=[None, 784],name= 'x') #输入层,图片为28*28*1 y = tf.placeholder(dtype=tf.float32, shape=[None,10],name='y') #标签label #实现全连接的神经网络 def addLayer(inputData,inputNum,outputNum,activateFunction=None): #添加一层网络 #线性变换 输出=输入*权重+偏重 w = tf.Variable(initial_value=tf.random_normal(shape=[inputNum,outputNum])) #正态分布随机数,1*2的矩阵 b = tf.Variable(initial_value=tf.random_normal(shape=[1, outputNum])) output=tf.add(tf.matmul(inputData,w),b) if activateFunction: output = activateFunction(output) return output def buildNeuralNetwork(data): #搭建网络 hiddenLayer1 = addLayer(data,784,100,activateFunction=tf.nn.sigmoid) #隐藏层1 hiddenLayer2 = addLayer(hiddenLayer1, 100, 50, activateFunction=tf.nn.sigmoid) #隐藏层2 outputLayer = addLayer(hiddenLayer2,50,10) #输出层 return outputLayer #返回输出层 def trainNeuralNetword(data): output = buildNeuralNetwork(data) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=output)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=1).minimize(loss) #优化器 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(50): amountCost = 0 for _ in range(int(mnist.train.num_examples / batchSize)): xData,yData = mnist.train.next_batch(batchSize) cost, _ = sess.run([loss,optimizer],feed_dict={x:xData,y:yData}) amountCost+=cost print("AmountCost of ",i,":",amountCost) accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y,1),tf.argmax(output,1)),tf.float32)) acc=sess.run(accuracy,feed_dict={x: mnist.test.images,y: mnist.test.labels}) print("Accuracy:",acc) trainNeuralNetword(x) #调用方法