TensorFlow--簡單的數據生成、初始化、線性模型

數據的生成

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

num_input = 2 #輸入維度
num_spamle = 1000 #樣本數目

true_w = [2, -3.4]
true_bais = 4.2

X = np.random.randn(num_spamle,num_input) #隨機生成num_spamle個,num_input列的樣本
Y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_bais #根據X生成Y
Y += 0.01 * np.random.normal(size = num_spamle) 
print(X[0, :], Y[0], type(X))

[ 0.4512227  -0.45055156] 6.632301299956741 <class 'numpy.ndarray'>

數據的讀取

import random
batch_size = 10

def data_iter():
    #產生一個隨機索引
    idx = list(range(num_spamle))
    random.shuffle(idx) #將序列中所有元素隨機排序
    for i in range(0, num_spamle, batch_size):# range(初始,停止,步長)
        j = np.array(idx[i: min(i + batch_size, num_spamle)])
        yield np.take(X, j, axis = 0), np.take(Y, j) #yield 相當於 return,並且記住這個返回的位置,下次迭代就從這個位置後開始;np.take取X中第j個元素
    

維度問題!!!

一定要注意label的維度,這裏label的維度是(10,)而不是(10,1),(10,)代表一行有十個數,而(10,1)代表10行1列。

for data, label in data_iter():
    print(data)
    print(label)
    print((np.array(label)).shape)# 注意!
    break
[[ 0.71430686 -2.14011663]
 [-1.07673916  2.64886282]
 [-0.5625033   0.54891128]
 [-0.11098975 -0.59949876]
 [-1.92428574 -0.44010133]
 [ 0.80995279 -0.44947868]
 [ 0.01774474  1.04054451]
 [-1.98710738  0.68311727]
 [ 1.27237413  0.38369182]
 [ 1.02159229  1.42849156]]
[12.90140472 -6.95005583  1.22401706  6.02909204  1.83953065  7.34668017
  0.70044279 -2.1050857   5.43788543  1.37627598]
(10,)

初始胡模型參數

w_tf = tf.Variable(tf.random_normal([num_input, 1]))
b_tf = tf.Variable(tf.random_normal([1]))

定義符號變量

IN = tf.placeholder('float',name='IN')
OUT = tf.placeholder('float',name='OUT')

模型建立

線性模型:輸入成模型加上偏移量

y_model = tf.matmul(IN, w_tf) + b_tf
tf.summary.histogram('output', y_model) #創建直方圖
<tf.Tensor 'output_1:0' shape=() dtype=string>

損失函數

loss = tf.reduce_mean(tf.pow(y_model - OUT, 2))    
tf.summary.scalar('loss', loss) #創建刻度圖
<tf.Tensor 'loss_1:0' shape=() dtype=string>
merged_summary_op = tf.summary.merge_all() #定義融合所有需要記錄節點的信息到這個節點

優化

learning_rate = .002
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

定義會話

sess = tf.Session()
init = tf.global_variables_initializer()  #初始化
sess.run(init)
writer = tf.summary.FileWriter('E:\YanQiLake\DL\log', sess.graph) #創建日誌節點,在變量初始化之後

迭代求解

迭代過程就是一個綜合之前步驟的過程,在此步驟開始輸入數據用tensor進行求解了,輸入數據要仔細,如果輸入數據的維度與初始化的維度不同,會報錯:InvalidArgumentError,如果對模型的輸出維度不確定,可以任取一組輸入數據帶入到計算網絡進行驗證:

for data, label in data_iter():
   mm = sess.run(y_model, feed_dict = {IN: np.array(data)})
   break
print(mm.shape)

在這裏,要保證y_model已經寫成了可以用Tensor計算的形式:y_model = tf.matmul(IN, w_tf) + b_tf(保證有初始化的輸入變量:這裏是IN)

epochs = 10
loss_list = []
for e in range(epochs):
    total_loss = 0
    for data, label in data_iter():
        #mm = sess.run(y_model, feed_dict = {IN: np.array(data)})
        #break
        _, total_loss, summary =sess.run([train_op, loss, merged_summary_op], feed_dict={IN: np.array(data), OUT: np.array(label).reshape(10,1)}) #注意由於label的維度是(10,)這裏要reshape一下子
        # 由於(10,)和(10,1)其實就是差了一個轉置,也可以將reshape寫成:OUT: np.array(label).T
        loss_list.append(total_loss)
        writer.add_summary(summary, e)
        W, B = sess.run([w_tf, b_tf]) #得到估計的線性模型的權重和偏差
writer.close()
sess.close
#plt.plot(loss_list) #爲什麼loss沒有呈現遞減的趨勢,但是仍然可以估計出權重和偏差?
print(W)
print(B)
[[ 1.9943074]
 [-3.3486376]]
[4.1264563]
plt.plot(loss_list) 

在這裏插入圖片描述

用tensorboard顯示計算圖

tensorboard --logdir=E:\YanQiLake\DL\log

注意

  • 存放log的路徑是絕對路徑,並且路徑名稱中不可以包含漢子或者空格
  • 命令中的等號前後絕對不能有空格,tensorboard --logdir = E:\YanQiLake\DL\log,這樣寫是錯誤的,會產生**No dashboards are active for the current data set.**的錯誤!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章