merge all引發的血案

2021-08-09 08:55:45 字數 3300 閱讀 9571

在訓練深度神經網路的時候,我們經常會使用dropout,然而在test的時候,需要把dropout撤掉.為了應對這種問題,我們通常要建立兩個模型,讓他們共享變數。詳情.

為了使用tensorboard來視覺化我們的資料,我們會經常使用summary,最終都會用乙個簡單的merge_all函式來管理我們的summary當這兩種情況相遇時,bug就產生了,看**:

import tensorflow as tf

import numpy as np

class

model

(object):

def__init__

(self):

self.graph()

self.merged_summary = tf.summary.merge_all()# 引起血案的地方

defgraph

(self):

self.x = tf.placeholder(dtype=tf.float32,shape=[none,1])

self.label = tf.placeholder(dtype=tf.float32, shape=[none,1])

w = tf.get_variable("w",shape=[1,1])

self.predict = tf.matmul(self.x,w)

self.loss = tf.reduce_mean(tf.reduce_sum(tf.square(self.label-self.predict),axis=1))

self.train_op = tf.train.gradientdescentoptimizer(0.01).minimize(self.loss)

tf.summary.scalar("loss",self.loss)

defrun_epoch

(session, model):

x = np.random.rand(1000).reshape(-1,1)

label = x*3

feed_dic =

su = session.run([model.merged_summary], feed_dic)

defmain

():with tf.graph().as_default():

with tf.name_scope("train"):

with tf.variable_scope("var1",dtype=tf.float32):

model1 = model()

with tf.name_scope("test"):

with tf.variable_scope("var1",reuse=true,dtype=tf.float32):

model2 = model()

with tf.session() as sess:

tf.global_variables_initializer().run()

run_epoch(sess,model1)

run_epoch(sess,model2)

if __name__ == "__main__":

main()

運**況是這樣的: 執行run_epoch(sess,model1)時候,程式並不會報錯,一旦執行到run_epoch(sess,model1),就會報錯(錯誤資訊見文章最後)。

看**片段:

class

model

(object):

def__init__

(self):

self.graph()

self.merged_summary = tf.summary.merge_all()# 引起血案的地方

...with tf.name_scope("train"):

with tf.variable_scope("var1",dtype=tf.float32):

model1 = model() # 這裡的merge_all只是管理了自己的summary

with tf.name_scope("test"):

with tf.variable_scope("var1",reuse=true,dtype=tf.float32):

model2 = model()# 這裡的merge_all管理了自己的summary和上邊模型的summary

由於summary的計算是需要feed資料的,所以會報錯。

我們只需要替換掉merge_all就可以解決這個問題。看**

class

model

(object):

def__init__

(self,scope):

self.graph()

self.merged_summary = tf.summary.merge(

tf.get_collection(tf.graphkeys.summaries,scope)

)...with tf.graph().as_default():

with tf.name_scope("train") as train_scope:

with tf.variable_scope("var1",dtype=tf.float32):

model1 = model(train_scope)

with tf.name_scope("test") as test_scope:

with tf.variable_scope("var1",reuse=true,dtype=tf.float32):

model2 = model(test_scope)

關於tf.get_collection位址

tensorflow.python.framework.errors_impl.invalidargumenterror: you must feed a value for placeholder tensor 『train/var1/placeholder』 with dtype float

[node: train/var1/placeholder = placeholder[dtype=dt_float, shape=, _device=」/job:localhost/replica:0/task:0/gpu:0」]]

signed unsigned 引發的血案

bug描述 問題產生於區域網傳輸一幅。服務端負責傳送,是由另乙個同事用c 寫的,我用c 寫接收客戶端。我們約定在傳輸一幅前,先傳固定4個位元組的size資訊,然後傳資料。結果發現有些總是末尾壞掉一截或是乾脆就傳不過來。bug原因 在我接收到size 4 後,我採用了size size 3 256 2...

parseInt引發的血案

今天做了個專題活動,頁面頭上有個倒計時 專題做完後上線了,沒發現有什麼問題,結果,運營mm突然和我說 技術哥哥出問題了,360瀏覽器在秒數從10到09的時候直接變成 00 了 一看我去真的,該死的360 還有ie7 這個倒計時的原理是先獲取系統時間.分鐘,秒,毫秒賦值在span上面 span id ...

條件斷點引發的血案

今天在除錯打條件斷點時,想起一出除錯往事。同樣也是條件斷點,難倒了我們這所有程式設計師。為了以後總能記得這事,把這事寫到偶部落格裡。當時我們伺服器的光哥在 linux 下用gdb 除錯一段 發現執行到乙個地方時有乙個變數的值是乙個與預期不符的值,於是順手打了乙個條件斷點 當執行到這一行,這個變數的值...