1. 程式人生 > >Tensorflow學習文件【待更新】

Tensorflow學習文件【待更新】

本文部分參考 

https://morvanzhou.github.io/

https://www.bilibili.com/video/av9156347/?from=search&seid=14443754263386295565

如何安裝?

win10-x64下cpu版本

1.下載安裝python3.6勾選ADD環境變數。(此安裝包自帶numpy與pip)

2.cmd輸入pip install tensorflow等待安裝完成

3.import tensorflow as tf沒有報錯則成功

4.安裝一些工具包(通過cmd) pip install matplotlib

#===============================忽略煩人的警告===============================
#在使用tensorflow時可能會輸出一些無用警告,以下可以遮蔽
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  #忽略煩人的警告

#===============================網路計算&視覺化網路===============================
#tensorflow是先構成網路的連線方式、運算方式,再進行運算(run),要使用內建方法如tf.add
#tf有自己的視覺化工具,用name命名方便視覺化檢視
import tensorflow as tf
x=tf.constant(2,name='x')#常量
y=tf.constant(3,name='y')
op1=tf.add(x,y,name='add')
op2=tf.multiply(x,y,name='mul')
op3=tf.multiply(op1,op2,name='mul')
op4=tf.add(op1,x,name='add')
sess=tf.Session()#這一步是生成網路
writer=tf.summary.FileWriter('./graphs',sess.graph)#在./graphs路徑中儲存視覺化檔案(網路視覺化)
op3,op4=sess.run([op3,op4])#可以通過run得到任何結點的輸出
print('op3:',op3)
print('op4:',op4)
writer.close()
sess.close()
#####################################################################
# 然後調出終端,先cd到graphs上一個目錄,注意!不要有中文目錄
# cd C:\Users\xytpai\Desktop\ML
# 然後到終端輸入
# tensorboard --logdir=graphs --port 6006 --host=127.0.0.1
# chrome瀏覽器開啟
# http://localhost:6006/
#####################################################################

#===============================執行多個模型===============================
#執行期間不能互動,若是gpu則獨佔整個GPU資源
import tensorflow as tf
g=tf.Graph()#定義一個圖g
with g.as_default():#把g設定為預設圖(圖也就是網路)
	x=tf.add(3,5)#現在這個操作在圖g之上的
with tf.Session(graph=g)as sess:#選定圖g生成網路
	print(sess.run(x))#x結點輸出
#如果要獲取當前圖g=tf.get_default_graph()
#===============================在執行圖的時候插入一些圖===============================
#當直接在python語言環境互動式輸出命令時,也可以邊插入圖邊檢視效果,而不用Session
tf.InteractiveSession()
a=tf.constant(2,shape=[2,2])#定義a的向量形狀
a.eval()#顯示向量資料
#===============================多維輸入的節點===============================
import tensorflow as tf
a=tf.constant([2,2])#a為僅有一行的常數向量
b=tf.constant([[0,1],[2,3]])#b為2行2列的常數矩陣
x=tf.add(a,b)#a中那一行與b中各行相加,tf自帶一些矩陣向量的計算方式
y=tf.multiply(a,b)#把b中每個向量與a乘
with tf.Session() as sess:#生成網路
	x,y=sess.run([x,y])#run一下才能得到結果
	print(x)
	print(y)
#===============================零矩陣或者一矩陣===============================
#注意!以下返回的a\b\c\d\e為tf的網格資料結構tensor,相當於構成網格的元件
#只有run了才能得到值
import tensorflow as tf
a=tf.zeros([2,3],tf.int32) #->[[0,0,0],[0,0,0]]
b=tf.zeros_like(a) #->與a類似形狀的0矩陣
c=tf.ones([2,3],tf.int32)
d=tf.ones_like(c)
e=tf.fill([2,3],8) #->[[8,8,8],[8,8,8]]用自定義值填充的矩陣
#===============================一維線性迴歸===============================
import numpy as np
import time
import matplotlib.pyplot as plt
import tensorflow as tf
x_data=np.random.rand(100).astype(np.float32)#創造一些data作為對應輸入
y_data=x_data*0.1+0.3#自己隨便搞一點對應輸出
Weight=tf.Variable(tf.random_uniform([1],-1.0,1.0))#1維的結構,初始為-1~1的均勻分佈隨機值
biases=tf.Variable(tf.zeros([1]))#偏置直接給0,這裡Variable為變數
y=Weight*x_data+biases#y即為預測值
loss=tf.reduce_mean(tf.square(y-y_data))#損失函式為平方,訓練目的就是把loss變小
train=tf.train.GradientDescentOptimizer(0.5).minimize(loss)#梯度下降優化器,學習速率0.5
init=tf.global_variables_initializer()#初始化變數結構,只要有tf.Variable就一定要加入
sess=tf.Session()
sess.run(init)#必須先run這個!
for step in range(200):#訓練200次
	sess.run(train)#這裡就是訓練
	if step%20==0:#每隔一定訓練次數輸出
		print(step,sess.run(loss),sess.run(Weight),sess.run(biases))#用run來獲取特定結點的值
		#可以從結果中看到,loss越來越小,機器學得越來越好了
sess.close()
#===============================計算矩陣乘法===============================
import tensorflow as tf
matrix1=tf.constant([[3,3]])#一行兩列,常數矩陣
matrix2=tf.constant([[2],[2]])#一列兩行,常數矩陣
product=tf.matmul(matrix1,matrix2)#矩陣乘法
sess=tf.Session()
result=sess.run(product)
print(result)
sess.close()
#===============================變數用法與計數器應用===============================
import tensorflow as tf
state=tf.Variable(0)#state為變數,初始值為0
one=tf.constant(1)#常量1
new_value=tf.add(state,one)#相當於增加了一個雙輸入節點,輸入為state+one其中state為變數
update=tf.assign(state,new_value)#賦值節點把new_value載入到state
init=tf.global_variables_initializer()#初始化<變數>結構Variable必須定義採用
with tf.Session() as sess:
	sess.run(init)#這個init必須先run一下
	for _ in range(10):
		sess.run(update)#先run到update節點把new_value節點得到的值給state變數
		print(sess.run(state))#再看下state的輸出
#===============================一維輸入輸出神經網路===============================
import numpy as np
import time
import matplotlib.pyplot as plt
import tensorflow as tf
#一個新增神經層的函式
def add_layer(inputs,in_size,out_size,activation_function=None):
	Weights=tf.Variable(tf.random_normal([in_size,out_size]))#矩陣變數,先用正態分佈初始化
	biases=tf.Variable(tf.zeros([1,out_size])+0.1)#推薦不為0
	Wx_plus_b=tf.add(tf.matmul(inputs,Weights),biases)
	if activation_function is None:
		outputs=Wx_plus_b#線性關係
	else:
		outputs=activation_function(Wx_plus_b)
	return outputs

#先自己建造一個數據集(樣本+標籤), -1到1之間300個單位
x_data=np.linspace(-1,1,300)[:,np.newaxis]#300行
noise=np.random.normal(0,0.05,x_data.shape)#加點噪點,格式根x_data一樣
y_data=np.square(x_data)-0.5+noise#一元二次函式加點噪聲

#新增輸入量
xs=tf.placeholder(tf.float32,[None,1])#None表示第一維無論多少個例子都ok
ys=tf.placeholder(tf.float32,[None,1])

#新增神經層,1隱含層+1輸出層
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)#隱含層,10個輸出
prediction=add_layer(l1,10,1,activation_function=None)#輸出層,輸出1維度

#新增損失函式與訓練方式
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),#平方損失函式,所有求和取平均
							reduction_indices=[1]))#[1]為按列求和
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#初始化所有變數開始訓練
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)

#視覺化
fig=plt.figure()#創造一個框框
ax=fig.add_subplot(1,1,1)#1,1,1為編號
ax.scatter(x_data,y_data)#打入點
plt.ion()#顯示出真實資料,不暫停
#plt.show()#顯示出真實資料,然後暫停

for i in range(1000):#訓練次數1000
	sess.run(train_step,feed_dict={xs:x_data,ys:y_data})#全部資料運算,這一步是學習
	if i%50==0:
		#視覺化
		try:
			ax.lines.remove(lines[0])#抹除掉剛畫的線
		except Exception:
			pass
		prediction_value=sess.run(prediction,feed_dict={xs:x_data})#得到預測值
		lines=ax.plot(x_data,prediction_value,'r-',lw=5)#畫線並顯示,紅色,寬度為5
		plt.pause(0.1)#暫停一下繼續
		print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
sess.close()
#===============================TensorBoard視覺化訓練調參===============================
#一個新增神經層的函式
def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
	layer_name='layer%s'%n_layer#傳入名字
	with tf.name_scope(layer_name):	#做個視覺化大框架
	#矩陣變數,先用正態分佈初始化
		with tf.name_scope('weights'):	#視覺化小部件
			Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='W')
			tf.summary.histogram(layer_name+'/weights',Weights)#想要觀看的變數
		with tf.name_scope('biases'):	#視覺化小部件
			biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')#推薦不為0
			tf.summary.histogram(layer_name+'/biases',biases)#想要觀看的變數
		with tf.name_scope('Wx_plus_b'):	#視覺化小部件
			Wx_plus_b=tf.add(tf.matmul(inputs,Weights),biases)
		if activation_function is None:
			outputs=Wx_plus_b#線性關係
		else:
			outputs=activation_function(Wx_plus_b)
			tf.summary.histogram(layer_name+'/outputs',outputs)#想要觀看的變數
		return outputs

#先自己建造一個數據集(樣本+標籤), -1到1之間300個單位
x_data=np.linspace(-1,1,300)[:,np.newaxis]#300行
noise=np.random.normal(0,0.05,x_data.shape)#加點噪點,格式根x_data一樣
y_data=np.square(x_data)-0.5+noise#一元二次函式加點噪聲

#新增輸入量
with tf.name_scope('inputs'):	#做個視覺化大框架
	xs=tf.placeholder(tf.float32,[None,1],name='x_input')#None表示第一維無論多少個例子都ok
	ys=tf.placeholder(tf.float32,[None,1],name='y_input')

#新增神經層,1隱含層+1輸出層
l1=add_layer(xs,1,10,n_layer=1,activation_function=tf.nn.relu)#隱含層,10個輸出
prediction=add_layer(l1,10,1,n_layer=2,activation_function=None)#輸出層,輸出1維度

#新增損失函式與訓練方式
with tf.name_scope('loss'):	#做個視覺化大框架
	loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),#平方損失函式,所有求和取平均
							reduction_indices=[1]))#[1]為按列求和
	tf.summary.scalar('loss',loss)#想要觀看的變數,注意loss是純量在TensorBoard裡的event裡看
with tf.name_scope('train'):	#做個視覺化大框架
	train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

sess=tf.Session()
merged=tf.summary.merge_all()#重要!合併所有的summary
writer=tf.summary.FileWriter('./graphs',sess.graph)#這個只是畫圖
sess.run(tf.global_variables_initializer())#有變數必須這步
for i in range(1000):#訓練次數1000
	sess.run(train_step,feed_dict={xs:x_data,ys:y_data})#全部資料運算,這一步是學習
	if i%50==0:
		#視覺化
		result=sess.run(merged,feed_dict={xs:x_data,ys:y_data})#run merged!!!
		writer.add_summary(result,i)#寫入summary
writer.close()
sess.close()
#####################################################################
# 然後調出終端,先cd到graphs上一個目錄,注意!不要有中文目錄
# cd C:\Users\xytpai\Desktop\ML
# 然後到終端輸入
# tensorboard --logdir=graphs --port 6006 --host=127.0.0.1
# chrome瀏覽器開啟
# http://localhost:6006/
#####################################################################

#===============================單層神經網路訓練手寫識別===============================
首先建立一個檔案放在與主檔案相同目錄下命名為input_data.py內容如下
"""Functions for downloading and reading MNIST data."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import gzip
import os
import tempfile
import numpy
from six.moves import urllib
from six.moves import xrange  # pylint: disable=redefined-builtin
import tensorflow as tf
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
該程式會自動從網際網路得到MINIST庫並載入
#-------------------------------------主程式-------------------------------------
#若電腦上無資料包網上可以下下來
import tensorflow as tf
import input_data
mnist=input_data.read_data_sets('/data/mnist',one_hot=True)
#一個新增神經層的函式
def add_layer(inputs,in_size,out_size,activation_function=None):
	#矩陣變數,先用正態分佈初始化
	Weights=tf.Variable(tf.random_normal([in_size,out_size]))
	biases=tf.Variable(tf.zeros([1,out_size])+0.1)#推薦不為0
	Wx_plus_b=tf.add(tf.matmul(inputs,Weights),biases)
	if activation_function is None:
		outputs=Wx_plus_b#線性關係
	else:
		outputs=activation_function(Wx_plus_b)
	return outputs

def compute_accuracy(v_xs,v_ys):
	global prediction#申明全域性變數
	y_pre=sess.run(prediction,feed_dict={xs:v_xs})
	#判斷是否等,argmax為最大概率的索引
	correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))
	#tf.cast為轉化格式
	accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
	result=sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})
	return result

#define placeholder for inputs to network
xs=tf.placeholder(tf.float32,[None,784])#784個畫素點28*28
ys=tf.placeholder(tf.float32,[None,10])#None為這個維度輸入待定

#add output layer
prediction=add_layer(xs,784,10,activation_function=tf.nn.softmax)

#loss
cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),
								reduction_indices=[1]))#分類一般用交叉熵
train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess=tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(1000):
	batch_xs,batch_ys=mnist.train.next_batch(100)#每次學習100個d
	sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys})
	if i%50==0:
		print(compute_accuracy(mnist.test.images,mnist.test.labels))
sess.close()
#===============================過擬合===============================
方法一:增加資料量
方法二:正則化	L1 cost = (Wx-real y)^2 + abs(W)  增加懲罰因子
		L2 abs(W)轉化為W^2
方法三:訓練時隨機忽略一些節點變成一個不完整的神經網路,使每一次的預測結果都不會特別依賴某些特定的節點(以下)

先定義keep_prob=tf.placeholder(tf.float32)
再在這裡改sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys,keep_prob:0.6})#訓練時百分之60不被drop掉
主功能加在如下
def add_layer(inputs,in_size,out_size,activation_function=None):
	#矩陣變數,先用正態分佈初始化
	Weights=tf.Variable(tf.random_normal([in_size,out_size]))
	biases=tf.Variable(tf.zeros([1,out_size])+0.1)#推薦不為0
	Wx_plus_b=tf.add(tf.matmul(inputs,Weights),biases)
	#加這裡
	Wx_plus_b=tf.nn.dropout(Wx_plus_b,keep_prob)
	#======
	...
#===============================卷積神經網路訓練手寫識別===============================
import tensorflow as tf
import input_data
mnist=input_data.read_data_sets('/data/mnist',one_hot=True)

def compute_accuracy(v_xs,v_ys):
	global prediction#申明全域性變數
	y_pre=sess.run(prediction,feed_dict={xs:v_xs,keep_prob:1})
	#判斷是否等,argmax為最大概率的索引
	correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))
	#tf.cast為轉化格式
	accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
	result=sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys,keep_prob:1})
	return result

def weight_variable(shape):
	initial=tf.random_normal(shape=shape,stddev=0.1)
	return tf.Variable(initial)

def bias_variable(shape):
	initial=tf.constant(0.1,shape=shape)
	return tf.Variable(initial)

def conv2d(x,W):
	#strides等於取樣步長,中間兩個1表示xy方向步長都為1,第一個和最後一個恆為1
	#SAME為抽取出來長寬與原圖一樣卷積時包含邊界之外的畫素,邊界以外全0填充
	#若padding為VALID則無邊界之外的畫素
	return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

def max_pool_2x2(x):
	#池化層過濾器邊長為2移動步長為2,採用全0填充(SAME)
	return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

xs=tf.placeholder(tf.float32,[None,784])#784個畫素點28*28
ys=tf.placeholder(tf.float32,[None,10])#None為這個維度輸入待定
keep_prob=tf.placeholder(tf.float32)
x_image=tf.reshape(xs,shape=[-1,28,28,1])#最後一個是色彩深度,-1與None一樣

#卷積+池化層1
W_conv1=weight_variable([5,5,1,32])#patch 5*5輸入深度為1,輸出深度為32,即32個卷積核
b_conv1=bias_variable([32])
h_conv1=tf.nn.relu(tf.add(conv2d(x_image,W_conv1),b_conv1))#output:28*28*32
h_pool1=max_pool_2x2(h_conv1)#output:14*14*32

#卷積+池化層2
W_conv2=weight_variable([5,5,32,64])#前一次輸出深度為32因此這次輸入深度為32,輸出深度64
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(tf.add(conv2d(h_pool1,W_conv2),b_conv2))#output:14*14*64
h_pool2=max_pool_2x2(h_conv2)#output:7*7*64

#全連線隱層
W_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])
h_pool2_flat=tf.reshape(h_pool2,shape=[-1,7*7*64])
h_fc1=tf.nn.relu(tf.add(tf.matmul(h_pool2_flat,W_fc1),b_fc1))
f_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)

#輸出層
W_fc2=weight_variable([1024,10])
b_fc2=bias_variable([10])
prediction=tf.nn.softmax(tf.add(tf.matmul(f_fc1_drop,W_fc2),b_fc2))

#loss+train
cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),
								reduction_indices=[1]))#分類一般用交叉熵
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

sess=tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(1000):
	batch_xs,batch_ys=mnist.train.next_batch(100)#每次學習100個d
	sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys,keep_prob:0.8})
	if i%50==0:
		print(compute_accuracy(mnist.test.images,mnist.test.labels))
sess.close()
#===============================儲存和提取===============================
儲存
W=tf.Variable([[1,2,3],[3,4,5]],dtype=tf.float32,name='weights')
b=tf.Variable([[1,2,3]],dtype=tf.float32,name='weights')
init=tf.global_variables_initializer()
saver=tf.train.Saver()
with tf.Session() as sess:
	sess.run(init)
	save_path=saver.save(sess,"my_net/save_net.ckpt")
	print(save_path)
提取
W=tf.Variable(tf.zeros([2,3],tf.float32),dtype=tf.float32,name="weights")
b=tf.Variable(tf.zeros([1,3],tf.float32),dtype=tf.float32,name="weights")
saver=tf.train.Saver()
with tf.Session() as sess:
	saver.restore(sess,"my_net/save_net.ckpt")
	print("weights:",sess.run(W))
	print("biases:",sess.run(b))