#tensorflow筆記
一個(gè)小例子
#用numpy構(gòu)造數(shù)據(jù)
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3
#tf.Variable定義了一個(gè)變量苗傅,random_uniform表示用隨機(jī)的方式生成變量的初始值
#1表示這個(gè)變量是一維的压状,變量的初始范圍是-1到1
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
#定了變量初始值為0
biases = tf.Variable(tf.zeros([1]))
#預(yù)測(cè)的y勺届,由真實(shí)的數(shù)據(jù)x_data來(lái)表示
y = Weights*x_data + biases
#定義損失函數(shù)缅疟,實(shí)際的y與定義的y_data的差值
loss = tf.reduce_mean(tf.square(y-y_data))
#定義了一個(gè)最原始的優(yōu)化器糙箍,0.5為學(xué)習(xí)率
optimizer = tf.train.GradientDescentOptimizer(0.5)
#用優(yōu)化器減小誤差
train = optimizer.minimize(loss)
#建立了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)盖矫,在使用這個(gè)結(jié)構(gòu)之前大猛,我們必須先初始化所有之前定義的Variable初始化
init = tf.global_variables_initializer()
#用Session來(lái)run每一次training的數(shù)據(jù)
sess = tf.Session()
sess.run(init)
#要訓(xùn)練多少次疼进,就循環(huán)多少次
for step in range(201):
sess.run(train)
if step % 20 == 0:
#每20次訓(xùn)練輸出定義的權(quán)重和偏置值
print(step, sess.run(Weights), sess.run(biases))
Session會(huì)話控制
#定義兩個(gè)矩陣兰迫,tf.constant表示恒量
matrix1 = tf.constant([[3,3]])
matrix2 = tf.constant([[2],
[2]])
#tf.matmul表示矩陣乘法
product = tf.matmul(matrix1,matrix2)
# 兩種Session的打開模式信殊,法1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
#法2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)
Variable 變量
#變量一定要用tf.Variable定義才是變量
#這里定義了變量名為0,變量名為counter汁果,然后打印了變量名字
state = tf.Variable(0, name='counter')
print(state.name)
# 定義常量 one
one = tf.constant(1)
# 定義加法步驟 (注: 此步并沒有直接計(jì)算)
new_value = tf.add(state, one)
# 用tf.assign將 State 更新成為 new_value
update = tf.assign(state, new_value)
# 如果定義 Variable, 就一定要 initialize
# 就是初始化我們定義的變量
init = tf.global_variables_initializer()
# 使用 Session
with tf.Session() as sess:
#必須要run一下init激活我們的結(jié)構(gòu)
sess.run(init)
for _ in range(3):
#每run一次update涡拘,state變量就會(huì)加1
sess.run(update)
#注意這里直接 print(state) 不起作用
print(sess.run(state))
Placeholder 傳入值
#在 Tensorflow 中需要定義 placeholder 的 type ,一般為 float32 類型
input1 = tf.placeholder(tf.float32)
nput2 = tf.placeholder(tf.float32)
# mul = multiply 是將input1和input2 做乘法運(yùn)算据德,并輸出為 output
ouput = tf.multiply(input1, input2)
with tf.Session() as sess:
# 需要傳入的值放在了feed_dict={} 并一一對(duì)應(yīng)每一個(gè)
# input. placeholder 與 feed_dict={} 是綁定在一起出現(xiàn)的
print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
添加層 def add_layer()
#定義添加神經(jīng)層的函數(shù)def add_layer(),
#它有四個(gè)參數(shù):輸入值鳄乏、輸入的大小、輸出的大小和激勵(lì)函數(shù)棘利,我們?cè)O(shè)定默認(rèn)的激勵(lì)函數(shù)是None橱野。
def add_layer(inputs, in_size, out_size, activation_function=None):
#隨機(jī)變量(normal distribution)會(huì)比全部為0要好很多
#這里的weights為一個(gè)in_size行, out_size列的隨機(jī)變量矩陣。
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
#biases的推薦值不為0善玫,所以我們這里是在0向量的基礎(chǔ)上又加了0.1
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
#定義Wx_plus_b, 即神經(jīng)網(wǎng)絡(luò)未激活的值
Wx_plus_b = tf.matmul(inputs, Weights) + biases
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
#返回輸出水援,添加一個(gè)神經(jīng)層的函數(shù)——def add_layer()就定義好了
return outputs
建造神經(jīng)網(wǎng)絡(luò)
#利用占位符定義我們所需的神經(jīng)網(wǎng)絡(luò)的輸入,訓(xùn)練時(shí)再傳值蝌焚!
#tf.placeholder()就是代表占位符
#這里的None代表無(wú)論輸入樣本有多少都可以裹唆,因?yàn)檩斎胫挥幸粋€(gè)特征,所以這里是1只洒。
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
#構(gòu)建輸入層1個(gè)许帐、隱藏層10個(gè)、輸出層1個(gè)神經(jīng)元的神經(jīng)網(wǎng)絡(luò)
#雖然有三個(gè)層毕谴,但是只需要定義兩個(gè)層構(gòu)造函數(shù)即可
#用上面的添加層函數(shù)定義隱藏層成畦,激活函數(shù)用relu
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
#定義輸出層距芬,輸出層輸入的數(shù)據(jù)是隱藏層l1的輸出
prediction = add_layer(l1, 10, 1, activation_function=None)
#計(jì)算預(yù)測(cè)值prediction和真實(shí)值的誤差,對(duì)二者差的平方求和再取平均循帐。
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
#用優(yōu)化器以0.1的效率來(lái)最小化誤差loss框仔。
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
#下面,讓機(jī)器開始學(xué)習(xí)拄养。
#機(jī)器學(xué)習(xí)的內(nèi)容是train_step
#當(dāng)運(yùn)算要用到placeholder時(shí)离斩,就需要feed_dict這個(gè)字典來(lái)指定輸入。
for i in range(1000):
# training
sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
# to see the step improvement
print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
#預(yù)測(cè)對(duì)應(yīng)x值的y值
prediction_value = sess.run(prediction, feed_dict={xs: x_data})
Classification 分類學(xué)習(xí)
#784表示28x28個(gè)特征瘪匿,即一張圖片由784個(gè)像素構(gòu)成
#相當(dāng)于每個(gè)樣本有784個(gè)輸入
xs = tf.placeholder(tf.float32, [None, 784])
#每張圖片都表示一個(gè)數(shù)字跛梗,所以我們的輸出是數(shù)字0到9,共10類棋弥。
#相對(duì)于每個(gè)樣本有10個(gè)輸出的可能
ys = tf.placeholder(tf.float32, [None, 10])
#調(diào)用add_layer函數(shù)搭建一個(gè)最簡(jiǎn)單的訓(xùn)練網(wǎng)絡(luò)結(jié)構(gòu)核偿,只有輸入層和輸出層。
prediction = add_layer(xs, 784, 10, activation_function=tf.nn.softmax)
#loss函數(shù)(即最優(yōu)化目標(biāo)函數(shù))選用交叉熵函數(shù)顽染。
#交叉熵用來(lái)衡量預(yù)測(cè)值和真實(shí)值的相似程度漾岳,如果完全相同,它們的交叉熵等于零粉寞。
cross_entropy = tf.reduce_mean(
-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))
#優(yōu)化器尼荆,train方法(最優(yōu)化算法)采用梯度下降法。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
#現(xiàn)在開始train唧垦,每次只取100張圖片耀找,免得數(shù)據(jù)太多訓(xùn)練太慢。
#mnist是原始樣本集
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})
Dropout 解決 overfitting
#先定義一個(gè)keep_prob
keep_prob = tf.placeholder(tf.float32)
#keep_prob最后在這里使用业崖,表示有50%的結(jié)果不被Dropout掉
#keep_prob即保留概率,即我們要保留的結(jié)果所占比例
sess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5})
#dropout掉Wx_plus_b的50%的結(jié)果
#Wx_plus_b是我們定義的預(yù)測(cè)值
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)
CNN 卷積神經(jīng)網(wǎng)絡(luò)
#定義Weight變量蓄愁,輸入shape双炕,返回變量的參數(shù)。
#其中我們使用tf.truncted_normal產(chǎn)生隨機(jī)變量來(lái)進(jìn)行初始化
def weight_variable(shape):
inital=tf.truncted_normal(shape,stddev=0.1)
return tf.Variable(initial)
#定義biase變量撮抓,輸入shape ,返回變量的一些參數(shù)妇斤。
#其中我們使用tf.constant常量函數(shù)來(lái)進(jìn)行初始化
def bias_variable(shape):
initial=tf.constant(0.1,shape=shape)
return tf.Variable(initial)
#定義卷積,tf.nn.conv2d函數(shù)是tensoflow里面的二維的卷積函數(shù)
#x是圖片的所有參數(shù)丹拯,W是此卷積層的權(quán)重站超,
#然后定義卷積的步長(zhǎng)strides=[1,1,1,1]值,strides[0]和strides[3]的兩個(gè)1是默認(rèn)值乖酬,
#中間兩個(gè)1代表padding時(shí)在x方向運(yùn)動(dòng)一步死相,y方向運(yùn)動(dòng)一步,padding采用的方式是SAME咬像。
def conv2d(x,W):
return tf.nn.conv2d(x,W,strides=[1,1,1,1]算撮,padding='SAME')
#接著定義池化pooling生宛,
#為了得到更多的圖片信息,padding時(shí)我們選的是一次一步肮柜,也就是strides[1]=strides[2]=1陷舅,
#這樣得到的圖片尺寸沒有變化,而我們希望壓縮一下圖片也就是參數(shù)能少一些從而減小系統(tǒng)的復(fù)雜度审洞,
#因此我們采用pooling來(lái)稀疏化參數(shù)莱睁,也就是卷積神經(jīng)網(wǎng)絡(luò)中所謂的下采樣層。
#pooling 有兩種芒澜,一種是最大值池化仰剿,一種是平均值池化,本例采用的是最大值池化tf.max_pool()撰糠。
#池化的核函數(shù)大小為2x2酥馍,因此ksize=[1,2,2,1],步長(zhǎng)為2阅酪,因此strides=[1,2,2,1]:
def max_poo_2x2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1])