Tensorflow學習 3 損失函式

2021-09-29 16:44:02 字數 2412 閱讀 3023

常用的有tf.nn.relu、tf.sigmoid(0~1)、tf.tanh(-1~1)。

cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1)))
注意這裡的y_,y可能為乙個矩陣,需要注意的是要使用「*」而不是使用tf.matmul(),因為我們不是想要使用矩陣乘法。具體區別在書77頁。

得到乙個n x m大小的矩陣後,n是batch_size,m為分類的類數。reduce_mean來取平均值。

有個疑問就是按照交叉熵的公式應該是把n * m個數加起來除以n,但是如果使用reduce_mean是除以n*m。

因為交叉熵一般會與softmax回歸一起使用,所以進行了封裝

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y)
在只有乙個正確答案的分類問題中,下面這個函式可以進一步加速計算過程  //sparse:稀少的,稀疏的

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_,logits=y)
mse = tf.reduce_mean(tf.square(y_ - y))
例如:在**商品銷量時,如果**多了廠家會損失成本,**少了廠家會損失利潤,但是每個產品成本只有一塊,而利潤有十塊,這時均方誤差就不能很好的最大化銷售利潤。

這時的損失函式可以設定為當y(**資料)>y_,loss = 1(y - y_);當y<_y,loss = 10(y - y_)。通過這樣的自定義損失函式的優化,模型提供的**值更有可能最大化收益。

可以通過以下**來實現這個損失函式  //reduce有縮小的意思,可以理解為縮小維度

loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * 1, (y_ - y) * 10))
import tensorflow as tf

from numpy.random import randomstate

batch_size = 8

# 兩個輸入節點

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

# 回歸問題一般只有乙個輸出節點

y_ = tf.placeholder(tf.float32, shape=(none, 1), 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

# 損失函式

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

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

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

rdm = randomstate(1)

data_size = 128

x = rdm.rand(data_size, 2)

# 設定回歸的正確值為兩個輸入的和加上乙個隨機量

# 加上隨機量的是因為避免最後能完全正確**,不同的損失函式的效果就看不出來了

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

# 訓練神經網路

with tf.session() as sess:

init_op = tf.global_variables_initializer()

sess.run(init_op)

step = 20000

for i in range(step):

start = (i * batch_size) % data_size

end = min(start + batch_size, data_size)

sess.run(train_step, feed_dict=)

if i % 1000 == 0:

print(sess.run(w1))

最後可以發現w1的值都比[1,1]要大。可以通過改變loss_less,loss_more的值來感受區別。

TensorFlow 損失函式

import numpy as np import tensorflow as tf sess tf.interactivesession 1.多分類中的softmax函式在多分類的神經網路中,通常在最後一層接乙個softmax層。對於n分類問題,softmax層就有n個結點,每個結點輸出的就是該類...

TensorFlow損失函式

tensorflow損失函式 正如前面所討論的,在回歸中定義了損失函式或目標函式,其目的是找到使損失最小化的係數。本文將介紹如何在 tensorflow 中定義損失函式,並根據問題選擇合適的損失函式。宣告乙個損失函式需要將係數定義為變數,將資料集定義為佔位符。可以有乙個常學習率或變化的學習率和正則化...

深度學習TensorFlow筆記 損失函式

1.損失函式 經典損失函式 交叉熵 交叉熵刻畫了兩個概率分布之間的距離,它是分類問題中使用比較廣的一種損失函式。通過q來表示p的交叉熵為 softmax將神經網路前向傳播得到的結果變成概率分布,原始神經網路的輸出被用作置信度來生成新的輸出,而新的輸出滿足概率分布的所有要求。交叉熵函式不是對稱的,h ...