TensorFlow實戰 自定義損失函式完整案例

2021-08-31 15:47:49 字數 1687 閱讀 9210

import tensorflow as tf

from numpy.random import randomstate

import os

os.environ['tf_cpp_min_log_level'] = '2'

batch_size = 8

#兩個輸入節點。

x = tf.placeholder(tf.float32,shape=(none,2),name='x-input')

#乙個輸出節點。

y_ = tf.placeholder(tf.float32,shape=(none),name='y-input')

#定義了乙個單層的神經網路前向傳播過程,這裡就是簡單加權和。

w1 = tf.variable(tf.random_normal([2,1],stddev=1,seed=1))

y = tf.matmul(x,w1)

#自定義損失函式

#定義**多了和**少了的成本。

loss_less = 10

loss_more = 1

#此處用到了tf.greater 和 tf.where 來實現選擇操作,tf.greater 的輸入是兩個張量,此函式會比較這兩個輸入張量中每個元素的大小,並返回比較結果。

#當tf.greater的輸入張量維度不一樣時,tensorflow會進行類似numpy廣播操作處理。

#tf.where函式有三個引數,第乙個為選擇條件根據,當為true時,tf.where函式選擇第二個引數中的值,否則使用第三個引數中的值。

loss = tf.reduce_sum(tf.where(tf.greater(y,y_),(y - y_)*loss_more,(y_ - y)*loss_less))

train_step = tf.train.adamoptimizer(0.001).minimize(loss)

#通過隨機數生成乙個模擬資料集

rdm = randomstate(1)

dataset_size = 128

x = rdm.rand(dataset_size,2)

#設定回歸的正確值為兩個輸入的和加上乙個隨機變數。之所以要加上乙個隨機量是為了加入不可**的噪音,

#否則不同損失函式的意義就不大了,因為不同損失函式都會在能完全**正確的時候最低。一般來說噪音為乙個均值為0的小量,

#所以這裡的噪音設定為-0.05~0.05的隨機數。

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

#訓練神經網路。

with tf.session() as sess:

init_op = tf.global_variables_initializer()

sess.run(init_op)

steps = 5000

for i in range(steps):

start = (i * batch_size) % dataset_size

end = min(start+batch_size,dataset_size)

sess.run(train_step,

feed_dict=)

print (sess.run(w1))

'''輸出結果:

[[1.0193471]

[1.0428091]]

'''

TensorFlow2 0 自定義層與自定義網路

自定義層函式需要繼承layers.layer,自定義網路需要繼承keras.model。其內部需要定義兩個函式 1 init 初始化函式,內部需要定義構造形式 2 call函式,內部需要定義計算形式及返回值。self def layer class mydense layers.layer inhe...

tensorflow2 0 自定義層

無引數的自定義層可以使用 keras.layers.lambda函式 customized spftplus keras.layers.lambda lambda x tf.nn.softplus x print customized spftplus 1.0 1.0 1.0 0.0 0.1 0.2...

tensorflow 2 1 自定義訓練

常常會遇到自定義網路結構的情況,自定結構後往往會有多個輸入,或者還需要自定義loss或者accuracy函式,那麼keras的fit就無法使用了,因此需要自定義訓練步驟 下面則自定義一次batch的訓練步驟,包含了計算loss,accuracy和梯度下降。tensorflow2.0 主推eager模...