1. 程式人生 > >TensorFlow的邏輯迴歸實現

TensorFlow的邏輯迴歸實現



開啟微信掃一掃,關注微信公眾號【資料與演算法聯盟】

轉載請註明出處:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer

邏輯迴歸我們都知道是用來進行二分類處理的,裡邊經常用到的階躍函式是海維塞得階躍函式(Sigmoid函式)。

邏輯迴歸簡介

線性迴歸能對連續值結果進行預測,而現實生活中常見的另外一類問題是,分類問題。最簡單的情況是是與否的二分類問題。比如說醫生需要判斷病人是否生病,銀行要判斷一個人的信用程度是否達到可以給他發信用卡的程度,郵件收件箱要自動對郵件分類為正常郵件和垃圾郵件等等。

當然,我們最直接的想法是,既然能夠用線性迴歸預測出連續值結果,那根據結果設定一個閾值是不是就可以解決這個問題了呢?然後在大多數情況下需要學習的分類資料並沒有那麼精準,這個時候閾值的設定就沒卵用了,這時候就需要邏輯迴歸了,邏輯迴歸的核心思想就是通過對線性迴歸的計算結果進行一個對映,使之輸出的結果為0~1之間的概率值。

這個時候就需要一個單位階躍函式,常使用的就是Sigmoid函式。


這裡寫圖片描述

求導之後為:

這裡寫圖片描述

對應的影象為:

這裡寫圖片描述

關於Softmax Regression

TF中基於LR的多分類實現

# coding: utf-8
'''
create by: Thinkgamer
create time: 2018/04/22
desc: 使用tensorflow建立邏輯迴歸模型 ,分類
'''
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt
# 載入mnist資料集
from tensorflow.examples.tutorials.mnist import input_data
print("load finish")

mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
print(type(mnist))

train_img = mnist.train.images
train_label = mnist.train
.labels print("訓練集型別:",type(train_img)) print("訓練集維度:",train_img.shape) test_img = mnist.test.images test_label = mnist.test.labels print("測試集型別:",type(test_img)) print("測試集維度:",test_img.shape) print(test_label[0]) # [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.] 表示數字7

輸出為:

load finish
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
<class 'tensorflow.contrib.learn.python.learn.datasets.base.Datasets'>
訓練集型別: <class 'numpy.ndarray'>
訓練集維度: (55000, 784)
測試集型別: <class 'numpy.ndarray'>
測試集維度: (10000, 784)
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
x = tf.placeholder("float",[None,784])
y = tf.placeholder("float",[None,10])

W = tf.Variable(tf.zeros([784,10]))  # 表示權重,784個維度,10種類別
b = tf.Variable(tf.zeros([10]))      # 表示 是10分類,這裡選用0值初始化,一般採用高斯初始化

# 表示預測值結果
actv = tf.nn.softmax(tf.matmul(x,W)+b)

# 構造損失函式
# 損失函式 -log p, 各個維度損失函式求和之後,求均值
cost= tf.reduce_mean(-tf.reduce_sum(y*tf.log(actv),reduction_indices=1))    

# Optimizer 指定優化器 梯度下降
learning_rate = 0.1
optm = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
sess = tf.InteractiveSession()
# 函式學習 tf.argmax 返回最大值的索引
arr = np.array([
    [1,2,3,4,5],
    [6,7,8,9,10]
])
print(tf.shape(arr).eval())
print(tf.argmax(arr,0).eval())  #eval(session=sess))  0 是按列 1 是按行
print(tf.argmax(arr,1).eval()) 
# 預測
pred = tf.equal(tf.argmax(actv,1),tf.argmax(y,1))

# 準確率
accr = tf.reduce_mean(tf.cast(pred,"float"))

# init
init = tf.global_variables_initializer()
training_epochs = 50  # 樣本迭代次數
batch_size = 100 # 每次迭代使用的樣本
display_step = 50

sess = tf.Session()
sess.run(init)

# MINI-BATCH LEARENING
for epoch in range(training_epochs):
    avg_cost = 0.
    number_batch = int(mnist.train.num_examples/batch_size)
    for i in range(number_batch):
        batch_xs,batch_ys = mnist.train.next_batch(batch_size)
        sess.run(optm,feed_dict={x:batch_xs,y:batch_ys})
        feeds = {x: batch_xs,y: batch_ys}
        avg_cost += sess.run(cost,feed_dict=feeds)/number_batch
    # DISPLAY
    if epoch % display_step ==0 :
        feeds_train = {x:batch_xs,y:batch_ys}
        feeds_test = {x: mnist.test.images,y:mnist.test.labels}
        train_acc = sess.run(accr,feed_dict=feeds_train)
        test_acc = sess.run(accr,feed_dict=feeds_test)
        print(("Epoch: %03d/%03d cost:%.9f train_acc: %.3f test_acc: %.3f") % (epoch,training_epochs,avg_cost,train_acc,test_acc))
print("Done")


開啟微信掃一掃,加入資料與演算法交流大群