您好,登錄后才能下訂單哦!
本篇文章為大家展示了TensorFlow中怎么實現(xiàn)一個多元線性回歸分類器,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
# 導入需要的模塊
# - * - coding: utf-8 - * -
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn import datasets
import os
# 這個函數(shù)是為了利用sklearn獲取iris數(shù)據(jù),然后保存到本地后面用。
def make_iris():
iris = datasets.load_iris()
x = pd.DataFrame(iris.data)
y = pd.DataFrame(iris.target).values
y_onehot = tf.one_hot(y, 3)
sess = tf.InteractiveSession()
y_onehot_value = sess.run(y_onehot).reshape((150, 3))
y_onehot_value = pd.DataFrame(y_onehot_value)
x.to_csv("iris_x.csv", sep=',', header=None, index=None)
y_onehot_value.to_csv("iris_y.csv", sep=',', header=None, index=None)
# 定義模型,這里要分清楚,in_size,out_size分別代表什么的大小,比如對于iris數(shù)據(jù)集,有4個自變量,1個因變量,但是我們把label經(jīng)過one_hot編碼之后,label就變成了3維。所以這里In_size就是訓練數(shù)據(jù)的維度,也就是變量的個數(shù)。而out_size是輸出的維度,就是因變量的維度,所以是3.
一般對于多元線性回歸模型,可以寫成矩陣的形式就是,Y=WX+b,這里W是4x3的,x是150x4的,b是150x3的,所以Y的維度就是(150x4)x(4x3)+(150x3)=150x3(屬于某個類別的概率),模型最后輸出是softmax多分類函數(shù),所以最后每個樣本都會有一個屬于不同類別的概率值。
def model(inputs, in_size, out_size):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]))
outputs = tf.nn.softmax(tf.matmul(inputs, Weights) + biases)
return outputs
# 定義模型訓練函數(shù)
def train():
# 首先是讀取數(shù)據(jù),用上面那個函數(shù)保存的數(shù)據(jù),
# 把訓練數(shù)據(jù)讀進來,因為pandas讀取的是
# DataFrame對象,通過values屬性轉(zhuǎn)換為numpy.ndarry類型。
x_data = pd.read_csv("iris_x.csv", header=None).values
y_data = pd.read_csv("iris_y.csv", header=None).values
# 接下來是把數(shù)據(jù)分為訓練集和測試集。
train_x = x_data[0:120, :]
train_y = y_data[0:120, :]
test_x = x_data[120:151, :]
test_y = y_data[120:151, :]
print train_x.shape
print test_x.shape
print train_y.shape
print test_y.shape
#定義placeholder,這也可以不定義,后面就不
# 用顯示的feed了,直接run優(yōu)化目標就行。這
# 里還是要注意holder的維度代表的含義,別稀里糊涂的。
x_data_holder = tf.placeholder(tf.float32, [None, 4])
y_data_holder = tf.placeholder(tf.float32, [None, 3])
# 調(diào)用模型,輸出預測結(jié)果
y_prediction = model(x_data_holder, 4, 3)
#定義交叉熵損失函數(shù)
cross_entropy = tf.reduce_mean(
-tf.reduce_sum(y_data_holder *
tf.log(y_prediction), reduction_indices=[1]))
# 用梯度下降法求解,使得損失函數(shù)最小。
train_step = tf.train.GradientDescentOptimizer(0.1)\
.minimize(cross_entropy)
# 啟動session。
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
epoch = 2000
for e in range(epoch):
sess.run(train_step,
feed_dict={x_data_holder: train_x,
y_data_holder: train_y})
# 每隔50次,計算一下?lián)p失,注意這里的損失是訓
# 練數(shù)據(jù)的損失,而且這個損失是單步的損失,
# 不是全部數(shù)據(jù)的損失。
if e % 50 == 0:
train_loss = sess.run(cross_entropy,
feed_dict={x_data_holder: train_x,
y_data_holder: train_y})
y_pre = sess.run(y_prediction,
feed_dict={x_data_holder: test_x})
correct_prediction = tf.equal(tf.argmax(y_pre, 1),
tf.argmax(test_y, 1))
# eval函數(shù)可以將tensor類型轉(zhuǎn)換為具體的值,也可以不運行。
# print correct_prediction.eval(session=sess)
accuracy = tf.reduce_mean(tf.cast(correct_prediction,
tf.float32))
# 最后用測試數(shù)據(jù),計算一下測試數(shù)據(jù)的預測精度。
test_acc = sess.run(accuracy,
feed_dict={x_data_holder: test_x,
y_data_holder: test_y})
print "acc: {}; loss: {}".format(test_acc, train_loss)
# 要計算全部數(shù)據(jù)的損失,需要在最后再run一下?lián)p失。
training_cost = sess.run(cross_entropy,
feed_dict={x_data_holder: train_x,
y_data_holder: train_y})
print "Training cost={}".format(training_cost)
if __name__ == "__main__":
train()
上述內(nèi)容就是TensorFlow中怎么實現(xiàn)一個多元線性回歸分類器,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。