數據的生成
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.**的錯誤!