Tensorflow 回歸與分類
1.1 Tensorflow是什么?
Tensorflow是谷歌公司推出的開(kāi)源深度學(xué)習(xí)框架,利用它我們可以快速搭建深度學(xué)習(xí)模型棒拂。
1.2 Tensorflow是什么樣的框架岩调?
Tensorflow跟很多機(jī)器學(xué)習(xí)庫(kù)類似,采用了“流圖”方式陨献,這樣做的好處可以減小計(jì)算開(kāi)銷。一般情況下懂更,python的數(shù)值計(jì)算庫(kù)會(huì)將矩陣乘法之類的復(fù)雜計(jì)算傳送到外部外部語(yǔ)言計(jì)算(更高效的語(yǔ)言c,匯編等)眨业,但是每次計(jì)算轉(zhuǎn)換回來(lái)的操作依然是很大的開(kāi)銷。所以“流圖”方式采用沮协,先用圖和流來(lái)描述模型龄捡,再將整個(gè)模型一起送出去計(jì)算,計(jì)算完再送回來(lái)慷暂,這樣減少了轉(zhuǎn)換次數(shù)以減少開(kāi)銷聘殖。
1.3 Tensorflow怎么用?
Tensorflow內(nèi)部集成了很多的神經(jīng)網(wǎng)絡(luò)的反向傳播算法行瑞,以及其優(yōu)化方式奸腺。只需要編程設(shè)置相應(yīng)的參數(shù)即可選擇適當(dāng)?shù)姆聪騻鞑?yōu)化器。
它為我們解決了復(fù)雜的反向傳播過(guò)程的實(shí)現(xiàn)蘑辑,在構(gòu)建模型時(shí)洋机,我們只需要搭建正向的神經(jīng)網(wǎng)絡(luò)傳輸模型以及給出損失函數(shù)即可。
1.4 再具體一點(diǎn)洋魂?
在Tensorflow中操作的數(shù)據(jù)對(duì)象是tensor(包括常量和變量)绷旗,由對(duì)象和操作OP就構(gòu)成了圖Graph, 將各個(gè)圖的輸入輸出連接就形成的流圖,至此模型的表示便完成了副砍。在這個(gè)框架下表示和執(zhí)行是分開(kāi)的衔肢,因此,session會(huì)話便出場(chǎng)了豁翎,將表示放在session中就可以運(yùn)行了角骤。在運(yùn)行中很可能要使用到變量,只有數(shù)據(jù)的更新,才能得到“活水流”邦尊,那么怎么在session中賦予新的數(shù)據(jù)或者獲取新數(shù)據(jù)背桐,使用 tf.placeholder() 創(chuàng)建占位符的op中可以使用 feed 賦值如:sess.run([output], feed_dict={input1:[7.], input2:[2.]}),可以使用 fetch來(lái)獲取操作的返回值(可以是多個(gè))如: result = sess.run([mul, intermed])蝉揍。result是多個(gè)值链峭。
對(duì)于損失函數(shù)的構(gòu)建情況較多(常選擇的有均方差,信息熵等)又沾,反向優(yōu)化可以調(diào)用相應(yīng)的操作即可(常選擇梯度下降法)弊仪,下面看一個(gè)完整的例子:
import tensorflow as tf
import numpy as np
#1, 數(shù)據(jù)準(zhǔn)備
x_dat=np.float32(np.random.rand(2,100))
y_dat=np.dot([2.0,3.0],x_dat)+5.0
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# 2杖刷,變量定義及模型構(gòu)建
W=tf.Variable(tf.random_uniform([1,2],-0.1,0.1))
b=tf.Variable(tf.zeros([1]))
y_pre=tf.matmul(W,x)+b
# 3励饵,構(gòu)建損失函數(shù)及選擇優(yōu)化器
loss=tf.reduce_mean(tf.square(y_pre-y))
optim=tf.train.GradientDescentOptimizer(0.5)
train_op=optim.minimize(loss)
# 4,初始化變量啟動(dòng)會(huì)話滑燃,訓(xùn)練
init=tf.initialize_all_variables()
sess=tf.Session()
sess.run(init)
for step in range(1,200):
? ? sess.run([train_op],feed_dict={x:x_dat,y:y_dat })
? ? if step%20 ==0 :
? ? ? ? print(sess.run([W,b]))
session在運(yùn)行之前需要構(gòu)建整個(gè)圖役听,除了sesion之外,還有一個(gè)可以在圖運(yùn)行中出入其他圖的會(huì)話InteractiveSession不瓶。
1.5多元線性回歸
下面是一個(gè)多元線性回歸的例子禾嫉,將模型構(gòu)建函數(shù)抽抽離單獨(dú)實(shí)現(xiàn),在主程序中調(diào)用蚊丐,可以使程序復(fù)用性更強(qiáng)。
敲黑板艳吠,劃重點(diǎn):
Tip1: out = tf.matmul( w,inputs) + b #注意matmul的參數(shù)順序
Tip2: optmiz = tf.train.GradientDescentOptimizer(0.1) #不收斂需調(diào)整變化率麦备,這里0.5不收斂,太小則訓(xùn)練太慢昭娩。
Tip3: train_op = optmiz.minimize(loss) #根據(jù)loss來(lái)確定改變變量的方向及數(shù)值
# 多元線性回歸
import tensorflow as tf
import numpy as np
# 模型構(gòu)建函數(shù)
def add_layer(inputs, insize, outsize, activation_fun=None):
? ? w = tf.Variable(tf.random_normal([outsize,insize]))
? ? b = tf.Variable(tf.zeros([outsize,1]))
? ? #print(inputs.shape)
? ? out = tf.matmul( w,inputs) + b #注意matmul的參數(shù)順序
? ? if activation_fun is None:
? ? ? ? output = out
? ? else:
? ? ? ? output = activation_fun(out)
? ? print(output.shape)
? ? return output,w,b
# 1,數(shù)據(jù)準(zhǔn)備
x_dat = np.float32(np.random.rand(5,200))
y_dat = np.dot([2.0, 3.0, 2.0,4.0,9.0],x_dat)+5.0
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# 2凛篙,模型構(gòu)建,變量定義
y_pre,w,b = add_layer(x, 5, 1, activation_fun=None)
# 3栏渺,構(gòu)建損失函數(shù)及選擇優(yōu)化器
loss = tf.reduce_mean(tf.square(y-y_pre))
#loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_pre),reduction_indices=[1]))
optmiz = tf.train.GradientDescentOptimizer(0.1)? #不收斂需調(diào)整變化率呛梆,這里0.5不收斂,太小則訓(xùn)練太慢磕诊。
train_op = optmiz.minimize(loss) #根據(jù)loss來(lái)確定改變變量的方向及數(shù)值
# 4填物,啟動(dòng)會(huì)話,初始化變量霎终,訓(xùn)練
init = tf.global_variables_initializer()
with tf.Session() as sess:
? ? sess.run(init)
? ? for step in range(2000):
? ? ? ? sess.run([train_op],feed_dict={x: x_dat, y: y_dat})
? ? ? ? if step % 200 == 0:
? ? ? ? ? ? print(sess.run([loss,w,b],feed_dict={x: x_dat, y: y_dat}))
結(jié)果如下:
1.6分類的例子:
# 分類
import tensorflow as tf
import numpy as np
import random
# AX=0 相當(dāng)于matlab中 null(a','r')
def null(a, rtol=1e-5):
? ? u, s, v = np.linalg.svd(a)
? ? rank = (s > rtol * s[0]).sum()
? ? return rank, v[rank:].T.copy()
# 符號(hào)函數(shù)滞磺,之后要進(jìn)行向量化
def sign(x):
? ? if x > 0:
? ? ? ? return 1
? ? elif x == 0:
? ? ? ? return 0
? ? elif x < 0:
? ? ? ? return -1
# noisy=False,那么就會(huì)生成N的dim維的線性可分?jǐn)?shù)據(jù)X莱褒,標(biāo)簽為y
# noisy=True, 那么生成的數(shù)據(jù)是線性不可分的,標(biāo)簽為y
def mk_data(N, noisy=False):
? ? rang = [-1, 1]
? ? dim = 5
? ? X = np.random.rand(dim, N) * (rang[1] - rang[0]) + rang[0]
? ? while True:
? ? ? ? Xsample = np.concatenate((np.ones((1, dim)), np.random.rand(dim, dim) * (rang[1] - rang[0]) + rang[0]))
? ? ? ? k, w = null(Xsample.T)
? ? ? ? y = sign(np.dot(w.T, np.concatenate((np.ones((1, N)), X))))
? ? ? ? print(y[0][5])
? ? ? ? if np.all(y):
? ? ? ? ? ? break
? ? day=[]
? ? if noisy == True:
? ? ? ? idx = random.sample(range(1, N), N / 10)
? ? ? ? y[idx] = -y[idx]
? ? for st in range(200):
? ? ? ? if(y[0][st]==1):
? ? ? ? ? ? y1 = [1,0]
? ? ? ? else:
? ? ? ? ? ? y1 = [0,1]
? ? ? ? day.append(y1)
? ? da_x = np.float32(X.transpose())
? ? da_y = np.float32(day)
? ? return da_x, da_y, w
# 模型構(gòu)建函數(shù)
def add_layer(insize, outsize, input, function = None):
? ? weight = tf.Variable(tf.random_normal([insize,outsize]))
? ? basize = tf.Variable(tf.zeros([outsize]))
? ? out = tf.matmul(input, weight) + basize
? ? if(function == None):
? ? ? ? output = out
? ? else:
? ? ? ? output = function(out)
? ? return output
# 1,數(shù)據(jù)準(zhǔn)備
#產(chǎn)生的數(shù)據(jù)為隨機(jī)數(shù)據(jù)击困,訓(xùn)練結(jié)果可能會(huì)不穩(wěn)定
sign = np.vectorize(sign)
x_dat, y_dat, w = mk_data(200)
#x_dat = np.float32(np.random.rand(200,5)*5+10)
#y_dat = np.float32(np.zeros([200,2]))
# x_dat2 = np.float32(np.random.rand(200,5))
# y_dat2 = np.float32(np.zeros([200,2])+1)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
print(x_dat.shape)
print(y_dat.shape)
# 2,模型構(gòu)建广凸,變量定義
y_pre = add_layer(5,2,x,tf.nn.softmax)
# 3阅茶,構(gòu)建損失函數(shù)及選擇優(yōu)化器
loss = -tf.reduce_sum(y*tf.log(y_pre))
optim = tf.train.GradientDescentOptimizer(0.05)
train_op = optim.minimize(loss)
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_pre),tf.argmax(y)),tf.float32))
# 4蛛枚,啟動(dòng)會(huì)話,初始化變量脸哀,訓(xùn)練
init = tf.global_variables_initializer()
with tf.Session() as sess:
? ? sess.run(init)
? ? for step in range(2000):
? ? ? ? sess.run([train_op],feed_dict={x:x_dat,y:y_dat})
? ? ? ? if step % 100 == 0 :
? ? ? ? ? ? print(sess.run([loss,accuracy],feed_dict={x:x_dat,y:y_dat}))
? ? ? ? ? ? print(accuracy.eval(feed_dict={x:x_dat,y:y_dat}))
————————————————
版權(quán)聲明:本文為CSDN博主「AI小白龍」的原創(chuàng)文章蹦浦,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明企蹭。
原文鏈接:https://blog.csdn.net/qq_34106574/article/details/94406204