Tensorflow入门(三)之基础函数第二篇

我也是一个边学边记录的过程,所以建议在开始这一篇的学习之前,先翻翻前两篇博客巩固复盘一下。

1)求导计算
在学习求导计算前,首先学习python中的with语句,with语句使用了上下文管理器,也就是若在with后的expression中是打开一个文件并对文件进行操作,那么在with结构中就不需要再加入关闭文件的语句了,with语句会根据上下文自动执行关闭文件操作。
实际就是实现了下面这样的类:

class transaction(object):
    def __init__(self, db):
        self.db = db

    def __enter__(self):
        self.db.begin()

    def __exit__(self, type, value, traceback):
        if type is None:
            db.commit()
        else:
            db.rollback()

在写了with语句后,如下

with open('file.txt') as f:
    content = f.read()

上述函数的执行过程为:首先初始化transaction对象init,然后打开文件读取enter,最后关闭文件exit
下面使用with结构进行导数求导运算:

import tensorflow as tf

with tf.GradientTape as tape:
    w = tf.Variable(tf.constant(3.0))
    loss = tf.pow(w,2)
grad = tape.gradient(loss,w)
print(grad)

运行结果如下:

tf.Tensor(6.0, shape=(), dtype=float32)

注:若此时有报错,则可尝试在第一行加入

tf.enable_eager_execution()

这里,with结构记录计算过程,gradient函数求出张量梯度
伪代码如下:

with tf.GradientTape as tape:
	//计算过程
grad = tf.gradient(函数,对谁求导)

2)枚举

fruit = ['apple','orange','peach']
for i,element in enumerate(fruit):
	print(i,element)

(用java比较熟练,但python是真不熟悉语法,太灵活了,不过别急,一点一点熟悉吧)

3)独热编码
至于什么是独热编码,这里贴一段百度百科的定义,解释地很清楚了

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

换句话说,就是有几个状态,就有几位,是哪个状态,哪一位就是1,其余状态均为0.
tf.one_hot(待转换数据,depth = 几分类)请看下面的例子:

import tensorflow as tf

classes = 3
labels = tf.constant([0, 1, 2])
output = tf.one_hot(labels, depth = classes)
print(output)
print('\n')

此时的输出结果为:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

注意:和我们传统的二进制或者十进制编码不同,独热编码是从最高位开始变化1的,所以从上面的例子可以看到,0的独热编码为[1, 0, 0],而2的独热编码为[0, 0, 1],并且独热编码是连续的,也就是说如果上面的labels改为[0, 3, 3],那么输出结果为:

[[1. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

但如果再将classes改为4,即为四分类,则此时可以对3进行编码,但不能对4进行编码,即输出结果为(此时labels的值为[0, 1, 3, 4])

[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 0.]]

4)Softmax归一化处理
前向传播后得到的结果难以与上述独热编码比较,所以在前向传播后,还应当使用Softmax函数进行处理,使各维度的值在[0, 1]之间,并且总和为1,具体见下例:

import tensorflow as tf

y = tf.constant([3.52, 6.83, 1.05])
y1 = tf.nn.softmax(y)
print(y1)
print(tf.reduce_sum(y1))

输出结果为:

[0.03512505 0.96190387 0.00297105]
1.0

可以看到,每个维度的值在[0, 1]之间,并且总和为1

5)更新参数w的值,即对w做自减
若要反向传播训练w的值,则首先应使用Variable函数将其标记为可训练,然后使用assign_sub函数对w进行自减操作,直到更新loss函数值最小为止,具体如下:

import tensorflow as tf

w = tf.Variable(1)
w.assign_sub(1) #assign_sub(要自减的值),反向传播中该值一般为lr * grads,即w = w - lr*grads(学习率×梯度)
print(w)

输出结果为:0,即1 - 1 = 0

6)使用argmax返回行/列最大值的索引号
这部分没什么难理解的,直接上代码:

import tensorflow as tf

sess = tf.Session()
labels = tf.constant([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])
print("每一列的最大值的索引:", sess.run(tf.argmax(labels, axis=0)))
print("每一行的最大值的索引", sess.run(tf.argmax(labels, axis=1)))

输出如下:

每一列的最大值的索引: [3 3 1]
每一行的最大值的索引 [2 2 0 0]

argmax里的axis和上一节中0对应经度(即纵向),1对应纬度(即横向)一致,忘记了的小伙伴可以翻一下上一篇博客。
本次就到这里啦,下篇博客见.

你可能感兴趣的:(tensorflow,python,深度学习)