吴恩达 DeepLearning 第二课第三周编程课后作业原版本使用tensorflow1.X编写,此笔记仅为改写1.X版本代码到2.X版本使用(任然使用1.X版本的静态计算图)
1.导入所需要的库
import numpy as np
import h5py
import matplotlib.pyplot as plt
import tensorflow as tf
import math
from tensorflow.python.framework import ops
from tf_utils import load_dataset, random_mini_batches, convert_to_one_hot, predict
2.tensorflow1.X版本执行步骤
对于1.X版本的静态计算图而言需要分两步,第一步定义计算图,第二部在会话中执行计算图。
对于Tensorflow的代码实现而言,实现代码的结构如下:
(1).定义计算图:
创建Tensorflow张量(此时,尚未直接计算)
实现Tensorflow张量之间的操作定义
初始化Tensorflow张量
(2).执行计算图:
创建Session
运行Session
执行计算图方式 1:
sess = tf.compat.v1.Session() #创建Session
result = sess.run(...) #运行Session
sess.close() #使用后需要关闭Session
执行计算图方式 2:
with tf.compat.v1.Session() as session: #创建Session
session.run(init) #运行变量初始化(如果需要)
result = sess.run(...) #运行Session
例:使用静态计算图计算loss
# 创建Tensorflow张量y_hat,y分别为常数(此时,尚未直接计算),可定义dtype=数据类型(可选)
y_hat = tf.constant(36)
y = tf.constant(39)
#实现Tensorflow张量之间的操作来定义loss的值
loss = tf.Variable((y - y_hat)**2) #tf.Variable(初始值) 将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息,常用于定义W和b
tf.compat.v1.disable_eager_execution() # 在2.X版本保证session.run()能够正常运行
init = tf.compat.v1.global_variables_initializer() #定义初始化Tensorflow张量
#执行计算图
with tf.compat.v1.Session () as session: #创建Session
session.run(init) # 运行初始化张量
print(session.run(loss)) # 运行得到loss的值
#最终结果为(39-36)的平方,为9
在例子中如果没有执行计算图就直接输出loss,会得到Tensorflow的可训练的张量,不会得到数值9.
3.创建占位符:tf.compat.v1.placeholder(shape=[x,y],dtype=dtype)
因为在tf1.X版本中需要使用session来执行计算图,需要使用占位符来替代网络的输入X,以便在session中再为其赋具体值,而在tf2.X版本就不需要使用。
sess = tf.compat.v1.Session () #创建Session
x = tf.compat.v1.placeholder(tf.int64)#定义占位符
print(sess.run(2 * x, feed_dict = {x: 2}))#使用字典feed_dict,将x赋值2
sess.close()
4.计算成本:
计算成本多使用以下公式:
而在tf2.X使用 tf.nn.sigmoid_cross_entropy_with_logits(logits = a, labels = y)命令来完成输入z,计算a=sigmoid(z),计算成本的全过程。该函数输入预测值a以及标签值y,输出张量Tensor("logistic_loss:0", dtype=),需要使用session来运行得到具体值。
5.独热码的转换:tf.one_hot(待转换数据,depth=几分类,axis=)
在分类问题中,用独热码,即one_hot做标签,‘1’表示是,‘0’表示非,将待转换数据,转换为one_hot形式的张量(Tensor("one_hot_18:0", shape=, dtype=))进行输出,需要使用session来运行得到具体值。axis=0和1影响最终矩阵维度。
def one_hot_matrix(labels, C):
"""
定义:
labels -- 需要转化的标签
C -- 分类数目
整个函数返回值: 独热码矩阵
"""
# 转化独热码
one_hot_matrix = tf.one_hot(labels,C,axis=1)
# 运行Session,使得返回值为矩阵而非张量
sess = tf.compat.v1.Session()
one_hot = sess.run(one_hot_matrix)
sess.close()
return one_hot