TensorFlow深度学习框架 2019寒假学习笔记

在项目小组里面我分配到的任务是深度学习框架和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)  #调用方法

猜你喜欢

转载自www.cnblogs.com/TheSilverMoon/p/10325349.html