tensorflow2 0學習筆記第二章第四節

2022-06-04 20:39:07 字數 3873 閱讀 2412

2.4損失函式

損失函式(loss):**值(y)與已知答案(y_)的差距

nn優化目標:loss最小->-mse

-自定義

-ce(cross entropy)

均方誤差mse:mse(y_,y)=e^n~i=1(y-y_)^2/n

loss_mse = tf.reduce_mean(tf.square(y_-y))

import

tensorflow as tf

import

numpy as np

seed = 23455rdm = np.random.randomstate(seed=seed)

x = rdm.rand(32,2)

y_ = [[x1 + x2 + (rdm.rand()/10.0 - 0.05)] for (x1,x2) in x] #

生成【0,1】/10-0.05的雜訊

x = tf.cast(x,dtype =tf.float32)

w1 = tf.variable(tf.random.normal([2,1],stddev=1, seed = 1)) #

建立乙個2行一列的引數矩陣

epoch = 15000lr = 0.002

for epoch in

range(epoch):

with tf.gradienttape() as tape:

y =tf.matmul(x,w1)

loss_mse = tf.reduce_mean(tf.square(y_-y))

grads = tape.gradient(loss_mse,w1) #

loss_mse對w1求導

w1.assign_sub(lr*grads) #

在原本w1上減去lr(學習率)*求導結果

if epoch % 500 ==0:

print('

after %d training steps,w1 is

'%(epoch))

print(w1.numpy(),"\n"

)print("

final w1 is:

",w1.numpy())

結果:after 0 training steps,w1 is

[[-0.8096241]

[ 1.4855157]]

after 500 training steps,w1 is

[[-0.21934733]

[ 1.6984866 ]]

after 1000 training steps,w1 is

[[0.0893971]

[1.673225 ]]

after 1500 training steps,w1 is

[[0.28368822]

[1.5853055 ]]

after 14000 training steps,w1 is

[[0.9993659]

[0.999166 ]]

after 14500 training steps,w1 is

[[1.0002553 ]

[0.99838644]]

final w1 is: [[1.0009792]

[0.9977485]]

自定義損失函式

如**商品銷量,**多了,損失成本,**少了損失利潤

若利潤!=成本,則mse產生的loss無法利益最大化

自定義損失函式 loss(y_-y)=ef(y_-y)

f(y_-y)={profit*(y_-y) ,yy_ **多了,損失成本

寫出函式:

loss_zdy = tf.reduce_sum(tf.where(tf.greater(y_,y),(profit*(y_-y),cost*(y-y_) )))

假設商品成本1元,利潤99元,則**後的引數偏大,**銷量較高,反之成本為99利潤為1則引數小,銷售**較小

import

tensorflow as tf

import

numpy as np

profit = 1cost = 99seed = 23455rdm = np.random.randomstate(seed=seed)

x = rdm.rand(32,2)

x =tf.cast(x,tf.float32)

y_ = [[x1+x2 + rdm.rand()/10.0-0.05] for x1,x2 in

x]w1 = tf.variable(tf.random.normal([2,1],stddev=1,seed=1))

epoch = 10000lr = 0.002

for epoch in

range(epoch):

with tf.gradienttape() as tape:

y =tf.matmul(x,w1)

loss_zdy = tf.reduce_sum(tf.where(tf.greater(y_,y),(y_-y)*profit,(y-y_)*cost))

grads =tape.gradient(loss_zdy,w1)

w1.assign_sub(lr*grads)

if epoch % 500 ==0:

print("

after %d epoch w1 is:

"%epoch)

print(w1.numpy(),'\n'

)

print('

--------------')

print('

final w1 is

',w1.numpy())

#當成本=1,利潤=99模型的兩個引數[[1.1231122][1.0713713]] 均大於1模型在往銷量多的**

#當成本=99,利潤=1模型的兩個引數[[0.95219666][0.909771 ]] 均小於1模型在往銷量少的**

交叉熵損失函式ce(cross entropy),表示兩個概率分布之間的距離

h(y_,y)= -ey_*lny

如:二分類中標準答案y_=(1,0),**y1=(0.6,0.4),y2=(0.8,0.2)

哪個更接近標準答案?

h1((1,0),(0.6,0.4))=-(1*ln0.6 + 0*ln0.4) =0.511

h2((1,0),(0.8,0.2))=0.223

因為h1>h2,所以y2**更準

tf中交叉熵的計算公式:

tf.losses.categorical_crossentropy(y_,y)

import

tensorflow as tf

loss_ce1 = tf.losses.categorical_crossentropy([1,0],[0.6,0.4])

loss_ce2 = tf.losses.categorical_crossentropy([1,0],[0.8,0.2])

print("

loss_ce1

",loss_ce1)

print("

loss_ce2

",loss_ce2)

#loss_ce1 tf.tensor(0.5108256, shape=(), dtype=float32)

#loss_ce2 tf.tensor(0.22314353, shape=(), dtype=float32)

#結果loss_ce2數值更小更接近

softmax與交叉熵結合

輸出先過softmax,再計算y_和y的交叉損失函式

tf.nn.softmax_cross_entroy_with_logits(y_,y)

tensorflow2 0學習筆記(3 2)

自編碼器變種 1 denoising auto encoder 加隨機雜訊 2 dropout auto encoder 防止過擬合 3 adversarial auto encoder 利用額外的判別器網路來判定降維的隱藏變數?是否取樣先驗分布?對抗自編碼器是從下一章要介紹的生成對抗網路演算法衍生...

Tensorflow2 0學習筆記 建立張量

使用constant建立張量 使用constant函式建立張量 其中 1,5 表示張量內容,dtype表示資料型別 a tf.constant 1,5 dtype tf.int32 輸出a,a的資料型別,a的形狀 print a print a.dtype print a.shape 輸出結果 tf...

Tensorflow2 0學習筆記 常用函式(一)

1.資料型別轉換函式 定義乙個張量 a tf.constant 0,1,2 3,4,5 6,7,8 dtype tf.int64 強制轉換型別函式 b tf.cast a,tf.float32 reduce max查詢張量中最大的數,axis x表示對對應的行或者列求和 本例中為二維張量,0對應的對...