日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习(16)TensorFlow高阶操作五: 张量限幅

發(fā)布時間:2023/12/15 pytorch 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(16)TensorFlow高阶操作五: 张量限幅 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深度學(xué)習(xí)(16)TensorFlow高階操作五: 張量限幅

  • 1. clip_by_value
  • 2. relu
  • 3. clip_by_norm
  • 4. Gradient clipping
  • 5. 梯度爆炸實例以及利用clip_by_global_norm解決問題
  • 6. 實戰(zhàn)

Outline

  • clip_by_value
  • relu
  • clip_by_norm
  • gradient clipping

1. clip_by_value

(1) tf.maximum(a, 2): 將a中比2小的數(shù)進(jìn)行限幅,也就是比2小的全部變?yōu)?;
(2) tf.minimum(a, 8): 將a中比8大的數(shù)進(jìn)行限幅,也就是比8大的全部變?yōu)?;
(3) tf.clip_by_value(a, 2, 8): 將a中比2小比8大的數(shù)進(jìn)行限幅; 也就是比2小的全部變?yōu)?,比8大的全部變?yōu)?;

2. relu

當(dāng)值小于0時,將值置位0; 當(dāng)值大于0時,等于原值。

(1) tf.nn.relu(a): 將a進(jìn)行relu化操作;
(2) tf.maximum(a, 0): 作用與tf.nn.relu(a)一樣;

3. clip_by_norm

如果我們將一些數(shù)值限幅在我們希望的區(qū)域內(nèi),但是可能會導(dǎo)致梯度變化,就是不是我們希望看到的結(jié)果,這時我們就需要clip_by_norm()函數(shù)了,clip_by_norm的思想就是先求這個范圍的向量值,也就是二范數(shù),將其值限制在[0~1]之間,再放大這個范圍,利用這個方法進(jìn)行限幅就不會改變梯度值的大小。

(1) tf.norm(a): 求a的二范數(shù),即: √(∑?x_i^2 );
(2) aa = tf.clip_by_norm(a, 15): 將a限制在15之間,但不改變其梯度大小,其中15就是一個new norm;

4. Gradient clipping

  • Gradient Exploding or vanishing
  • set lr=1
  • new_grads, total_norm = tf.clip_by_global_norm(grads, 25)

目的在于保持整體的參數(shù)梯度方向不變,例如原來的[w1,w2,w3]=[2,4,8][w_1,w_2,w_3 ]=[2,4,8][w1?,w2?,w3?]=[2,4,8],利用
clip_by_global_norm可以使w1,w2,w3w_1,w_2,w_3w1?,w2?,w3?同時縮小n倍,例如同時縮小2倍,就是[w1,w2,w3]=[1,2,4][w_1,w_2,w_3 ]=[1,2,4][w1?,w2?,w3?]=[1,2,4],這樣就保證了梯度的方向不會發(fā)生變化。其中25代表梯度的值不會超過25。

5. 梯度爆炸實例以及利用clip_by_global_norm解決問題

(1) Before
我們?yōu)榱搜菔咎荻缺▽W(xué)習(xí)率設(shè)置得高一點,這樣即使是簡單的MNIST數(shù)據(jù)集也會發(fā)生梯度爆炸問題。

Step0: 我們可以看到(g-x代表x的梯度):
g-w1w_1w1?=89.03711
g-b1b_1b1?=2.6179454
g-w2w_2w2?=118.17449
g-b2b_2b2?=2.1617627
g-w3w_3w3?=134.27968
g-b3b_3b3?=2.5254946
Step1:
g-w1w_1w1?=1143.292
g-b1b_1b1?=35.148225
g-w2w_2w2?=1279.236
g-b2b_2b2?=24.312374
g-w3w_3w3?=1185.6311
g-b3b_3b3?=17.80448

  • 一般來說,梯度值在[0~20]之間我們是可以接受的,所以從第1輪訓(xùn)練之后就發(fā)生了Gradient Exploding(梯度爆炸)問題;

(2) Gradient Clipping

w1,b1,w2,b2,w3,b3w_1,b_1,w_2,b_2,w_3,b_3w1?,b1?,w2?,b2?,w3?,b3?通過clip_by_global_norm進(jìn)行同比例裁剪; 15表示梯度值不會超過15;
(3) After

可以看到: 梯度相比于沒有優(yōu)化之前好了很多,這樣我們在更新的時候是比較穩(wěn)定的。

6. 實戰(zhàn)

(1) Before

import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' print(tf.__version__)(x, y), _ = datasets.mnist.load_data() x = tf.convert_to_tensor(x, dtype=tf.float32) / 50. y = tf.convert_to_tensor(y) y = tf.one_hot(y, depth=10) print('x:', x.shape, 'y:', y.shape) train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(128).repeat(30) x, y = next(iter(train_db)) print('sample:', x.shape, y.shape)# print(x[0], y[0])def main():# 784 => 512w1, b1 = tf.Variable(tf.random.truncated_normal([784, 512], stddev=0.1)), tf.Variable(tf.zeros([512]))# 512 => 256w2, b2 = tf.Variable(tf.random.truncated_normal([512, 256], stddev=0.1)), tf.Variable(tf.zeros([256]))# 256 => 10w3, b3 = tf.Variable(tf.random.truncated_normal([256, 10], stddev=0.1)), tf.Variable(tf.zeros([10]))optimizer = optimizers.SGD(lr=0.01)for step, (x, y) in enumerate(train_db):# [b, 28, 28] => [b, 784]x = tf.reshape(x, (-1, 784))with tf.GradientTape() as tape:# layer1.h1 = x @ w1 + b1h1 = tf.nn.relu(h1)# layer2h2 = h1 @ w2 + b2h2 = tf.nn.relu(h2)# outputout = h2 @ w3 + b3# out = tf.nn.relu(out)# compute loss# [b, 10] - [b, 10]loss = tf.square(y - out)# [b, 10] => [b]loss = tf.reduce_mean(loss, axis=1)# [b] => scalarloss = tf.reduce_mean(loss)# compute gradientgrads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])print('==before==')for g in grads:print(tf.norm(g))# grads, _ = tf.clip_by_global_norm(grads, 15)# print('==after==')# for g in grads:# print(tf.norm(g))# update w' = w - lr*gradoptimizer.apply_gradients(zip(grads, [w1, b1, w2, b2, w3, b3]))if step % 100 == 0:print(step, 'loss:', float(loss))if __name__ == '__main__':main()

注: 這里因為很難出現(xiàn)梯度爆炸的問題,為了實驗clip_by_global_norm方法的效率,我們將原數(shù)據(jù)集輸入除以50,以達(dá)到梯度爆炸的效果。
運行結(jié)果如下:

(2) After

import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' print(tf.__version__)(x, y), _ = datasets.mnist.load_data() x = tf.convert_to_tensor(x, dtype=tf.float32) / 50. y = tf.convert_to_tensor(y) y = tf.one_hot(y, depth=10) print('x:', x.shape, 'y:', y.shape) train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(128).repeat(30) x, y = next(iter(train_db)) print('sample:', x.shape, y.shape)# print(x[0], y[0])def main():# 784 => 512w1, b1 = tf.Variable(tf.random.truncated_normal([784, 512], stddev=0.1)), tf.Variable(tf.zeros([512]))# 512 => 256w2, b2 = tf.Variable(tf.random.truncated_normal([512, 256], stddev=0.1)), tf.Variable(tf.zeros([256]))# 256 => 10w3, b3 = tf.Variable(tf.random.truncated_normal([256, 10], stddev=0.1)), tf.Variable(tf.zeros([10]))optimizer = optimizers.SGD(lr=0.01)for step, (x, y) in enumerate(train_db):# [b, 28, 28] => [b, 784]x = tf.reshape(x, (-1, 784))with tf.GradientTape() as tape:# layer1.h1 = x @ w1 + b1h1 = tf.nn.relu(h1)# layer2h2 = h1 @ w2 + b2h2 = tf.nn.relu(h2)# outputout = h2 @ w3 + b3# out = tf.nn.relu(out)# compute loss# [b, 10] - [b, 10]loss = tf.square(y - out)# [b, 10] => [b]loss = tf.reduce_mean(loss, axis=1)# [b] => scalarloss = tf.reduce_mean(loss)# compute gradientgrads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])print('==before==')for g in grads:print(tf.norm(g))grads, _ = tf.clip_by_global_norm(grads, 15)print('==after==')for g in grads:print(tf.norm(g))# update w' = w - lr*gradoptimizer.apply_gradients(zip(grads, [w1, b1, w2, b2, w3, b3]))if step % 100 == 0:print(step, 'loss:', float(loss))if __name__ == '__main__':main()

運行結(jié)果如下:

可以看到,即使迭代了幾十輪,這些參數(shù)還是能夠在正常范圍內(nèi)進(jìn)行更新。
(3) 查看收斂

import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' print(tf.__version__)(x, y), _ = datasets.mnist.load_data() x = tf.convert_to_tensor(x, dtype=tf.float32) / 50. y = tf.convert_to_tensor(y) y = tf.one_hot(y, depth=10) print('x:', x.shape, 'y:', y.shape) train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(128).repeat(30) x, y = next(iter(train_db)) print('sample:', x.shape, y.shape)# print(x[0], y[0])def main():# 784 => 512w1, b1 = tf.Variable(tf.random.truncated_normal([784, 512], stddev=0.1)), tf.Variable(tf.zeros([512]))# 512 => 256w2, b2 = tf.Variable(tf.random.truncated_normal([512, 256], stddev=0.1)), tf.Variable(tf.zeros([256]))# 256 => 10w3, b3 = tf.Variable(tf.random.truncated_normal([256, 10], stddev=0.1)), tf.Variable(tf.zeros([10]))optimizer = optimizers.SGD(lr=0.01)for step, (x, y) in enumerate(train_db):# [b, 28, 28] => [b, 784]x = tf.reshape(x, (-1, 784))with tf.GradientTape() as tape:# layer1.h1 = x @ w1 + b1h1 = tf.nn.relu(h1)# layer2h2 = h1 @ w2 + b2h2 = tf.nn.relu(h2)# outputout = h2 @ w3 + b3# out = tf.nn.relu(out)# compute loss# [b, 10] - [b, 10]loss = tf.square(y - out)# [b, 10] => [b]loss = tf.reduce_mean(loss, axis=1)# [b] => scalarloss = tf.reduce_mean(loss)# compute gradientgrads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])# print('==before==')# for g in grads:# print(tf.norm(g))grads, _ = tf.clip_by_global_norm(grads, 15)# print('==after==')# for g in grads:# print(tf.norm(g))# update w' = w - lr*gradoptimizer.apply_gradients(zip(grads, [w1, b1, w2, b2, w3, b3]))if step % 100 == 0:print(step, 'loss:', float(loss))if __name__ == '__main__':main()

運行結(jié)果如下:

可以看到,模型能夠很好地收斂。

參考文獻(xiàn):
[1] 龍良曲:《深度學(xué)習(xí)與TensorFlow2入門實戰(zhàn)》

總結(jié)

以上是生活随笔為你收集整理的深度学习(16)TensorFlow高阶操作五: 张量限幅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一级免费视频 | 玉女心经是什么意思 | 亚洲30p| 色网站在线免费观看 | 亚洲精品ww| 中文字幕亚洲不卡 | 美女扒开尿口让男人爽 | 污污视频在线观看免费 | 亚洲综合精品国产一区二区三区 | 少妇色欲网 | 性开放淫合集 | 日本大乳奶做爰 | 国产精品自拍区 | 韩日黄色片 | 欧美午夜视频 | 亚洲插插插 | 麻豆精品影院 | 亚洲一卡二卡三卡四卡 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 我不卡一区二区 | 日本中文字幕视频 | 啊v视频在线观看 | 男人天堂你懂的 | 日韩欧美国产一区二区三区在线观看 | 久久亚洲精精品中文字幕早川悠里 | 99精品视频在线免费观看 | 中文字幕亚洲一区 | 中文字幕免费高清在线 | 色偷偷网 | a片在线免费观看 | 久久精品国产欧美亚洲人人爽 | 最新黄色网页 | av导航在线观看 | 久久九九国产视频 | 日韩高清影视在线观看 | 乳孔很大能进去的av番号 | 国产激情无码一区二区 | 日本三级小视频 | 色91av| 日韩黄色av网站 | 国产欧美精品一区二区三区app | 九九涩| 国产3p视频 | 欧美一区二区三区四区在线观看 | 野花视频在线观看免费 | 中文字幕在线观看欧美 | 白嫩初高中害羞小美女 | 三级理论电影 | av图片在线| 久草视频在线免费播放 | 免费视频一区 | www.亚洲激情 | 亚洲爱情岛论坛永久 | 在线观看不卡av | 黄色一级小说 | 国产精品88久久久久久妇女 | 中文字幕色站 | 亚洲第一页乱 | 色屁屁www | 国产午夜精品视频 | 色中色综合 | 四虎影院www | 蜜臀av性久久久久蜜臀av麻豆 | 日韩一区二区三区三四区视频在线观看 | 欧美色图激情小说 | 欧美一级特黄aaaaaa大片在线观看 | 日本r级电影在线观看 | 日批在线观看 | 奇米影视第四色7777 | 亚洲色欧美 | 在线观看视频二区 | 色综合五月 | 男女啊啊啊 | 国产日韩在线观看视频 | 在线观看成年人视频 | 91伦理视频 | 国产第9页 | 免费观看成人毛片 | 欧美三根一起进三p | 欧美交换配乱吟粗大25p | 日韩va中文 | 综合图区亚洲 | 国产欧美综合一区二区三区 | 在线观看毛片网站 | 欧美性第一页 | 国产小毛片 | 关之琳三级做爰 | 亚洲综合一区二区 | 久久网址 | 欧亚乱熟女一区二区在线 | 污污小视频 | 国产黄色在线播放 | 一级片aaaa| 成人一级毛片 | 亚洲妇熟xx妇色黄蜜桃 | 国产欧美一级 | 成人h动漫在线 | 成人久久av| 亚洲蜜桃精久久久久久久久久久久 |