Tensorflow的邏輯回歸例子,詳解

2021-08-21 10:54:12 字數 4138 閱讀 2153

這裡做了一些修改,並加入了b值,使邏輯回歸的元素完整,取得了更好的擬合效果。邏輯回歸損失函式推導過程如下:

本例構造了乙個三層網路,輸入(2cell),隱藏(10cell),輸出(1cell)。我對本例的理解檢視和傳統神經網路的圖形表達,均手工畫在下面,個人認為,理解了結構之後的檢視,更利於今後的深入研究和使用。

# 使用命名空間定義元素,便於使用tensorboard檢視神經網路圖形化

with tf.name_scope('graph_1') as scope:

batch_size = 500 # 神經網路訓練集batch大小為500

# 定義神經網路的結構,輸入為2個引數,隱藏層為10個引數,輸出為1個引數

# w1為輸入到隱藏層的權重,2*10的矩陣(2表示輸入層有2個因子,也就是兩列輸入,10表示隱藏層有10個cell)

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

# w2為隱藏層到輸出的權重,10*1的矩陣(接受隱藏的10個cell輸入,輸出1列資料)

w2 = tf.variable(tf.random_normal([10, 1], stddev=1, seed=1), name='w2')

# b1和b2均為一行,列數對應由w1和w2的列數決定

b1 = tf.variable(tf.random_normal([1, 10], stddev=1, seed=1), name='b1')

b2 = tf.variable(tf.random_normal([1, 1], stddev=1, seed=1), name='b2')

# 維度中使用none,則可以不規定矩陣的行數,方便儲存不同batch的大小。(佔位符)

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

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

# 定義神經網路前向傳播的過程,定義了1層隱藏層。

# 輸入到隱藏、隱藏到輸出的演算法均為邏輯回歸,即y=wx+b的模式

a = tf.add(tf.matmul(x, w1, name='a'), b1)

y = tf.add(tf.matmul(tf.tanh(a), w2, name='y'), b2) # 使用tanh啟用函式使模型非線性化

y_hat = tf.sigmoid(y) # 將邏輯回歸的輸出概率化

cross_entropy = - \

tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y_hat, 1e-10, 1.0)) +

(1-y_)*tf.log(tf.clip_by_value((1-y_hat), 1e-10, 1.0)))

# 方差損失函式,邏輯回歸不能用

# cost = -tf.reduce_mean(tf.square(y_ - y_hat))

# clip_by_value函式將y限制在1e-10和1.0的範圍內,防止出現log0的錯誤,即防止梯度消失或爆發

train_step = tf.train.adamoptimizer(0.0001).minimize((cross_entropy)) # 反向傳播演算法

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

rdm = randomstate(1) # rdm為偽隨機數發生器,種子為1

dataset_size = 128000

x = rdm.rand(dataset_size, 2) # 生成隨機數,大小為128000*2的矩陣

# x_hat = rdm.rand(1, 2)

x_hat =

print(x_hat)

# 打標籤,所有x1+x2<1的都被認為是正樣本,其餘為負樣本。

y = [[int(x1+x2 < 1)] for (x1, x2) in x] # 列表解析格式

# 若x1+x2 <1為真,則int(x1+x2 <1)為1,若假,則輸出為0

# 建立會話

with tf.session() as sess:

writer = tf.summary.filewriter("logs/", sess.graph)

init_op = tf.global_variables_initializer() # 所有需要初始化的值

sess.run(init_op) # 初始化變數

print(sess.run(w1))

print(sess.run(w2))

print('x_hat =', x_hat, 'y_hat =', sess.run(y_hat, feed_dict=))

'''# 在訓練之前神經網路權重的值,w1,w2,b1,b2的值

'''# 設定訓練的輪數

steps = 100000

for i in range(steps):

# 每次從資料集中選batch_size個資料進行訓練

start = (i * batch_size) % dataset_size # 訓練集在資料集中的開始位置

# 結束位置,若超過dataset_size,則設為dataset_size

end = min(start + batch_size, dataset_size)

# 通過選取的樣本訓練神經網路並更新引數

sess.run(train_step, feed_dict=)

if i % 1000 == 0:

# 每隔一段時間計算在所有資料上的損失函式並輸出

total_cross_entropy = sess.run(

cross_entropy, feed_dict=)

total_w1 = sess.run(w1)

total_b1 = sess.run(b1)

total_w2 = sess.run(w2)

total_b2 = sess.run(b2)

print("after %d training steps(s), cross entropy on all data is %g" % (

i, total_cross_entropy))

print('w1=', total_w1, ',b1=', total_b1)

print('w2=', total_w2, ',b2=', total_b2)

# 在訓練之後神經網路權重的值

print(sess.run(w1))

print(sess.run(w2))

print('x_hat =', x_hat, 'y_hat =', sess.run(y_hat, feed_dict=))

輸出結果如下:

經過10萬次迭代後,損失收斂到0.0154059,基本可以用了。最後**結果也列印出來了,對於這種隨機產生的資料,也不在意訓練集和測試集了,如果想測試新的資料,可以自行生成,然後把w1,w2,b1,b2代入三個正向傳播函式,看看效果如何即可。

在tensorboard中顯示了一下這個graph,比我手畫的複雜多了,沒理解的話,絕對會被這種高大上的東西嚇到不敢繼續,理解了的話,也就沒那麼難了。以後只需要把函式換成實際應用中的演算法即可,解決基本應用問題不大。

在tensorboard的graph中,可以很明顯的看出正向傳播和反向傳播的路徑,從下到上是正向傳播,到了sigmoid節點為止(輸出y_hat值)。然後從sigmoid節點處再向上,就是乙個反向求導過程。

Tensorflow實現邏輯回歸

import tensorflow as tf 匯入mnist資料集 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets temp data one hot true 定...

使用tensorflow書寫邏輯回歸

mnist 讀取訓練集 mnist.train.images mnist.train.labels 讀取訓練集的長度 mnist.train.num examples 函式 tf.placeholder 必須指定資料型別,shape可以不指定,這樣就可以使用多種shape了 tf.variable ...

TensorFlow入門 邏輯回歸之softmax

coding utf 8 import tensorflow as tf import numpy as np import pandas as pd import cv2 as cv import os from tensorflow.examples.tutorials.mnist import...