使用tensorflow搭建深层神经网络

article/2025/4/30 5:23:42

6在吴恩达老师的《深度学习》第二课第三周的课程中,提及到了多种深度学习框架,包括caffe/caffe2,CNTK,DL4J,Keras,Lasagne,mxnet,paddlepadle,tensorflow,Theano,Torch等等,虽然Andrew说不特别推荐某种框架,但因其在谷歌多年的经历在之后的练习中终究还是使用tensorflow框架。下面我们跟着达叔的思路一步一步构建深层神经网络。

程序所需的库文件如下

import math
import numpy as np
import h5py
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.python.framework import ops
from tf_utils import *np.random.seed(1)

tf_utils是吴恩达老师给出的辅助程序,可在这里获取。

一、牛刀小试

1.tensorflow程序执行的步骤

我们先使用tensorflow来对一个简单的损失函数进行计算,Loss公式如下:


y_hat = tf.constant(36, name='y_hat')#创建常数张量,传入数值或者list来填充
y = tf.constant(39, name='y')loss = tf.Variable((y - y_hat)**2, name='loss')#创建变量lossinit = tf.global_variables_initializer()with tf.Session() as session:session.run(init)print(session.run(loss))

测试程序中设y_hat=36,y=39,运行程序结果为:

9

从上述的测试程序中,我们可以了解到tensorflow运行的几个步骤

(1)创建张量tensor(常量或变量);

(2)定义张量之间的运算operations;

(3)初始化*;

(4)创建会话Session*;

(5)在会话中运行操作*。

标*的操作步骤为重要步骤。

2. placeholder的使用

在tf中placeholder是可以稍后赋值的对象,之后在执行session时可通过feed_dict来给placeholder传递值。

x = tf.placeholder(tf.int64, name='x')
with tf.Session() as sess:print(sess.run(2 * x, feed_dict = {x: 3}))sess.close()

3.线性函数

我们计算线性函数 Y = WX + b,其中W是(4,3)矩阵,X是(3,1)向量,b是(4,1)向量。

实现代码如下

def linear_function():np.random.seed(1)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)sess.close()return result
print("Result = " + str(linear_function()))
Result = [[-2.15657382][ 2.95891446][-1.08926781][-0.84538042]]

4.计算sigmoid

Tensorflow提供了很多神经网络常用的函数,可以直接调用使用,比如sigmoid,softmax,调用方法分别为tf.sigmoid()和tf.softmax,方便开发人员使用。

def sigmoid(z):x = tf.placeholder(tf.float32, name = "x")sigmoid = tf.sigmoid(x)with tf.Session() as sess:result = sess.run(sigmoid, feed_dict = {x:z})sess.close()return result
print("sigmoid(0) =" + str(sigmoid(0)))
print("sigmoid(12) =" + str(sigmoid(12)))
sigmoid(0) =0.5
sigmoid(12) =0.9999938

5.计算cost

cost的计算公式为


在之前的计算中我们需要使用对i,从1一直算到m,而在Tensorflow框架下,仅需一行代码就可实现这个公式。

def cost(logits, labels):z = tf.placeholder(tf.float32, name = "z")y = tf.placeholder(tf.float32, name = "y")cost = tf.nn.sigmoid_cross_entropy_with_logits(logits = z, labels = y)sess = tf.Session()cost = sess.run(cost, feed_dict = {z:logits, y:labels})sess.close()return cost
logits = sigmoid(np.array([0.2,0.4,0.7,0.9]))
cost = cost(logits, np.array([0,0,1,1]))
print ("cost = " + str(cost))
cost = [1.0053872  1.0366408  0.41385433 0.39956617]

6."one_hot"转换

对于多分类问题,我们需要将输出值转化为(C, m)矩阵,如下图;


如果使用numpy来实现需要多行代码才能够实现,而在Tensorflow框架下只需要一行代码即可。

def one_hot_matrix(labels, C):C = tf.constant(value = C, name = "C")one_hot_matrix = tf.one_hot(labels, C, axis = 0)sess = tf.Session()one_hot = sess.run(one_hot_matrix)sess.close()return one_hot
labels = np.array([1,2,3,0,2,1])
one_hot = one_hot_matrix(labels, C = 4)
print("one_hot = " +'\n'+ str(one_hot))
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搭建神经网络

看过达叔教程的同学一定会实现神经网络的步骤比较熟悉,下面我们一起跟着达叔的思路用Tensorflow重新搭建一遍深层神经网络。由于之前已经写了多篇关于实现神经网络的文章,在本文中就不再详细描述了。

1.数据处理

达叔在此提供了一个有趣的数据集--手势数字集,如下图。


完整数据集点击此处下载。

X_train_orig, Y_train_orig,X_test_orig, Y_test_orig, classes = load_dataset()
index = 0
plt.imshow(X_train_orig[index])
print("y=" + str(np.squeeze(Y_train_orig[:,index])))

显示的图片为


打印的标签是

y= 5

通常导入数据后还要进行flatten、标准化、one-hot处理

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).TX_train = X_train_flatten /255
X_test = X_test_flatten /255Y_train = convert_to_one_hot(Y_train_orig, C = 6)
Y_test = convert_to_one_hot(Y_test_orig, C = 6)print ("number of training examples = " + str(X_train.shape[1]))
print ("number of test examples = " + str(X_test.shape[1]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
number of training examples = 1080
number of test examples = 120
X_train shape: (12288, 1080)
Y_train shape: (6, 1080)
X_test shape: (12288, 120)
Y_test shape: (6, 120)

在上述程序中,用到了convert_to_one_hot函数

def convert_to_one_hot(Y, C):Y = np.eye(C)[Y.reshape(-1)].Treturn Y

很巧妙的使用了矩阵的特性来实现one-hot变换。提示:np.array((3,4))[1] -> 输出为该矩阵的第2行

2.创建placeholders

为了后续传入训练数据,我们需要先创建X和Y的占位符。

def create_placeholder(n_x, n_y):X = tf.placeholder(tf.float32, shape = [n_x, None])Y = tf.placeholder(tf.float32, shape = [n_y, None])return X, Y
X, Y = create_placeholder(12288, 6)
print("X = " + str(X))
print("Y = " + str(Y))
X = Tensor("Placeholder:0", shape=(12288, ?), dtype=float32)
Y = Tensor("Placeholder_1:0", shape=(6, ?), dtype=float32)
3.参数初始化

我们使用Tensorflow来初始化参数W和b

def initialize_parameters():tf.set_random_seed(1)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
with tf.Session() as sess:parameters = initialize_parameters()print("W1 = " + str(parameters["W1"]))print("b1 = " + str(parameters["b1"]))print("W2 = " + str(parameters["W2"]))print("b2 = " + str(parameters["b2"]))
W1 = <tf.Variable 'W1:0' shape=(25, 12288) dtype=float32_ref>
b1 = <tf.Variable 'b1:0' shape=(25, 1) dtype=float32_ref>
W2 = <tf.Variable 'W2:0' shape=(12, 25) dtype=float32_ref>
b2 = <tf.Variable 'b2:0' shape=(12, 1) dtype=float32_ref>

4.前向传播

def forward_propagation(X, parameters):W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2']W3 = parameters['W3']b3 = parameters['b3']Z1 = tf.add(tf.matmul(W1, X), b1)A1 = tf.nn.relu(Z1)Z2 = tf.add(tf.matmul(W2, A1), b2)A2 = tf.nn.relu(Z2)Z3 = tf.add(tf.matmul(W3, A2), b3)return Z3
由于使用Tensorflow框架会自动进行反向传播的一些操作,因此在前向传播中我们不需要计算A3,也不需要返回cache。
tf.reset_default_graph()
with tf.Session() as sess:X, Y = create_placeholder(12288, 6)parameters = initialize_parameters()Z3 = forward_propagation(X, parameters)print("Z3 =", Z3)
Z3 = Tensor("Add_2:0", shape=(6, ?), dtype=float32)

5.计算cost

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
tf.reset_default_graph()
with tf.Session() as sess:X, Y = create_placeholder(12288, 6)parameters = initialize_parameters()Z3 = forward_propagation(X, parameters)cost = compute_cost(Z3, Y)print("cost =", cost)
cost = Tensor("Mean:0", shape=(), dtype=float32)

6.反向传播及参数更新

由于使用深度学习框架,我们可以把反向传播和参数更新浓缩成一行代码,且很容易整合到模型中。在计算完cost函数后,我们需要创建一个“optimizer”对象,以便执行给定梯度下降的方法和学习率

optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)

使该优化生效,在sess.run中需要做下述处理。

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

注:"_"为丢弃变量的标识符,在此我们只需sess.run()返回的cost值因此使用c来接收返回值,optimizer的值无需使用因此使用"_"来接收。

7.构建模型

现在我们将上述的函数整合到一起构建一个基于Tensorflow的神经网络模型。

def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001,num_epochs = 1500, minibatch_size = 32, print_cost = True):ops.reset_default_graph()tf.set_random_seed(1)seed = 3(n_x, m) = X_train.shapen_y = Y_train.shape[0]costs = []X, Y = create_placeholder(n_x, n_y)parameters = initialize_parameters()Z3 = forward_propagation(X, parameters)cost = compute_cost(Z3, Y)optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost)init = tf.global_variables_initializer()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 + 1minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)for minibatch in minibatches:(minibatch_X, minibatch_Y) = minibatch_ , minibatch_cost = sess.run([optimizer, cost], feed_dict = {X: minibatch_X, Y:minibatch_Y})epoch_cost += minibatch_cost / num_minibatchesif print_cost and epoch % 100 == 0:print("Cost after epoch %i: %f" %(epoch, epoch_cost))if print_cost and epoch % 5 == 0:costs.append(epoch_cost)plt.plot(np.squeeze(costs))plt.xlabel("iterations (per five)")plt.ylabel("cost")plt.title("learning_rate:" + str(learning_rate))plt.show()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 Accuray:", accuracy.eval({X: X_train, Y: Y_train}))print("Test Accuray:", accuracy.eval({X: X_test, Y: Y_test}))return parameters

程序在执行时需要一定时间,大家注意下如果在epoch 100时cost值不是1.016458,可以停止程序查找问题不必要浪费时间。

parameters = model(X_train, Y_train, X_test, Y_test)
Cost after epoch 0: 1.855702
Cost after epoch 100: 1.016458
Cost after epoch 200: 0.733102
Cost after epoch 300: 0.572938
Cost after epoch 400: 0.468799
Cost after epoch 500: 0.380979
Cost after epoch 600: 0.313819
Cost after epoch 700: 0.254258
Cost after epoch 800: 0.203795
Cost after epoch 900: 0.166410
Cost after epoch 1000: 0.141497
Cost after epoch 1100: 0.107579
Cost after epoch 1200: 0.086229
Cost after epoch 1300: 0.059415
Cost after epoch 1400: 0.052237

Parameters have been trained!
Train Accuray: 0.9990741
Test Accuray: 0.71666664
以上我们完成的基于Tensorflow框架的神经网络,并使用这个模型对手势数字集进行了学习,虽然有些过拟合但是毕竟我们完成了自己的第一Tensorflow神经网络模型。

三、图片预测

在完成了模型搭建的任务之后,我们来测试一下自己的手势图片,如下图。

我们将该图片进行一些处理转化成64*64*3格式以便测试。

my_image = "myfigure.jpg"
fname = "images\\" + my_imageimage = 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)plt.imshow(image)
print("your algorithm predicts : y=" + str(np.squeeze(my_image_prediction)))
your algorithm predicts : y=4
预测结果为4,看来模型还是需要提高。

四、总结

1.Tensorflow是深度学习的框架,其最重要的两个类是Tensor和Operaters

2.在框架下编程时要注意在第一节中的步骤

3.graph可以多次执行

4.反向传播和优化过程是框架自动完成




http://chatgpt.dhexx.cn/article/0Unbhsir.shtml

相关文章

[Deeplearning4j应用教程02]_DL4J环境搭建教程-Windows版

Windows下DL4J环境搭建教程 一、DL4J简介二、Windows下DL4J环境搭建三、安装JDK1.1、JDK简介1.2、JDK下载安装1.3、安装JDK1.3.1、环境变量配置 四、安装Intellij idea五、Maven Apache安装六、在IDEA中配置Maven七、安装Git八、获取DL4J示例代码九、在IDEA中导入项目并运行 一…

DL4J源码分析

目录 源码目录&#xff08;部分&#xff09; NDArray 工作间 DL4J的层工作间管理器 沿维张量&#xff08;TAD&#xff09; 反向减法 源码目录&#xff08;部分&#xff09; DeepLearning4J: 包含用于既在单个机器上&#xff0c;又在分布式上学习神经网络的所有代码。 N…

DL4J实战之四:经典卷积实例(GPU版本)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《DL4J实战》的第四篇&#xff0c;今天咱们不写代码&#xff0c;而是为今后的实战做些准备&#xff1a;在DL4J框架下用GPU加速深度学习的训练过…

DL4J实战之三:经典卷积实例(LeNet-5)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《DL4J》实战的第三篇&#xff0c;目标是在DL4J框架下创建经典的LeNet-5卷积神经网络模型&#xff0c;对MNIST数据集进行训练和测试&#xff0…

DL4J实战之二:鸢尾花分类

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《DL4J》实战的第二篇&#xff0c;前面做好了准备工作&#xff0c;接下来进入正式实战&#xff0c;本篇内容是经典的入门例子&#xff1a;鸢…

DL4J实战之一:准备

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于DL4J DL4J是Deeplearning4j的简称&#xff0c;是基于Java虚拟机的深度学习框架&#xff0c;是用java和scala开发的&#xff0c;已开源&#xff0c;官网&…

【DL4J】基本操作_学习笔记(二)

DL4J基本操作 文章目录 DL4J基本操作1. 创建矩阵2. 矩阵元素读取3. 矩阵行元素读取4. 矩阵运算 导入依赖 <nd4j.version>1.0.0-beta2</nd4j.version><dependency><groupId>org.nd4j</groupId><artifactId>nd4j-native-platform</artifa…

【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

文章首发于微信公众号《有三AI》 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试 欢迎来到专栏《2小时玩转开源框架系列》&#xff0c;这是我们第九篇&#xff0c;前面已经说过了caffe&#xff0c;tensorflow&#xff0c;pytorch&#xff0c;mxnet&#xff0c;keras&…

深度学习框架DeepLearning4J(DL4J)的安装及配置

一、DeepLearning4J的简介和系统要求 1、DeepLearning4J简介 Deeplearning4J&#xff08;以下简称DL4J&#xff09;不是第一个开源的深度学习项目&#xff0c;但与此前的其他项目相比&#xff0c;DL4J在编程语言和宗旨两方面都独具特色。DL4J是基于JVM、聚焦行业应用且提供商…

适合中学生看的英文电影

怎样利用好丰富的资源来学习英语口语呢&#xff1f;其实其实看什么样的剧、如何看剧都是很讲究的。一起来解锁吧。 一、选剧要学会拆解自己学习目标&#xff0c;选定合适的类型&#xff0c;各取所需。 并不是所有类型的国外影视剧都适合作为学习的素材&#xff0c;主要依据自身…

springboot+mybatis实现简单的增、删、查、改

这篇文章主要针对java初学者&#xff0c;详细介绍怎么创建一个基本的springboot项目来对数据库进行crud操作。 目录 第一步&#xff1a;准备数据库 第二步&#xff1a;创建springboot项目 方法1&#xff1a;通过spring官网的spring initilizer创建springboot项目 方法2&am…

tk-mybatis使用介绍,springboot整合tk-mybatis、PageHelper实现分页查询

Mybatis-Plus极大简化了我们的开发&#xff0c;作为mybatis的增强版&#xff0c;Mybatis-Plus确实帮我们减少了很多SQL语句的编写&#xff0c;通过其提高的API&#xff0c;可以方便快捷第完成增删查改操作。但是&#xff0c;其实除了Mybatis-Plus以外&#xff0c;还有一个技术t…

SXSW 2022线下展回归,今年有哪些有趣的AR/VR内容?

如今海外的线下活动开始逐渐恢复&#xff0c;今年的SXSW活动也回归线下。与往年相比&#xff0c;这场艺术、音乐、电影的年度盛会在今年进一步融合新兴科技&#xff0c;比如将AR/VR与线下活动结合&#xff0c;带来了更多样化的娱乐应用场景。 那么今年活动上都有哪些看点&#…

UE4 Ultra Dynamic Sky 参数翻译及功能概述

Ultra Dynamic Sky的虚幻商城链接: Ultra Dynamic Sky Ultra_Dynamic_Sky翻译及功能概述 basic controls 基础控制 Refresh Settings 刷新设置 检查此布尔一次&#xff0c;以刷新所有设置&#xff1b; Time Of Day 一天中的时间 一天中天空模仿的时间&#xff0c;从0000到…

更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加720P种子...

高清下载!1.25G 附加720P种子" title="更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加720P种子"> 高清下载!1.25G 附加720P种子" title="更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加…

2019年如何成为一名合格的数据分析师

我是CPDA数据分析师 我是CDA数据分析员 我从事数据分析相关工作 我是个数据分析的小白 我想转行做数据分析 今天我围绕如何成为合格的数据分析师跟大家分享三个小话题: 找到在数据分析领域的定位 数据分析思维的训练 数据分析领域发展方向 一、找准数据分析师的定位 …

感谢折磨你的人[三]

第38节 肯定自己才能看见成功 美国联合保险公司董事长克里蒙史东说&#xff1a;“真正的成功秘诀是‘肯定人生’四个字&#xff0c;如果你能以坚定而乐观的态度&#xff0c;去面对一切困难险阻&#xff0c;那么&#xff0c;你一定能从其中得到好处。” 不要抱怨周遭人、事、物对…

舒淇放下黎明战胜抑郁 自称没责任感且不会结婚q1h

舒淇入行至今&#xff0c;最令人印象深入的恋情&#xff0c;要数与黎明的7年情&#xff0c;有传二人当年因黎明父亲及影迷反对而分手&#xff0c;有一段时光&#xff0c;舒淇更患上抑郁症&#xff01;舒淇日前接收拜访时&#xff0c;被问到若心境愁闷会如何面对&#xff0c;她说…

PS4计算机模块试题,越玩越留恋的PS4独占大作,馋坏了PC玩家,纷纷加入主机行列...

PS4游戏主机是发烧级玩家必有的装备&#xff0c;它的游戏性能远远大于电脑&#xff0c;对于任何的游戏软件优化很强&#xff0c;几乎很少出现卡顿和缺陷&#xff0c;因为它就是为游戏而生&#xff0c;各种游戏也是为主机固件量身定做&#xff0c;那么这个强大的游戏平台&#x…

ES6 课堂笔记

ES6 第一章 ECMASript 相关介绍 1.1 什么是 ECMA ECMA&#xff08;European Computer Manufacturers Association&#xff09;中文名称为欧洲计算机制造商协会&#xff0c;这个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际。 1.2 什么是…