因爲隨着神經網絡層數的增多,須要訓練的參數也會增多,隨之而來須要的數據集就會很大,這樣會形成須要更大的運算資源,並且還要消耗很長的運算時間。TensorFlow提供了一個能夠分佈式部署的模式,將一個訓練任務拆分紅多個小任務,配置到不一樣的計算機上完成協同運算,這樣使用計算機羣運算來代替單機運算,可使訓練時間大幅度縮短。python
要想配置TensorFlow爲分佈訓練,首先須要瞭解TensorFlow中關於分佈式的角色分配。算法
每一個具體角色網絡標識都是惟一的,即分佈在不一樣IP的機器上(或者同一主機但不一樣端口號)。數組
在實際運行中,各個角色的網絡構建部分代碼必須徹底相同。三者的分工以下:服務器
配置過程當中,首先建立一個server,在server中會將ps以及全部worker的ip端口準備好,接着使用tf.train.Supervisor中的managed_seesion來管理打開的session,session只負責運算,而通訊協調的事情就都交給Supervisor來管理了。網絡
下面開始實現一個分佈式訓練的網絡模型,仍然以線性迴歸的模型做爲原型,並將其改成分佈式。使咱們須要在本機經過3個端口來創建3個終端,分別是ps,兩個worker。代碼主要分爲如下幾部分:session
首先建立集羣(cluster), ClusterSpec的定義,須要把你要跑這個任務的全部的ps和worker 的節點的ip和端口的信息都包含進去, 全部的角色都要執行這段代碼, 就你們互相知道了, 這個集羣裏面都有哪些成員,不一樣的成員的類型是什麼, 是ps仍是worker。app
而後建立一個server,在server中會將ps以及全部worker的ip端口準備好,在同一臺電腦開三個不一樣的端口,分別表明ps,chief supervisors和worker。角色的名稱用strjob_name表示。從 tf.train.Server這個的定義開始,就每一個角色不同了。 若是角色名字是ps的話, 程序就join到這裏,做爲參數更新的服務, 等待其餘worker角色給它提交參數更新的數據。若是是worker角色,就執行後面的計算任務。以ps爲例(先建立ps文件):dom
''' (1)爲每一個角色添加IP地址和端口,建立server ''' '''定義IP和端口號''' #指定服務器ip和port strps_hosts = '127.0.0.1:1234' #指定兩個終端的ip和port strworker_hosts = '127.0.0.1:1235,127.0.0.1:1236' #定義角色名稱 strjob_name = 'ps' task_index = 0 #將字符串轉爲數組 ps_hosts = strps_hosts.split(',') worker_hosts = strworker_hosts.split(',') cluster_spec= tf.train.ClusterSpec({'ps':ps_hosts,'worker':worker_hosts}) #建立Server server = tf.train.Server( cluster_spec, job_name = strjob_name, task_index = task_index)
ps角色使用server.join()函數進行線程掛起,開始接受鏈接消息。分佈式
''' (2) 爲ps角色添加等待函數 ''' #ps角色處於監聽狀態,等待終端鏈接 if strjob_name == 'ps': print('waiting....') server.join()
與正常的程序不一樣,在建立網絡結構時,使用tf.device()函數將所有的節點都放在當前任務下。task:0對應worker1(能夠理解爲任務0對應着角色1),task:1對應worker2。ide
在rf.device()函數中的任務是經過tf.train.replica_device_setter()來指定的。
在tf.train.replica_device_setter()中使用worker_device()來定義具體任務名稱:使用cluster的配置來指定角色和對應的ip地址,從而實現整個任務下的圖節點,
''' (3) 建立網絡結構 ''' #設定訓練集數據長度 n_train = 100 #生成x數據,[-1,1]之間,均分紅n_train個數據 train_x = np.linspace(-1,1,n_train).reshape(n_train,1) #把x乘以2,在加入(0,0.3)的高斯正太分佈 train_y = 2*train_x + np.random.normal(loc=0.0,scale=0.3,size=[n_train,1]) #繪製x,y波形 plt.figure() plt.plot(train_x,train_y,'ro',label='y=2x') #o使用圓點標記一個點 plt.legend() plt.show() #建立網絡結構時,經過tf.device()函數將所有的節點都放在當前任務下 task:0對應worker1 task:1對應worker2 with tf.device(tf.train.replica_device_setter( worker_device = '/job:worker/task:{0}'.format(task_index), cluster = cluster_spec)): ''' 前向反饋 ''' #建立佔位符 input_x = tf.placeholder(dtype=tf.float32) input_y = tf.placeholder(dtype=tf.float32) #模型參數 w = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='w') #設置正太分佈參數 初始化權重 b = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='b') #設置正太分佈參數 初始化偏置 #建立一個global_step變量 global_step = tf.train.get_or_create_global_step() #前向結構 pred = tf.multiply(w,input_x) + b #將預測值以直方圖形式顯示,給直方圖命名爲'pred' tf.summary.histogram('pred',pred) ''' 反向傳播bp ''' #定義代價函數 選取二次代價函數 cost = tf.reduce_mean(tf.square(input_y - pred)) #將損失以標量形式顯示 該變量命名爲loss_function tf.summary.scalar('loss_function',cost) #設置求解器 採用梯度降低法 學習了設置爲0.001 並把global_step變量放到優化器中,這樣每運行一次優化器,globle_step就會自動得到當前迭代的次數 train = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost,global_step = global_step) saver = tf.train.Saver(max_to_keep = 1) #合併全部的summary merged_summary_op = tf.summary.merge_all() #初始化全部變量,所以變量須要放在其前面定義 init =tf.global_variables_initializer()
爲了使載入檢查點文件可以同步循環次數,這裏添加了一個global_step變量,將其放到優化器中。這樣每運行一次優化器,global_step就會自動加1.
''' (4)建立Supervisor,管理session ''' training_epochs = 2000 display_step = 20 sv = tf.train.Supervisor(is_chief = (task_index == 0), #0號worker爲chief logdir='./LinearRegression/super/', #檢查點和summary文件保存的路徑 init_op = init, #初始化全部變量 summary_op = None, #summary_op用於自動保存summary文件,設置爲None,表示不自動保存 saver = saver, #將保存檢查點的saver對象傳入,supervisor會自動保存檢查點文件。不然設置爲None global_step = global_step, save_model_secs = 50 #保存檢查點文件的時間間隔 )
session中的內容和以前的同樣,直接迭代訓練便可,因爲使用了Supervisor管理session,將使用sv.summary_computed函數來保存summary文件,一樣,若是想要手動保存監測點文件,也可使用sv.saver.save()函數。
''' (5) 迭代訓練 ''' #鏈接目標角色建立session with sv.managed_session(server.target) as sess: print("sess ok:") print(global_step.eval(session=sess)) print('開始迭代:') #存放批次值和代價值 plotdata = {'batch_size':[],'loss':[]} #開始迭代 這裏step表示當前執行步數,迭代training_epochs輪 須要執行training_epochs*n_train步 for step in range(training_epochs*n_train): for (x,y) in zip(train_x,train_y): #開始執行圖 並返回當前步數 _,step = sess.run([train,global_step],feed_dict={input_x:x,input_y:y}) #生成summary summary_str = sess.run(merged_summary_op,feed_dict={input_x:x,input_y:y}) #將summary寫入文件 手動保存summary日誌文件 sv.summary_computed(sess,summary_str,global_step = step) #一輪訓練完成後 打印輸出信息 if step % display_step == 0: #計算代價值 loss = sess.run(cost,feed_dict={input_x:train_x,input_y:train_y}) print('step {0} cost {1} w {2} b{3}'.format(step,loss,sess.run(w),sess.run(b))) #保存每display_step輪訓練後的代價值以及當前迭代輪數 if not loss == np.nan: plotdata['batch_size'].append(step) plotdata['loss'].append(loss) print('Finished!') #手動保存檢查點文件 #sv.saver.save(sess,'./LinearRegression/sv/sv.cpkt',global_step = step) sv.stop()
將ps.py文件複製兩份,一個叫worker1.py,一個叫worker2.py。將角色名稱修改成worker,並將worker2.py中的task_index修改成1。同時須要將worker2.py文件中手動保存summary日誌的代碼註釋掉。
worker1.py文件修改以下:
#定義角色名稱 strjob_name = 'worker' task_index = 0
worker2.py文件修改以下:
#定義角色名稱 strjob_name = 'worker' task_index = 1
在這個程序中使用了sv.summary_computed()函數手動將運行時動態的數據保存下來,以便於在TensorBoard中查看,可是在分佈式部署的時候,使用該功能還須要注意如下幾點:
在spyder中先將ps.py文件運行起來,選擇菜單Consoles->Open an Ipython console,新打開一個Consoles,以下圖
在spider面板右下角,能夠看到在原有標籤爲'Console 1/A'標籤又多了一個‘Console 2/A’標籤,選中這個標籤,就激活了這個標籤。
運行worker2.py文件。同理,啓動'Console 3/A'運行worker1.py文件。
下面咱們能夠看到worker1.py文件的輸出:
咱們在程序中設置display_step爲20,即迭代20次輸出一次信息,咱們可能看到這個輸出並非連續的,這是由於跳過的步驟被分配到了worker2中去運算了。
worker2.py文件對應的窗口顯示的信息以下:
從圖中能夠看到worker2和chief supervisors的迭代順序是互補,但也有多是沒有絕對互補的,可是爲何有時候沒有絕對互補?可能與Supervisor中的同步算法有關。
分佈運算的目的是爲了提升總體運算速度,若是同步epoch的準確度須要以犧牲整體運算速度爲代價,天然很不合適。因此更合理的推斷是由於單機單次運算太快迫使算法使用了更寬鬆的同步機制。
重要的一點是對於指定步數的學習參數w和b是一致的。即統一迭代論述的值是同樣的,這代表兩個終端是在相同的起點上進行運算的。
對於ps.py文件,其對應的窗口一直默默的只顯示打印的那句話waiting....,由於它只負責鏈接參與運算。
客戶端(Client)
tensorflow::Session
的程序。通常客戶端是經過python或C++實現的。一個獨立的客戶端進程能夠同時與多個TensorFlow的服務端相連 ,同時一個獨立的服務端也能夠與多個客戶端相連。集羣(Cluster)
tf.train.ClusterSpec
來定義。 做業(Job)
任務(Task)
ps.py完整代碼:
# -*- coding: utf-8 -*- """ Created on Thu Apr 19 08:52:30 2018 @author: zy """ import tensorflow as tf import numpy as np import os import matplotlib.pyplot as plt ''' 分佈式計算 ''' ''' (1)爲每一個角色添加IP地址和端口,建立server ''' '''定義IP和端口號''' #指定服務器ip和port strps_hosts = '127.0.0.1:1234' #指定兩個終端的ip和port strworker_hosts = '127.0.0.1:1235,127.0.0.1:1236' #定義角色名稱 strjob_name = 'ps' task_index = 0 #將字符串轉爲數組 ps_hosts = strps_hosts.split(',') worker_hosts = strworker_hosts.split(',') cluster_spec = tf.train.ClusterSpec({'ps': ps_hosts,'worker': worker_hosts}) #建立server server = tf.train.Server( cluster_spec, job_name = strjob_name, task_index = task_index) ''' (2) 爲ps角色添加等待函數 ''' #ps角色處於監聽狀態,等待終端鏈接 if strjob_name == 'ps': print('waiting....') server.join() ''' (3) 建立網絡結構 ''' #設定訓練集數據長度 n_train = 100 #生成x數據,[-1,1]之間,均分紅n_train個數據 train_x = np.linspace(-1,1,n_train).reshape(n_train,1) #把x乘以2,在加入(0,0.3)的高斯正太分佈 train_y = 2*train_x + np.random.normal(loc=0.0,scale=0.3,size=[n_train,1]) #繪製x,y波形 plt.figure() plt.plot(train_x,train_y,'ro',label='y=2x') #o使用圓點標記一個點 plt.legend() plt.show() #建立網絡結構時,經過tf.device()函數將所有的節點都放在當前任務下 with tf.device(tf.train.replica_device_setter( worker_device = '/job:worker/task:{0}'.format(task_index), cluster = cluster_spec)): ''' 前向反饋 ''' #建立佔位符 input_x = tf.placeholder(dtype=tf.float32) input_y = tf.placeholder(dtype=tf.float32) #模型參數 w = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='w') #設置正太分佈參數 初始化權重 b = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='b') #設置正太分佈參數 初始化偏置 #建立一個global_step變量 global_step = tf.train.get_or_create_global_step() #前向結構 pred = tf.multiply(w,input_x) + b #將預測值以直方圖形式顯示,給直方圖命名爲'pred' tf.summary.histogram('pred',pred) ''' 反向傳播bp ''' #定義代價函數 選取二次代價函數 cost = tf.reduce_mean(tf.square(input_y - pred)) #將損失以標量形式顯示 該變量命名爲loss_function tf.summary.scalar('loss_function',cost) #設置求解器 採用梯度降低法 學習了設置爲0.001 並把global_step變量放到優化器中,這樣每運行一次優化器,global_step就會自動得到當前迭代的次數 train = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost,global_step = global_step) saver = tf.train.Saver(max_to_keep = 1) #合併全部的summary merged_summary_op = tf.summary.merge_all() #初始化全部變量,所以變量須要放在其前面定義 init =tf.global_variables_initializer() ''' (4)建立Supervisor,管理session ''' training_epochs = 2000 display_step = 20 sv = tf.train.Supervisor(is_chief = (task_index == 0), #0號worker爲chief logdir='./LinearRegression/super/', #檢查點和summary文件保存的路徑 init_op = init, #初始化全部變量 summary_op = None, #summary_op用於自動保存summary文件,設置爲None,表示不自動保存 saver = saver, #將保存檢查點的saver對象傳入,supervisor會自動保存檢查點文件。不然設置爲None global_step = global_step, save_model_secs = 50 #保存檢查點文件的時間間隔 ) ''' (5) 迭代訓練 ''' #鏈接目標角色建立session with sv.managed_session(server.target) as sess: print("sess ok:") print(global_step.eval(session=sess)) print('開始迭代:') #存放批次值和代價值 plotdata = {'batch_size':[],'loss':[]} #開始迭代 這裏step表示當前執行步數,迭代training_epochs輪 須要執行training_epochs*n_train步 for step in range(training_epochs*n_train): for (x,y) in zip(train_x,train_y): #開始執行圖 並返回當前步數 _,step = sess.run([train,global_step],feed_dict={input_x:x,input_y:y}) #生成summary summary_str = sess.run(merged_summary_op,feed_dict={input_x:x,input_y:y}) #將summary寫入文件 手動保存summary日誌文件 sv.summary_computed(sess,summary_str,global_step = step) #一輪訓練完成後 打印輸出信息 if step % display_step == 0: #計算代價值 loss = sess.run(cost,feed_dict={input_x:train_x,input_y:train_y}) print('step {0} cost {1} w {2} b{3}'.format(step,loss,sess.run(w),sess.run(b))) #保存每display_step輪訓練後的代價值以及當前迭代輪數 if not loss == np.nan: plotdata['batch_size'].append(step) plotdata['loss'].append(loss) print('Finished!') #手動保存檢查點文件 #sv.saver.save(sess,'./LinearRegression/sv/sv.cpkt',global_step = step) sv.stop()
worker1.py完整代碼:
# -*- coding: utf-8 -*- """ Created on Thu Apr 19 08:52:30 2018 @author: zy """ import tensorflow as tf import numpy as np import os import matplotlib.pyplot as plt ''' 分佈式計算 ''' ''' (1)爲每一個角色添加IP地址和端口,建立worker ''' '''定義IP和端口號''' #指定服務器ip和port strps_hosts = '127.0.0.1:1234' #指定兩個終端的ip和port strworker_hosts = '127.0.0.1:1235,127.0.0.1:1236' #定義角色名稱 strjob_name = 'worker' task_index = 0 #將字符串轉爲數組 ps_hosts = strps_hosts.split(',') worker_hosts = strworker_hosts.split(',') cluster_spec = tf.train.ClusterSpec({'ps': ps_hosts,'worker': worker_hosts}) #建立server server = tf.train.Server( cluster_spec, job_name = strjob_name, task_index = task_index) ''' (2) 爲ps角色添加等待函數 ''' #ps角色處於監聽狀態,等待終端鏈接 if strjob_name == 'ps': print('waiting....') server.join() ''' (3) 建立網絡結構 ''' #設定訓練集數據長度 n_train = 100 #生成x數據,[-1,1]之間,均分紅n_train個數據 train_x = np.linspace(-1,1,n_train).reshape(n_train,1) #把x乘以2,在加入(0,0.3)的高斯正太分佈 train_y = 2*train_x + np.random.normal(loc=0.0,scale=0.3,size=[n_train,1]) #繪製x,y波形 plt.figure() plt.plot(train_x,train_y,'ro',label='y=2x') #o使用圓點標記一個點 plt.legend() plt.show() #建立網絡結構時,經過tf.device()函數將所有的節點都放在當前任務下 with tf.device(tf.train.replica_device_setter( worker_device = '/job:worker/task:{0}'.format(task_index), cluster = cluster_spec)): ''' 前向反饋 ''' #建立佔位符 input_x = tf.placeholder(dtype=tf.float32) input_y = tf.placeholder(dtype=tf.float32) #模型參數 w = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='w') #設置正太分佈參數 初始化權重 b = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='b') #設置正太分佈參數 初始化偏置 #建立一個global_step變量 global_step = tf.train.get_or_create_global_step() #前向結構 pred = tf.multiply(w,input_x) + b #將預測值以直方圖形式顯示,給直方圖命名爲'pred' tf.summary.histogram('pred',pred) ''' 反向傳播bp ''' #定義代價函數 選取二次代價函數 cost = tf.reduce_mean(tf.square(input_y - pred)) #將損失以標量形式顯示 該變量命名爲loss_function tf.summary.scalar('loss_function',cost) #設置求解器 採用梯度降低法 學習了設置爲0.001 並把global_step變量放到優化器中,這樣每運行一次優化器,global_step就會自動得到當前迭代的次數 train = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost,global_step = global_step) saver = tf.train.Saver(max_to_keep = 1) #合併全部的summary merged_summary_op = tf.summary.merge_all() #初始化全部變量,所以變量須要放在其前面定義 init =tf.global_variables_initializer() ''' (4)建立Supervisor,管理session ''' training_epochs = 2000 display_step = 20 sv = tf.train.Supervisor(is_chief = (task_index == 0), #0號worker爲chief logdir='./LinearRegression/super/', #檢查點和summary文件保存的路徑 init_op = init, #初始化全部變量 summary_op = None, #summary_op用於自動保存summary文件,設置爲None,表示不自動保存 saver = saver, #將保存檢查點的saver對象傳入,supervisor會自動保存檢查點文件。不然設置爲None global_step = global_step, save_model_secs = 50 #保存檢查點文件的時間間隔 ) ''' (5) 迭代訓練 ''' #鏈接目標角色建立session with sv.managed_session(server.target) as sess: print("sess ok:") print(global_step.eval(session=sess)) print('開始迭代:') #存放批次值和代價值 plotdata = {'batch_size':[],'loss':[]} #開始迭代 這裏step表示當前執行步數,迭代training_epochs輪 須要執行training_epochs*n_train步 for step in range(training_epochs*n_train): for (x,y) in zip(train_x,train_y): #開始執行圖 並返回當前步數 _,step = sess.run([train,global_step],feed_dict={input_x:x,input_y:y}) #生成summary summary_str = sess.run(merged_summary_op,feed_dict={input_x:x,input_y:y}) #將summary寫入文件 手動保存summary日誌文件 sv.summary_computed(sess,summary_str,global_step = step) #一輪訓練完成後 打印輸出信息 if step % display_step == 0: #計算代價值 loss = sess.run(cost,feed_dict={input_x:train_x,input_y:train_y}) print('step {0} cost {1} w {2} b{3}'.format(step,loss,sess.run(w),sess.run(b))) #保存每display_step輪訓練後的代價值以及當前迭代輪數 if not loss == np.nan: plotdata['batch_size'].append(step) plotdata['loss'].append(loss) print('Finished!') #手動保存檢查點文件 #sv.saver.save(sess,'./LinearRegression/sv/sv.cpkt',global_step = step) sv.stop()
worker2.py完整代碼:
# -*- coding: utf-8 -*- """ Created on Thu Apr 19 08:52:30 2018 @author: zy """ import tensorflow as tf import numpy as np import os import matplotlib.pyplot as plt ''' 分佈式計算 ''' ''' (1)爲每一個角色添加IP地址和端口,建立worker ''' '''定義IP和端口號''' #指定服務器ip和port strps_hosts = '127.0.0.1:1234' #指定兩個終端的ip和port strworker_hosts = '127.0.0.1:1235,127.0.0.1:1236' #定義角色名稱 strjob_name = 'worker' task_index = 1 #將字符串轉爲數組 ps_hosts = strps_hosts.split(',') worker_hosts = strworker_hosts.split(',') cluster_spec = tf.train.ClusterSpec({'ps': ps_hosts,'worker': worker_hosts}) #建立server server = tf.train.Server( cluster_spec, job_name = strjob_name, task_index = task_index) ''' (2) 爲ps角色添加等待函數 ''' #ps角色處於監聽狀態,等待終端鏈接 if strjob_name == 'ps': print('waiting....') server.join() ''' (3) 建立網絡結構 ''' #設定訓練集數據長度 n_train = 100 #生成x數據,[-1,1]之間,均分紅n_train個數據 train_x = np.linspace(-1,1,n_train).reshape(n_train,1) #把x乘以2,在加入(0,0.3)的高斯正太分佈 train_y = 2*train_x + np.random.normal(loc=0.0,scale=0.3,size=[n_train,1]) #繪製x,y波形 plt.figure() plt.plot(train_x,train_y,'ro',label='y=2x') #o使用圓點標記一個點 plt.legend() plt.show() #建立網絡結構時,經過tf.device()函數將所有的節點都放在當前任務下 with tf.device(tf.train.replica_device_setter( worker_device = '/job:worker/task:{0}'.format(task_index), cluster = cluster_spec)): ''' 前向反饋 ''' #建立佔位符 input_x = tf.placeholder(dtype=tf.float32) input_y = tf.placeholder(dtype=tf.float32) #模型參數 w = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='w') #設置正太分佈參數 初始化權重 b = tf.Variable(tf.truncated_normal(shape=[1],mean=0.0,stddev=1),name='b') #設置正太分佈參數 初始化偏置 #建立一個global_step變量 global_step = tf.train.get_or_create_global_step() #前向結構 pred = tf.multiply(w,input_x) + b #將預測值以直方圖形式顯示,給直方圖命名爲'pred' tf.summary.histogram('pred',pred) ''' 反向傳播bp ''' #定義代價函數 選取二次代價函數 cost = tf.reduce_mean(tf.square(input_y - pred)) #將損失以標量形式顯示 該變量命名爲loss_function tf.summary.scalar('loss_function',cost) #設置求解器 採用梯度降低法 學習了設置爲0.001 並把global_step變量放到優化器中,這樣每運行一次優化器,global_step就會自動得到當前迭代的次數 train = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost,global_step = global_step) saver = tf.train.Saver(max_to_keep = 1) #合併全部的summary merged_summary_op = tf.summary.merge_all() #初始化全部變量,所以變量須要放在其前面定義 init =tf.global_variables_initializer() ''' (4)建立Supervisor,管理session ''' training_epochs = 2000 display_step = 20 sv = tf.train.Supervisor(is_chief = (task_index == 0), #0號worker爲chief logdir='./LinearRegression/super/', #檢查點和summary文件保存的路徑 init_op = init, #初始化全部變量 summary_op = None, #summary_op用於自動保存summary文件,設置爲None,表示不自動保存 saver = saver, #將保存檢查點的saver對象傳入,supervisor會自動保存檢查點文件。不然設置爲None global_step = global_step, save_model_secs = 50 #保存檢查點文件的時間間隔 ) ''' (5) 迭代訓練 ''' #鏈接目標角色建立session with sv.managed_session(server.target) as sess: print("sess ok:") print(global_step.eval(session=sess)) print('開始迭代:') #存放批次值和代價值 plotdata = {'batch_size':[],'loss':[]} #開始迭代 這裏step表示當前執行步數,迭代training_epochs輪 須要執行training_epochs*n_train步 for step in range(training_epochs*n_train): for (x,y) in zip(train_x,train_y): #開始執行圖 並返回當前步數 _,step = sess.run([train,global_step],feed_dict={input_x:x,input_y:y}) #生成summary summary_str = sess.run(merged_summary_op,feed_dict={input_x:x,input_y:y}) #將summary寫入文件 手動保存summary日誌文件 #sv.summary_computed(sess,summary_str,global_step = step) #一輪訓練完成後 打印輸出信息 if step % display_step == 0: #計算代價值 loss = sess.run(cost,feed_dict={input_x:train_x,input_y:train_y}) print('step {0} cost {1} w {2} b{3}'.format(step,loss,sess.run(w),sess.run(b))) #保存每display_step輪訓練後的代價值以及當前迭代輪數 if not loss == np.nan: plotdata['batch_size'].append(step) plotdata['loss'].append(loss) print('Finished!') #手動保存檢查點文件 #sv.saver.save(sess,'./LinearRegression/sv/sv.cpkt',global_step = step) sv.stop()