Tensorflow學(xué)習(xí)筆記(二)

計算圖中的操作

import numpy as np
import tensorflow as tf
sess = tf.Session()
x_vals = np.array([1., 3., 5., 7., 9.])
x_data = tf.placeholder(dtype=tf.float32)
m_const = tf.constant(3.)
my_product = tf.multiply(x_data, m_const)
for x_val in x_vals:
    print(sess.run(my_product, feed_dict={x_data:x_val}))

Tensorflow的嵌入Layer

import tensorflow as tf
sess = tf.Session()
# 創(chuàng)建數(shù)據(jù)和占位符
my_array = np.array([[1., 3., 5., 7., 9.],
                     [-2., 0., 2., 4., 6.],
                     [-6., -3., 0., 3., 6.]])
x_vals = np.array([my_array, my_array+1])
x_data = tf.placeholder(shape=(3,5), dtype=tf.float32)
# 創(chuàng)建常量矩陣
m1 = tf.constant([[1.], [0.], [-1.], [2.], [4.]]) # 5x1矩陣
m2 = tf.constant([[2.]]) # 1x1矩陣
a1 = tf.constant([[10.]]) # 1x1矩陣
# 聲明操作, 表示成計算圖
prod1 = tf.matmul(x_data, m1) # 3x5 乘以 5x1 = 3x1
prod2 = tf.matmul(prod1, m2) # 3x1 乘以標量 = 3x1
add1 = tf.add(prod2, a1)
# 賦值
for x_val in x_vals:
    print(sess.run(add1, feed_dict={x_data: x_val}))
sess.close()

注意:對于事先不知道的維度大小闯传,可以用None代替殿漠。例如:

x_data = tf.placeholder(dtype=tf.float32, shape=(3,None))

Tensorflow的多層layer

對2D圖像數(shù)據(jù)進行滑動窗口平均赴精,然后通過自定義操作層Layer返回結(jié)果。

import tensorflow as tf
import numpy as np
sess = tf.Session()
# 創(chuàng)建2D圖像绞幌,4X4像素蕾哟。
x_shape = [1, 4, 4, 1] # [batch, in_height, in_width, in_channels] tensorflow處理(圖片數(shù)量,高度、寬度谭确、顏色)思維圖像數(shù)據(jù)
x_val = np.random.uniform(size=x_shape)
# 占位符
x_data = tf.placeholder(dtype=tf.float32, shape=x_shape)
# 創(chuàng)建滑動窗口
my_filter = tf.constant(0.25, shape=[2,2,1,1]) # [filter_height, filter_width, in_channels, out_channels]
my_strides = [1, 2, 2, 1] # 長寬方向滑動步長均為2
mov_avg_layer = tf.nn.conv2d(x_data, my_filter, my_strides, 
                            padding='SAME', name='Moving_avg_Window')
# 定義一個自定義Layer帘营,操作上一步滑動窗口的2x2的返回值。
# 自定義函數(shù)將輸入張量乘以一個2X2的矩陣張量逐哈,然后每個元素加1.因為矩陣乘法只計算二維矩陣芬迄,所以裁剪多余維度(大小為1的維度)。Tensorflow通過內(nèi)建函數(shù)squeeze()函數(shù)裁剪昂秃。
def custom_layer(input_matrix):
    input_matrix_squeezed = tf.squeeze(input_matrix)
    A = tf.constant([[1., 2.], [-1., 3.]])
    b = tf.constant(1., shape=[2,2])
    temp1 = tf.matmul(A, input_matrix_squeezed)
    temp = tf.add(temp1, b) # Ax+b
    return (tf.sigmoid(temp))
# 把剛剛定義的Layer加入到計算圖中禀梳,并用tf.name_scope()命名Layer名稱。
with tf.name_scope('Custom_Layer') as scope:
    custom_layer1 = custom_layer(mov_avg_layer)
# 傳入數(shù)據(jù)械蹋,執(zhí)行
print(sess.run(custom_layer1, feed_dict={x_data:x_val}))
# 關(guān)閉會話出皇,釋放資源
sess.close()

Tensorflow實現(xiàn)損失函數(shù)

損失函數(shù)對機器學(xué)習(xí)來講非常重要,它度量模型輸出值與目標值之間的差距哗戈。

回歸問題常用損失函數(shù)

import matplotlib.pyplot as plt
import tensorflow as tf
sess = tf.Session()
# 創(chuàng)建數(shù)據(jù)
x_vals = tf.linspace(-1., 1., 500)
target = tf.constant(0.)
# L2正則損失函數(shù):預(yù)測值與目標值差距的平方和郊艘。
# L2正則損失函數(shù)在目標值附近有更好的曲度,機器學(xué)習(xí)算法利用這點收斂唯咬,并且離目標越近收斂越慢纱注。
l2_y_vals = tf.square(target - x_vals)
l2_y_out = sess.run(l2_y_vals)
# 注意:tensorflow有內(nèi)建的L2正則形式:nn.l2_loss()。這個函數(shù)實際上是L2正則的1/2
# L1正則損失函數(shù):預(yù)測值與目標值差值平均值
# L1正則在目標值附近不平滑胆胰,導(dǎo)致算法不能很好的收斂狞贱。
l1_y_vals = tf.abs(target - x_vals)
l1_y_out = sess.run(l1_y_vals)
# Pseudo-Huber損失函數(shù):Huber損失函數(shù)的連續(xù)、平滑估計
# 試圖利用L1和L2正則消減極值處的陡峭蜀涨,是的目標值附近連續(xù)瞎嬉。
# 其表達式依賴參數(shù)delta
delta1 = tf.constant(0.25)
phuber1_y_vals = tf.multiply(tf.square(delta1), tf.sqrt(1.+tf.square((target-x_vals)/delta1))-1.)
phuber1_y_out = sess.run(phuber1_y_vals)
delta2 = tf.constant(5.)
phuber2_y_vals = tf.multiply(tf.square(delta2), tf.sqrt(1.+tf.square((target-x_vals)/delta2))-1.)
phuber2_y_out = sess.run(phuber2_y_vals)

關(guān)于Huber函數(shù)

L1正則在目標值處不平滑。L2正則在異常值處過大厚柳,會放大異常值的影響氧枣。因此,Huber函數(shù)在目標值附近(小于delta)是L2正則别垮,在大于delta處是L1正則便监。解決上述問題。
參考
Huber損失函數(shù)

繪圖展示回歸算法損失函數(shù)

x_array = sess.run(x_vals)
plt.plot(x_array, l2_y_out, 'b-', label='L2 Loss')
plt.plot(x_array, l1_y_out, 'r--', label='L1 Loss')
plt.plot(x_array, phuber1_y_out, 'k-', label='P-Huber Loss (0.25)')
plt.plot(x_array, phuber2_y_out, 'g:', label='P-Huber Loss (0.5)')
plt.ylim(-0.2, 0.4)
plt.legend(loc='lower right', prop={'size':11})
plt.show()

回歸算法損失函數(shù)入下圖所示:


regression_loss_function.png

可以看出碳想,L2損失函數(shù)離0點越遠烧董,損失會被2次方放大。L1損失函數(shù)在0點處不可導(dǎo)胧奔。P-Huber損失函數(shù)則在0點出是近似的L2損失函數(shù)逊移,在遠離零點處是近似的斜線。既解決了L1損失梯度下降算法可能不收斂的問題龙填,又減少了異常值的影響螟左。

分類問題常用損失函數(shù)

# 創(chuàng)建數(shù)據(jù)
x_vals = tf.linspace(-3., 5., 500)
target = tf.constant(1.)
targets = tf.fill([500,], 1)
# Hinge 損失函數(shù):評估支持向量機算法啡浊,有時也用來評估神經(jīng)網(wǎng)絡(luò)算法。
hinge_y_vals = tf.maximum(0., 1. - tf.multiply(target, x_vals))
hinge_y_out = sess.run(hinge_y_vals)
# 兩類交叉熵損失函數(shù)(cross-entropy loss):
xentropy_y_vals = -tf.multiply(target, tf.log(x_vals)) - tf.multiply((1.-target), tf.log(1. - x_vals))
xentropy_y_out = sess.run(xentropy_y_vals)
# Sigmoid交叉熵損失函數(shù):與上面的交叉熵損失函數(shù)非常類似胶背,只是先將x_vals值通過sigmoid轉(zhuǎn)換在計算交叉熵巷嚣。
xentropy_sigmoid_y_vals = tf.nn.sigmoid_cross_entropy_with_logits(labels = target, logits = x_vals)
xentropy_sigmoid_y_out = sess.run(xentropy_sigmoid_y_vals)
# 加權(quán)交叉熵損失函數(shù):Sigmoid交叉熵損失函數(shù)的加權(quán),對正目標加權(quán)钳吟。
weight = tf.constant(0.5)
xentropy_weighted_y_vals = tf.nn.weighted_cross_entropy_with_logits(targets = targets, logits = x_vals, pos_weight = weight)
xentropy_weighted_y_out = sess.run(xentropy_weighted_y_vals)
# Softmax交叉熵損失函數(shù):作用于非歸一化的輸出結(jié)果廷粒,只針對單個目標分類的計算損失。
unsacled_logits = tf.constant([[1., -3., 10.]])
target_dist = tf.constant([[0.1, 0.02, 0.88]])
softmax_xentropy = tf.nn.sotfmax_entropy_with_logits(logits = unscaled_logits, labels = target_dist)
print(sess.run(softmax_xentropy)
# 稀疏Softmax交叉熵損失函數(shù)
unscaled_logits = tf.constant([[1., -3., 10.]])
sparse_target_dist = tf.constant([2])
sparese_xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = unscaled_logits, labels = sparse_target_dist)
print(sess.run(sparse_xentropy))

關(guān)于交叉熵的說明

1 信息量

假設(shè)我們聽到了兩件事:
A:巴西隊進入了2018世界杯決賽圈红且;B:中國隊進入了2018世界杯決賽圈坝茎。
直覺上來說,事件B比事件A包含的信息量大暇番,因為小概率事件發(fā)生了嗤放,一定是有些我們不知道的東西。因此壁酬,這樣定義信息量:
假設(shè)X是一個離散型隨機變量次酌,其取值集合為\chi,概率分布函數(shù) p(x) = Pr(X=x),x\in \chi,則定義事件X=x_0的信息量為:
I(x_0) = -log(p(x_0))

信息量函數(shù)如下圖所示:

image

可以看出-log(x)函數(shù)刻畫的信息量舆乔,x越接近零越大岳服,越接近1越小。這里便可以理解二分類問題中的logistics回歸的損失函數(shù)-y*log(y_hat)-(1-y)*log(1-y_hat), 它會給錯誤分類很大的懲罰希俩。比如吊宋,在y=1是,y_hat如果接近0颜武,會導(dǎo)致loss很大璃搜,同樣y=0時,y_hat接近1鳞上,也會導(dǎo)致loss很大这吻。因此在最小化Loss函數(shù)時,會盡可能的將y=1的y_hat預(yù)測成1因块,y=0的y_hat預(yù)測為0。

2 熵

對于某個事件籍铁,有n中可能涡上,那么求其n中可能的信息量的期望,便是熵拒名。即熵:
H(X) = - \Sigma_{i=1}^np(x_i)*log(p(x_i))

3 相對熵(KL散度)

相對熵又稱KL散度吩愧,如果對于隨機變量x有兩個概率分布P(x)和Q(x),我們可以使用KL散度來衡量兩個分布的差異。KL散度的計算公式:
D_{KL}(p||q)=\Sigma_{i=1}^np(x_i)*log(\frac{p(x_i)}{q(x_i)})
可見當q和p的分布越接近時增显,KL散度越小雁佳。當q和p為相同的分布是脐帝,KL散度為0。

4 交叉熵

在機器學(xué)習(xí)里糖权,p是樣本的真實分布堵腹。比如貓狗鼠的分類問題,一個樣本點(是貓)的實際分布是(1,0,0)星澳。而q是模型預(yù)測分布疚顷,比如(0.8,0.1,0.1)。那么我們模型訓(xùn)練的目標可以設(shè)置為是的p禁偎、q的KL散度最小化腿堤,即q盡可能接近真實的p分布。
而:
\begin{aligned} D_{KL}(p||q) &= \Sigma_{i=1}^np(x_i)*log(\frac{p(x_i)}{q(x_i)}) \\ &=\Sigma_{i=1}^np(x_i)*log(p(x_i))-\Sigma_{i=1}^np(x_i)*log(q(x_i)) \\ &=-H(p(x))+H(p,q) \end{aligned}
其中如暖,H(p(x))=-\Sigma_{i=1}^np(x_i)*log(p(x_i)),是p分布的熵笆檀;H(p,q)=-\Sigma_{i=1}^np(x_i)*log(q(x_i))是p和q的交叉熵。由于p是樣本的真實分布盒至,所以H(p(x))是一個常數(shù)值酗洒。那么KL散度最小化也就等價于交叉熵的最小化。

參考
關(guān)于交叉熵在loss函數(shù)中使用的理解

關(guān)于Softmax損失函數(shù)和稀疏Softmax損失函數(shù)的說明

首先妄迁,Softmax和系數(shù)Softmax損失函數(shù)最大的不同是輸入的labels不同寝蹈。對于某一個樣本點,Softmax損失函數(shù)輸入的labels是各分類的實際概率登淘,例如貓狗鼠分類箫老,就是(1,0,0)這樣的向量。對于m各樣本點黔州,輸入的labels則是一個m*3的矩陣耍鬓。而稀疏Softmax,輸入labels是實際所屬類別的index流妻,比如這里是(1,0,0)牲蜀,則輸入就是0。m個樣本點绅这,輸入是m維向量涣达,向量里面的內(nèi)容是該樣本點所屬類別的索引。
對于單個樣本點证薇,多分類的交叉熵如下:
H_i = -\Sigma_{j=1}^k[y_i]_j*log([p(x_i)]_j), 其中度苔,y_i是樣本點i各類別的實際概率分布(例如(1,0,0)),p(x_i)是預(yù)測概率分布(例如(0.7,0.2,0.1))浑度。對于Softmax函數(shù)寇窑,我們需要計算log(0.7),log(0.2),log(0.1)。但由于log(0.2),log(0.1)前面乘以的實際的[y_i]_j是零箩张,實際上是沒有必要計算的甩骏。這樣窗市,Softmax損失函數(shù)就會造成算力的浪費,尤其深度學(xué)習(xí)的數(shù)據(jù)量非常大饮笛,這種浪費往往不能忍受咨察。而稀疏Softmax則只計算[y_i]_j=1時的log([p(x_i)]_j)(這里即log(0.7),可以大大的提升計算性能缎浇。因此握础,對于這種實際分布只有一個1症概,其他全為零的排他性分類問題,Softmax和稀疏Softmax損失函數(shù)沒有本質(zhì)上的區(qū)別,只是后者在計算性能上有一個優(yōu)化观堂。

評價機器學(xué)習(xí)模型的其他指標

指標 描述
R^2 對簡單線性模型來講击吱,用于度量因變量中可由自變量解釋部分所占比例凹蜂。
RMSE (平均方差) 對連續(xù)模型來講弟头,是度量預(yù)測值和觀測值之差的樣本標準差。
混淆矩陣(Confusion matrix) 對分類模型來講踩验,以矩陣形式將數(shù)據(jù)集中的記錄按照真實的類別與預(yù)測類別兩個標準進行分析匯總鸥诽,其列代表預(yù)測類別,行代表實際類別箕憾。理想情況下牡借,混淆矩陣是對角矩陣。
查全率(Recall) 正類中有多少被正確預(yù)測(正類中被正確預(yù)測為正類的比例)袭异。
查準率(Precision) 被預(yù)測為正類的樣本中有多少是真的正類钠龙。
F值(F-score) 對于分類模型來講,F(xiàn)值是查全率和查準率的調(diào)和平均數(shù)

Tensorflow實現(xiàn)反向傳播

簡單的回歸例子

這個例子很簡單御铃,是一個一元線性回歸模型y=Ax碴里。x是均值為1,標準差0.1的標準正態(tài)分布生成的100個樣本點上真。y都是10咬腋。這樣回歸參數(shù)A應(yīng)該是10左右。

# 1 導(dǎo)入包
import numpy as np
import tensorflow as tf
# 2 創(chuàng)建會話
sess = tf.Session()
# 3 生成數(shù)據(jù)睡互,創(chuàng)建占位符和變量
x_vals = np.random.normal(1, 0.1, 100) # 均值為1根竿,標準差為0.1,100個樣本點
y_vals = np.repeat(10., 100) # 10
x_data = tf.placeholder(shape=[1], dtype=tf.float32)
y_target = tf.placeholder(shape=[1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1]))
# 4 模型
my_output = tf.multiply(x_data, A) 
# 5 增加L2正則損失函數(shù)
loss = tf.square(my_output - y_target) # 這里損失函數(shù)是單個樣本點的損失就珠,因為一次訓(xùn)練只隨機選擇一個樣本點
# 6 初始化變量
init = tf.initialize_all_variables()
sess.run(init)
# 7 聲明變量的優(yōu)化器寇壳。設(shè)置學(xué)習(xí)率。
my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.02)
train_step = my_opt.minimize(loss)
# 8 訓(xùn)練算法
for i in range(100):
    rand_index = np.random.choice(100) # 隨機選擇一個樣本點
    rand_x = [x_vals[rand_index]]
    rand_y = [y_vals[rand_index]]
    sess.run(train_step, feed_dict={x_data:rand_x, y_target:rand_y})
    if (i+1)%25 == 0:
        print('Step #' + str(i) + ' A = ' + str(sess.run(A)))
        print('Loss = ' + str(sess.run(loss, feed_dict={x_data:rand_x, y_target:rand_y})))
# 9 關(guān)閉會話
sess.close()
# 輸出結(jié)果如下:
Step #24 A = [4.863781] b = 4.139231
Loss = [1.2424334]
Step #49 A = [5.316289] b = 4.6542783
Loss = [0.7101963]
Step #74 A = [5.27029] b = 4.6673064
Loss = [0.3602042]
Step #99 A = [5.211789] b = 4.67501
Loss = [0.12189686]

簡單的分類例子

這是一個簡單的二分類問題嗓违。100個樣本點九巡,其中50個由N(-1,1)生成图贸,標簽為0蹂季,50個由N(3,1)生成冕广,標簽為1。用sigmoid函數(shù)實現(xiàn)二分類問題偿洁。模型設(shè)置為sigmoid(A+x)撒汉。兩類數(shù)據(jù)中心點的中點是1,可見A應(yīng)該在-1附近涕滋。

# 1 引入python包
import tensorflow as tf
import numpy as np
# 2 創(chuàng)建會話
sess = tf.Session()
# 3 生成數(shù)據(jù)睬辐,創(chuàng)建變量和占位符
x_vals = np.concatenate((np.random.normal(-1, 1, 50),
                        np.random.normal(3, 1, 50)))
y_vals = np.concatenate((np.repeat(0., 50), 
                        np.repeat(1., 50)))
x_data = tf.placeholder(shape=[1], dtype=tf.float32)
y_target = tf.placeholder(shape=[1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(mean=10, shape=[1]))

# 模型。y_pre = sigmoid(A+x)宾肺。
# 這里不必封裝sigmoid函數(shù)溯饵,因為損失函數(shù)中會實現(xiàn)此功能
my_output = tf.add(x_data, A)

# 增加一個批量維度,使其滿足損失函數(shù)的輸入要求锨用。
my_output_expanded = tf.expand_dims(my_output, 0)
y_target_expanded = tf.expand_dims(y_target, 0)

# 初始化變量A
init = tf.initialize_all_variables()
sess.run(init)

# 損失函數(shù)
xentropy = tf.nn.sigmoid_cross_entropy_with_logits(logits = my_output_expanded, 
                                                   labels = y_target_expanded)

# 優(yōu)化器
my_opt = tf.train.GradientDescentOptimizer(learning_rate = 0.05)
train_step = my_opt.minimize(xentropy)

# 迭代訓(xùn)練
for i in range(1400):
    rand_index = np.random.choice(100)
    rand_x = [x_vals[rand_index]]
    rand_y = [y_vals[rand_index]]
    
    sess.run(train_step, feed_dict={x_data:rand_x, y_target:rand_y})
    if (i+1)%200 == 0:
        print('Step #' + str(i+1) + ' A= ' + str(sess.run(A)))
        print('Loss = ' + str(sess.run(xentropy, feed_dict={x_data: rand_x,
                                                            y_target: rand_y})))
# 關(guān)閉會話
sess.close()
# 輸出結(jié)果如下:
Step #200 A= [6.4651575]
Loss = [[5.8275104]]
Step #400 A= [1.9440486]
Loss = [[1.3305019]]
Step #600 A= [-0.04775457]
Loss = [[0.11453534]]
Step #800 A= [-0.66482824]
Loss = [[0.03918179]]
Step #1000 A= [-1.0784857]
Loss = [[0.04238104]]
Step #1200 A= [-1.0975529]
Loss = [[0.06028807]]
Step #1400 A= [-1.0565817]
Loss = [[0.16332036]]

算法步驟總結(jié)

  1. 生成數(shù)據(jù)或加載數(shù)據(jù)
    2.設(shè)置占位符和變量,初始化變量增拥。
    3.創(chuàng)建損失函數(shù)啄巧。
    4.定義優(yōu)化器算法。
    5.通過隨機樣本反復(fù)迭代掌栅,更新變量秩仆。

Tensorflow 實現(xiàn)隨機訓(xùn)練和批量訓(xùn)練

上面的反向傳播算法的例子,一次操作一個數(shù)據(jù)點猾封,可能會導(dǎo)致比較古怪的學(xué)習(xí)過程澄耍。本節(jié)介紹隨機批量訓(xùn)練。

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
sess = tf.Session()

# 1 聲明批量大小忘衍。即一次傳入多少數(shù)據(jù)量
batch_size = 20
# 2 生成數(shù)據(jù)逾苫,設(shè)置占位符和變量
x_vals = np.random.normal(1, 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32) # None會自動匹配batch大小
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1,1]))
# 3 模型
my_output = tf.matmul(x_data, A)
# 4 損失函數(shù)
loss = tf.reduce_mean(tf.square(my_output - y_target))
# 5 聲明優(yōu)化器
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)
# 初始化變量A
init = tf.initialize_all_variables()
sess.run(init)
# 6 迭代訓(xùn)練
loss_batch = []
for i in range(100):
    rand_index = np.random.choice(100, size = batch_size)
    rand_x = np.transpose([x_vals[rand_index]])
    rand_y = np.transpose([y_vals[rand_index]])
    
    sess.run(train_step, feed_dict={x_data:rand_x, y_target:rand_y})
    if (i+1)%5==0:
        print('Step # '+ str(i+1) + ' A = ' + str(sess.run(A)))
        temp_loss = sess.run(loss, feed_dict={x_data:rand_x, y_target:rand_y})
        print('Loss = '+ str(temp_loss))
        loss_batch.append(temp_loss)
# 關(guān)閉會話
sess.close()

本段實現(xiàn)的仍是那個線性回歸的例子。唯一的不同是枚钓,上面每次優(yōu)化過程計算的損失函數(shù)只用到一個隨機樣本點铅搓。而本處用到batch_size=20個隨機樣本點,損失函數(shù)是這20個隨機樣本點損失函數(shù)的平均值搀捷。


TensorFlow實現(xiàn)創(chuàng)建分類器

這里用到iris鳶尾花數(shù)據(jù)集星掰。iris有三種花,這里只預(yù)測是否是山鳶尾嫩舟。

# 1 導(dǎo)入包氢烘、創(chuàng)建會話
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
import tensorflow as tf
sess = tf.Session()

# 2 導(dǎo)入數(shù)據(jù)集
iris = datasets.load_iris()
binary_target = np.array([1. if x==0 else 0. for x in iris.target]) # 山鳶尾標簽設(shè)置為0
iris_2d = np.array([[x[2], x[3]] for x in iris.data])

# 3 聲明批大小、占位符和變量
batch_size = 20
x1_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
x2_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1,1]))
b = tf.Variable(tf.random_normal(shape=[1,1]))

# 4 模型:x1 - Ax2 -b
my_mult = tf.matmul(x2_data, A)
my_add = tf.add(my_mult, b)
my_output = tf.subtract(x1_data, my_add)

# 5 Loss函數(shù)
xentropy = tf.nn.sigmoid_cross_entropy_with_logits(labels = y_target, logits = my_output)

# 6 優(yōu)化器
my_opt = tf.train.GradientDescentOptimizer(0.05)
train_step = my_opt.minimize(xentropy)

# 7 初始化變量
init = tf.initialize_all_variables()
sess.run(init)

# 8 訓(xùn)練模型
for i in range(1000):
    rand_index = np.random.choice(len(iris_2d), size=batch_size)
    rand_x = iris_2d[rand_index]
    rand_x1 = np.array([[x[0]] for x in rand_x])
    rand_x2 = np.array([[x[1]] for x in rand_x])
    rand_y = np.array([[y] for y in binary_target[rand_index]])
    sess.run(train_step, feed_dict={x1_data:rand_x1, x2_data:rand_x2, y_target:rand_y})
    if (i+1)%200 == 0:
        print('Step #' + str(i+1) +' A= '+ str(sess.run(A)) + ',b='+str(sess.run(b)))
sess.close()
輸出如下:
Step #200 A= [[8.594328]],b=[[-3.3715847]]
Step #400 A= [[10.06079]],b=[[-4.6303725]]
Step #600 A= [[11.153477]],b=[[-5.2268066]]
Step #800 A= [[11.741766]],b=[[-5.9545264]]
Step #1000 A= [[12.346895]],b=[[-6.3250523]]

Tensorflow實現(xiàn)模型評估

回歸

這里用MSE評估

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
sess = tf.Session()
x_vals = np.random.normal(1., 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[None, 1], dtype = tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype = tf.float32)
batch_size = 25
train_indices = np.random.choice(len(x_vals), 
                                 round(len(x_vals)*0.8), replace=False) # False表示不放回
test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(shape=[1,1]))

#2. 聲明算法模型家厌、損失函數(shù)和優(yōu)化器
my_output = tf.matmul(x_data, A)
loss = tf.reduce_mean(tf.square(my_output - y_target))
init = tf.initialize_all_variables()
sess.run(init)
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)
#3. 訓(xùn)練代碼
for i in range(100):
    rand_index = np.random.choice(len(x_vals_train), size=batch_size)
    rand_x = np.transpose([x_vals_train[rand_index]])
    rand_y = np.transpose([y_vals_train[rand_index]])
    sess.run(train_step, feed_dict={x_data:rand_x, y_target:rand_y})
    if (i+1)%25 == 0:
        print('Step #'+ str(i+1) + ' A= ' + str(sess.run(A)))
        print('Loss = ' + str(sess.run(loss, feed_dict={x_data:rand_x, y_target:rand_y})))

#4. 評估訓(xùn)練模型
mse_test = sess.run(loss, feed_dict = {x_data:np.transpose([x_vals_test]),
                                       y_target:np.transpose([y_vals_test])})
mse_train = sess.run(loss, feed_dict = {x_data:np.transpose([x_vals_train]),
                                        y_target:np.transpose([y_vals_train])})
print('MSE on test:' + str(np.round(mse_test, 2 )))
print('MSE on train:' + str(np.round(mse_train, 2)))
sess.close()

分類

# 引入包
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
# 創(chuàng)建計算圖播玖、加載數(shù)據(jù)、創(chuàng)建占位符和變量
sess = tf.Session()
batch_size = 25
x_vals = np.concatenate((np.random.normal(-1,1,50), np.random.normal(3, 1, 50))) 
y_vals = np.concatenate((np.repeat(0., 50), np.repeat(1.,50)))
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None,1], dtype=tf.float32)

# 分割數(shù)據(jù)集為訓(xùn)練集和測試集
train_indices = np.random.choice(len(x_vals), 
                                 round(len(x_vals)*0.8), replace=False) # False表示不放回
test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(mean=10,shape=[1,1]))

# 設(shè)置模型
my_output = tf.add(x_data,A)

# 初始化變量
init = tf.initialize_all_variables()
sess.run(init)

# 損失函數(shù)和優(yōu)化器
xentropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = my_output, labels=y_target))
my_opt = tf.train.GradientDescentOptimizer(0.05)
train_step = my_opt.minimize(xentropy)

# 訓(xùn)練模型
for i in range(1800):
    rand_index = np.random.choice(len(x_vals_train), size=batch_size)
    rand_x = np.transpose([x_vals_train[rand_index]])
    rand_y = np.transpose([y_vals_train[rand_index]])
    sess.run(train_step, feed_dict={x_data:rand_x,
                                    y_target:rand_y})
    if (i+1)%200 ==0:
        print('Step #'+ str(i+1) + ' A= ' + str(sess.run(A)))
        print('Loss = ' + str(sess.run(xentropy, feed_dict={x_data:rand_x, y_target:rand_y})))
        
# 模型評估
y_prediction = tf.round(tf.nn.sigmoid(tf.add(x_data, A)))
correct_prediction = tf.squeeze(tf.equal(y_prediction, y_target))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
acc_value_test = sess.run(accuracy, feed_dict={x_data:np.transpose([x_vals_test]), 
                                               y_target:np.transpose([y_vals_test])})
acc_value_train = sess.run(accuracy, feed_dict={x_data:np.transpose([x_vals_train]), 
                                                y_target:np.transpose([y_vals_train])})
print('Accuracy on train set:' + str(acc_value_train))
print('Accuracy on test set:' + str(acc_value_test))


# 畫圖
A_result = -sess.run(A)
bins = np.linspace(-5, 5, 50)
plt.hist(x_vals[0:50], bins, alpha=0.5, label='N(-1,1)', color='blue')
plt.hist(x_vals[50:100], bins[0:50], alpha=0.5, label='N(2,1)', color='red')
plt.axvline(A_result, color = 'k', ls = '--', linewidth=1, label='A='+str(np.round(A_result, 2)))
plt.legend(loc='upper right')
plt.show()
sess.close()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饭于,一起剝皮案震驚了整個濱河市蜀踏,隨后出現(xiàn)的幾起案子维蒙,更是在濱河造成了極大的恐慌,老刑警劉巖果覆,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅痊,死亡現(xiàn)場離奇詭異,居然都是意外死亡局待,警方通過查閱死者的電腦和手機斑响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钳榨,“玉大人舰罚,你說我怎么就攤上這事⊙Τ埽” “怎么了沸停?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昭卓。 經(jīng)常有香客問我愤钾,道長,這世上最難降的妖魔是什么候醒? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任能颁,我火速辦了婚禮,結(jié)果婚禮上倒淫,老公的妹妹穿的比我還像新娘伙菊。我一直安慰自己,他們只是感情好敌土,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布镜硕。 她就那樣靜靜地躺著,像睡著了一般返干。 火紅的嫁衣襯著肌膚如雪兴枯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天矩欠,我揣著相機與錄音财剖,去河邊找鬼。 笑死癌淮,一個胖子當著我的面吹牛躺坟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳蓄,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咪橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起美侦,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤店诗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后音榜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡捧弃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年赠叼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违霞。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘴办,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出买鸽,到底是詐尸還是另有隱情涧郊,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布眼五,位于F島的核電站妆艘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏看幼。R本人自食惡果不足惜批旺,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诵姜。 院中可真熱鬧汽煮,春花似錦、人聲如沸棚唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宵凌。三九已至鞋囊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞎惫,已是汗流浹背失暴。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留微饥,地道東北人逗扒。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像欠橘,于是被迫代替她去往敵國和親矩肩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 傍晚我們穿過檸檬桉林 白樹干像露水一束束 在林間滑落 濕透地穿過馬路 到達一片野花地 蜻蜓紅開得燦爛極了 我看見一...
    葉樹yeshu閱讀 237評論 0 2
  • 翻開這本書,我震驚了黍檩!的確是很重口味啊叉袍,話題多以“多重人格”、“性怪癖”刽酱、“死亡”喳逛、“焦慮抑郁”展開。這本書的目的...
    威明海閱讀 677評論 0 1
  • 對于我們個人來說棵里,日常生活中润文,不知不覺就在受商家宣導(dǎo)的影響。 昨天我坐高鐵出差殿怜,在上海虹橋高鐵站二層典蝌,各種餐飲店琳...
    conMark閱讀 615評論 0 2
  • 一百零四年前的今天,卡夫卡在信中表達對菲莉絲的思念头谜。 他在信里寫:“我想……在寧靜和幸福中思念你骏掀,最后也許整夜不能...
    江昭和閱讀 1,099評論 11 37
  • 每當意識到自己有點急躁的時候,都會好好和自己說一聲:“親愛的柱告,別急截驮,慢慢來〖识龋” 朋友們看到我和小朋友們玩在一起的時...
    曾琦閱讀 415評論 0 0