Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初步了解TensorFlow

初步了解TensorFlow

作者头像
夜雨飘零
发布于 2020-05-06 03:44:24
发布于 2020-05-06 03:44:24
55500
代码可运行
举报
文章被收录于专栏:CSDN博客CSDN博客
运行总次数:0
代码可运行

原文博客:Doi技术团队 链接地址:https://blog.doiduoyi.com/authors/1584446358138 初心:记录优秀的Doi技术团队学习经历

目录

文章目录

  • 目录
  • 前言
  • TensorFlow的基本库
  • 常用计算
    • 线性函数
    • 计算sigmoid函数
    • 计算损失函数
    • 独热编码
    • 初始化矩阵
  • TensorFlow创建神经网络
    • 创建模型
  • 参考资料

前言

在本章中,我们一起来学习下TensorFlow。我们将会学习到TensorFlow的一些基本库。通过计算一个线性函数来熟悉这些库。最后还学习使用TensorFlow搭建一个神经网络来识别手势。本章用到的一些库在这里下载

TensorFlow的基本库

首先是导入所需的库,其中最重要的库就是tensorflow的,我们给它一个别名tf。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math
import numpy as np
import h5py
import tensorflow as tf
from tensorflow.python.framework import ops
from tf_utils import load_dataset, random_mini_batches, convert_to_one_hot, predict

首先定义两个变量,对应是公式的y帽和y,如下,同时赋值y_hat是36,y是39:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_hat = tf.constant(36, name='y_hat')
y = tf.constant(39, name='y')

然后根据上面的公式1来定义创建一个计算,其中计算次方非常方便,直接两个星号**:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = tf.Variable((y - y_hat)**2, name='loss')

在使用TensorFlow之前,还要先初始化TensorFlow。在执行计算在session中完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(init)
    print(session.run(loss)) 

经过上面执行,最后输出计算的结果:9

我们通过上面可以看到,TensorFlow定义变量和赋值并不是像我们不同编程一样赋值的了,而是经过TensorFlow的封装,同样计算方式也是一样,如下定义常量和计算也是一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = tf.constant(2)
b = tf.constant(10)
c = tf.multiply(a,b)
print(c)

从上面计算loss可以知道,计算要在session中执行。所以我们这里不会输出结果20,而是输出c的张量:Tensor("Mul:0", shape=(), dtype=int32)

要计算它们的值,还有在session中run才行,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sess = tf.Session()
print(sess.run(c))

最后会输出正确的结果:20。

上面都是一开始就指定变量的值的,但是有些情况下,我们是一开始是不用指定值的,那么我们怎么处理了,这样就用到了占位符,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = tf.placeholder(tf.int64, name = 'x')
print(sess.run(2 * x, feed_dict = {x: 3}))
sess.close()

这里一开始我们没有指定x的值,而是在run的时候,使用一个feed_dict字典的方式给x赋值。

常用计算

线性函数

下面来介绍计算线性函数的方法,下面是线性函数的公式:

使用的的函数如下:

  • tf.matmul()做一个矩阵乘法
  • tf.add()做一个加法
  • np.random.randn()随机初始化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def linear_function():
	# 随机生成一个对应的张量
    X = tf.constant(np.random.randn(3,1), name = "X")
    W = tf.constant(np.random.randn(4,3), name = "W")
    b = tf.constant(np.random.randn(4,1), name = "b")
    # 生成线性函数
    Y = tf.add(tf.matmul(W, X), b)
    # 开始计算线性函数
    sess = tf.Session()
    result = sess.run(Y)
    # 如果没使用with的话,还要关闭session
    sess.close()
    return result

计算sigmoid函数

这是一个计算sigmoid函数,使用TensorFlow自带函数,无需自己定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def sigmoid(z):
    # 给x创建一个占位符,并指定类型
    x = tf.placeholder(tf.float32, name = "x")

    # 使用TensorFlow自带的sigmoid函数
    sigmoid = tf.sigmoid(x)

    with tf.Session() as sess:
        # 使用传进来的值计算
        result = sess.run(sigmoid, feed_dict = {x: z})
    
    return result

计算损失函数

可以通过直接调用tf.nn.sigmoid_cross_entropy_with_logits()函数定义完成损失函数的计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def cost(logits, labels):
	# 定义两个占位符
    z = tf.placeholder(tf.float32, name = "z")
    y = tf.placeholder(tf.float32, name = "y")
    
    # 使用TensorFlow自带函数计算交叉熵损失
    cost = tf.nn.sigmoid_cross_entropy_with_logits(logits = z,  labels = y)
    
    # 创建session
    sess = tf.Session()
    
    # 开始计算损失值
    cost = sess.run(cost, feed_dict = {z: logits, y: labels})
    
    # 关闭session
    sess.close
    
    return cost

独热编码

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。如下图所示:

在TensorFlow中可以使用tf.one_hot(标签,深度,轴)创建独热编码,使用TensorFlow如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def one_hot_matrix(labels, C):
    # 定义深度常量
    C = tf.constant(C, name = "C")
    
    # 创建独热编码矩阵
    one_hot_matrix = tf.one_hot(labels, C, axis = 0)
    
    # 创建Session
    sess = tf.Session()
    
    # 计算独热编码
    one_hot = sess.run(one_hot_matrix)
    
    # 关闭session
    sess.close
    
    return one_hot

我们测试一下,看看效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
labels = np.array([1,2,3,0,2,1])
# 4个深度,也就是4个类别
one_hot = one_hot_matrix(labels, C = 4)
print ("one_hot = " + str(one_hot))

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
one_hot = [[ 0.  0.  0.  1.  0.  0.]
		   [ 1.  0.  0.  0.  0.  1.]
		   [ 0.  1.  0.  0.  1.  0.]
		   [ 0.  0.  1.  0.  0.  0.]]

初始化矩阵

可以使用TensorFlow自带函数创建1矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def ones(shape):
    # 根据形状大小传1矩阵
    ones = tf.ones(shape)
    
    # 获取Session
    sess = tf.Session()
    
    # 在session中运行
    ones = sess.run(ones)
    
    # 关闭session
    sess.close
    
    return ones

TensorFlow创建神经网络

使用TensorFlow创建一个神经网络,来识别手势。我们可以使用独热编码当做图像的标签。

首先是加载数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

对数据进行扁平化和归一化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 训练和测试图像
X_train_flatten = X_train_orig.reshape(X_train_orig.shape[0], -1).T
X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0], -1).T
# 归一化图像向量
X_train = X_train_flatten/255.
X_test = X_test_flatten/255.
# 将训练和测试标签转换为独热矩阵
Y_train = convert_to_one_hot(Y_train_orig, 6)
Y_test = convert_to_one_hot(Y_test_orig, 6)

为输入数据和输出结果定义一个占位符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def create_placeholders(n_x, n_y):
	# 输入数据占位符
    X = tf.placeholder(dtype=tf.float32,shape=(n_x, None), name = "Placeholder_1")
    # 输出数据占位符
    Y = tf.placeholder(dtype=tf.float32,shape=(n_y, None), name = "Placeholder_2")
    
    return X, Y

初始化参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def initialize_parameters():
	# 初始化权重和偏置值
    W1 = tf.get_variable("W1", [25,12288], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b1 = tf.get_variable("b1", [25,1], initializer = tf.zeros_initializer())
    W2 = tf.get_variable("W2", [12,25], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b2 = tf.get_variable("b2", [12,1], initializer = tf.zeros_initializer())
    W3 = tf.get_variable("W3", [6,12], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b3 = tf.get_variable("b3", [6,1], initializer = tf.zeros_initializer())

    parameters = {"W1": W1,
                  "b1": b1,
                  "W2": W2,
                  "b2": b2,
                  "W3": W3,
                  "b3": b3}
    
    return parameters

计算正向传播:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def forward_propagation(X, parameters):
	# 获取权重和偏差值
    W1 = parameters['W1']
    b1 = parameters['b1']
    W2 = parameters['W2']
    b2 = parameters['b2']
    W3 = parameters['W3']
    b3 = parameters['b3']
    
    # 相当于 Z1 = np.dot(W1, X) + b1
    Z1 = tf.add(tf.matmul(W1, X), b1)
    
    # 计算RELU A1 = relu(Z1)
    A1 = tf.nn.relu(Z1)
    
    # 相当于 Z2 = np.dot(W2, a1) + b2
    Z2 = tf.add(tf.matmul(W2, A1), b2)
    
    # 计算RELU A2 = relu(Z2)
    A2 = tf.nn.relu(Z2)
    
    # 相当于 Z3 = np.dot(W3,Z2) + b3
    Z3 = tf.add(tf.matmul(W3, A2), b3)
    
    return Z3

计算损失:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def compute_cost(Z3, Y):
    # 转置,为下面计算计算损失做准备
    logits = tf.transpose(Z3)
    labels = tf.transpose(Y)
    
    # 传入的值是数据和标签
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels))
    
    return cost

计算反向传播和更新参数,使用框架的话,只要使用下面两行代码就可以了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)

_ , c = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})

创建模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001,
          num_epochs = 1500, minibatch_size = 32, print_cost = True):
    """
    3层神经网络: LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX.
    
    Arguments:
    X_train -- 训练数据集,输入大小为12288,输入数量为1080
    Y_train -- 训练标签,输入大小为6,输入数量为1080
    X_test -- 训练数据集,输入大小为12288,输入数量为120
    Y_test -- 训练标签,输入大小为6,输入数量为120
    learning_rate -- 学习速率的优化
    num_epochs -- 优化循环的周期数
    minibatch_size -- minibatch大小
    print_cost --100个pass就打印成本
    
    Returns:
    parameters -- 由模型学习的参数。他们可以被用来预测。
    """
    
    ops.reset_default_graph()
    tf.set_random_seed(1)
    seed = 3
    # n_x:输入大小,m:数据集样本
    (n_x, m) = X_train.shape
    # 输出大小
    n_y = Y_train.shape[0]
    costs = []
    
    # 创建输入输出占位符
    X, Y = create_placeholders(n_x, n_y)

    # 初始化参数
    parameters = initialize_parameters()
    
    # 计算正向传播
    Z3 = forward_propagation(X, parameters)
    
    # 计算损失值
    cost = compute_cost(Z3, Y)
    
    # 反向传播,定义优化方法吗,使员工Adam作为优化器
    optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)
    
    # 初始化所有的变量
    init = tf.global_variables_initializer()

    # 在Session中计算
    with tf.Session() as sess:
        
        # 运行初始化
        sess.run(init)
        
        # 在循环中训练
        for epoch in range(num_epochs):

            epoch_cost = 0.
	        # 计算小批量的数量
            num_minibatches = int(m / minibatch_size)
            seed = seed + 1
            minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)

            for minibatch in minibatches:

                # 把每个批量的数据拆分
                (minibatch_X, minibatch_Y) = minibatch
                
                # 在session中运行优化器和Cost
                _ , minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})
                
                epoch_cost += minibatch_cost / num_minibatches

            # 打印cost
            if print_cost == True and epoch % 100 == 0:
                print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
            if print_cost == True and epoch % 5 == 0:
                costs.append(epoch_cost)

        # 参数保存在一个变量中
        parameters = sess.run(parameters)
        print ("Parameters have been trained!")

        # 计算正确的预测
        correct_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y))

        # 计算测试集的准确性。
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

        print ("Train Accuracy:", accuracy.eval({X: X_train, Y: Y_train}))
        print ("Test Accuracy:", accuracy.eval({X: X_test, Y: Y_test}))
        
        return parameters

最后通过调用该函数即可完成训练:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameters = model(X_train, Y_train, X_test, Y_test)

预测,训练好的参数就可以用来预测了,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scipy
from PIL import Image
from scipy import ndimage

my_image = "thumbs_up.jpg"

# 预先处理图像以适应的算法
fname = "images/" + my_image
image = np.array(ndimage.imread(fname, flatten=False))
my_image = scipy.misc.imresize(image, size=(64,64)).reshape((1, 64*64*3)).T
my_image_prediction = predict(my_image, parameters)

print("Your algorithm predicts: y = " + str(np.squeeze(my_image_prediction)))

参考资料

http://deeplearning.ai/

该笔记是学习吴恩达老师的课程写的。初学者入门,如有理解有误的,欢迎批评指正!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/05/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow实践——Multilayer Perceptron
本文是在Softmax Regression的基础上增加了一个隐含层,实现了Multilayer Perceptron的一个模型,Multilayer Perceptron是深度学习模型的基础,对于Softmax Regression的TensorFlow实现,可以参见博文“TensorFlow实践——Softmax Regression”。对于Multilayer Perceptron的基本原理,可以参见以下的文章:
felixzhao
2019/01/31
4910
TensorFlow实践——Multilayer Perceptron
TensorFlow_Tutorial_v3b——improving NN performance测验
Welcome to this week's programming assignment. Until now, you've always used numpy to build neural networks. Now we will step you through a deep learning framework that will allow you to build neural networks more easily. Machine learning frameworks like TensorFlow, PaddlePaddle, Torch, Caffe, Keras, and many others can speed up your machine learning development significantly. All of these frameworks also have a lot of documentation, which you should feel free to read. In this assignment, you will learn to do the following in TensorFlow:
列夫托尔斯昊
2020/08/25
1.4K0
TensorFlow_Tutorial_v3b——improving NN performance测验
改善深层神经网络 - 第二课第三周作业 TensorFlow Tutorial
Welcome to this week’s programming assignment. Until now, you’ve always used numpy to build neural networks. Now we will step you through a deep learning framework that will allow you to build neural networks more easily. Machine learning frameworks like TensorFlow, PaddlePaddle, Torch, Caffe, Keras, and many others can speed up your machine learning development significantly. All of these frameworks also have a lot of documentation, which you should feel free to read. In this assignment, you will learn to do the following in TensorFlow:
Steve Wang
2019/05/29
2.2K0
02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架(作业:TensorFlow教程+数字手势预测)
笔记:02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
Michael阿明
2021/02/19
9290
卷积神经网络 第一周作业 Convolution+model+-+Application+-+v1
Welcome to Course 4’s second assignment! In this notebook, you will:
Steve Wang
2019/05/29
1.2K0
TensorFlow基础入门
到目前为止,您一直使用numpy来构建神经网络。现在我们将引导您使用一个深度学习框架,让您可以更轻松地构建神经网络。TensorFlow、PaddlePaddle、Torch、Caffe、Keras等机器学习框架可显著加速机器学习开发。在此作业中,您将学习在TensorFlow中执行以下操作:
云水木石
2019/07/01
1.7K0
TensorFlow基础入门
Convolution_model_Application_v1a
Welcome to Course 4's second assignment! In this notebook, you will:
列夫托尔斯昊
2020/08/25
1.7K0
Convolution_model_Application_v1a
【DL笔记5】一文上手TensorFlow,并搭建神经网络实现手写数字识别
从【DL笔记1】到【DL笔记N】,是我学习深度学习一路上的点点滴滴的记录,是从Coursera网课、各大博客、论文的学习以及自己的实践中总结而来。从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现自己的小而有趣的想法......我相信,一路看下来,我们可以感受到深度学习的无穷的乐趣,并有兴趣和激情继续钻研学习。 正所谓 Learning by teaching,写下一篇篇笔记的同时,我也收获了更多深刻的体会,希望大家可以和我一同进步,共同享受AI无穷的乐趣。
beyondGuo
2018/10/25
7930
【DL笔记5】一文上手TensorFlow,并搭建神经网络实现手写数字识别
04.卷积神经网络 W1.卷积神经网络(作业:手动/TensorFlow 实现卷积神经网络)
0 padding 会在图片周围填充 0 元素(下图 p = 2 p=2 p=2 )
Michael阿明
2021/02/19
9690
tensorflow mnist神经网络示例
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/79704120
bear_fish
2018/09/14
8180
tensorflow mnist神经网络示例
tensorflow入门:Softmax Classication
Softmax用于多元分类,同logistic regression一样使用cross entropy作为损失函数,其原理不再赘述。
Steve Wang
2019/05/26
3190
Tensorflow快速入门
作者:叶 虎 编辑:李文臣 PART 01 Tensorflow简介 引言 实践深度学习肯定要至少学习并掌握一个深度学习框架。这里我们介绍一个最流行的深度学习框架:Tensorflow。Tensorf
机器学习算法工程师
2018/03/06
1.1K0
Tensorflow快速入门
深入浅出解读卷积神经网络
作者:石文华 编辑:田 旭 卷积神经网络 图1 全连接神经网络结构图 图2 卷积神经网络结构图 卷积神经网络和全连接的神经网络结构上的差异还是比较大的,全连接的网络,相邻两层的节点都有边相连,而卷积神
机器学习算法工程师
2018/03/06
7060
深入浅出解读卷积神经网络
三天速成 TensorFlow课件分享
该教程第一天先介绍了深度学习和机器学习的潜力与基本概念,而后便开始探讨深度学习框架 TensorFlow。首先我们将学到如何安装 TensorFlow,其实我们感觉 TensorFlow 环境配置还是相当便捷的,基本上按照官网的教程就能完成安装。随后就从「Hello TensorFlow」开始依次讲解计算图、占位符、张量等基本概念。
刘盼
2018/03/16
2K0
三天速成 TensorFlow课件分享
TensorFlow入门——Softmax Regression
下面的代码是利用TensorFlow实现的Softmax Regression的基本过程: ''' @author:zhaozhiyong @date:20170822 Softmax Regression ''' import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("./MNIST_data", one_hot=True
felixzhao
2018/04/23
4470
TensorFlow入门——Softmax Regression
简单的TensorFlow分类教程
本篇文章有2个topic,简单的分类器和TensorFlow。首先,我们会编写函数生成三种类别的模拟数据。第一组数据是线性可分的,第二种是数据是月牙形数据咬合在一起,第三种是土星环形数据。每组数据有两个类型,我们将分别建立模型,对每组数据分类。
用户1332428
2018/07/30
5400
简单的TensorFlow分类教程
机器之心GitHub项目:从零开始用TensorFlow搭建卷积神经网络
机器之心原创 参与:蒋思源 机器之心基于 Ahmet Taspinar 的博文使用 TensorFlow 手动搭建卷积神经网络,并提供所有代码和注释的 Jupyter Notebook 文档。我们将不仅描述训练情况,同时还将提供各种背景知识和分析。所有的代码和运行结果都已上传至 Github,机器之心希望通过我们的试验提供精确的代码和运行经验,我们将持续试验这一类高质量的教程和代码。 机器之心项目地址:https://github.com/jiqizhixin/ML-Tutorial-Experiment
机器之心
2018/05/08
1.5K0
机器之心GitHub项目:从零开始用TensorFlow搭建卷积神经网络
一看就懂的Tensorflow实战(模型的保存与读取)
首先,我们从一个直观的例子,讲解如何实现Tensorflow模型参数的保存以及保存后模型的读取。 然后,我们在之前多层感知机的基础上进行模型的参数保存,以及参数的读取。该项技术可以用于Tensorflow分段训练模型以及对经典模型进行fine tuning(微调)
AI异构
2020/07/29
8270
tensorflow入门:Neural Network for mnist
我们使用tensorflow实现类似于上图的简单深度网络,用于mnist数据集预测模型的实现。理论方面不再赘述。
Steve Wang
2019/05/26
4890
CNN卷积神经网络之通俗理解!
简而言之,卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家Yann LeCun,目前在Facebook工作,他是第一个通过卷积神经网络在MNIST数据集上解决手写数字问题的人。
智能算法
2019/07/12
1.8K0
CNN卷积神经网络之通俗理解!
推荐阅读
相关推荐
TensorFlow实践——Multilayer Perceptron
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档