2017-10-11 52 views
1

我有模型A(自動編碼器),它將一批圖像A_in(原始圖像)作爲輸入,並輸出一批圖像A_out(重建圖像)。然後我有模型B(二進制分類器),它將一批圖像B_in作爲輸入,它是A_in和A_out的混合。如何連接兩個模型

我想讓B區分A_in和A_out,看看A是否做得很好,重建圖像。 B_out是給定圖像是A_in的概率。

B列車與A並列以對兩種圖像進行分類。 B_loss =(B_out - 標籤)。標籤爲0或1(原始或重建)。當我們優化B_loss時,我們只更新B參數。

我想訓練模型A,以便優化組合丟失函數:Combined_Loss =重建錯誤(A_out - A_in) - 分類錯誤(B_out - 標籤),以便它嘗試重建圖像並在同時。在這裏我只想更新A參數(我們不想在這裏幫助B)。

現在,我的問題是關於構造A_in和A_out的混合物,並將其饋送給B,以使圖A和B連接起來。

現在是這樣的:

A_out = autoencoder(A_in: orig_images) 
B_out = classifier(B_in: numpy(mix(A_in, A_out)) 

如何定義它是這樣的:

A_out = autoencoder(A_in: orig_images) 
B_out = classifier(mix(A_out, A_in)) 

所以,當我訓練A和B在同一時間:

sess.run([autoencoder_train_op, classifier_train_op], feed_dict= 
      {A_in: orig_images, B_in: classifier_images, labels: classifier_labels}) 

我不需要B_in佔位符(圖形將被連接)?

這裏是我的NumPy的代碼,構造classifier_images(混合(A_IN,A_OUT)):

reconstr_images = sess.run(A_out, feed_dict={A_in: orig_images}) 

half_and_half_images = np.concatenate((reconstr_images[:batch_size/2], orig_images[batch_size/2:])) 

half_and_half_labels = np.zeros(labels.shape) 
half_and_half_labels[batch_size/2:] = 1 

random_indices = np.random.permutation(batch_size) 

classifier_images = half_and_half_images[random_indices] 
classifier_labels = half_and_half_labels[random_indices] 

如何轉換成TensorFlow節點?

+0

是否有任何特定的問題,您正在轉換此代碼爲tf?這似乎是非常簡單的代碼,應該可以使用'tf.concat','tf.zeros','tf.random_shuffle'等來實現。另外,我不確定爲什麼你需要洗牌。據推測,不同的圖像在同一時間進給只是爲了配料和獨立處理。如果是這樣,你不應該洗牌,除非你批量大,你想洗牌更好的優化軌跡。 – iga

+0

關於洗牌的好處 - 這不是必要的。然而,這並沒有改變主要問題:如何將分類器(B_in:numpy(mix(A_in,A_out))轉換爲分類器(mix(A_out,A_in)),以便這兩個圖形連接起來? – MichaelSB

+0

我明白了。 。這個問題,我會嘗試用一個答案回答它 – iga

回答

0

您可以直接連接您的模型。換句話說,您不使用佔位符來輸入B的輸入,而是使用A_in和A_out的混合。如果您只是想運行B,您仍然可以將輸入饋送到來自A的張量中。僅喂送佔位符很常見,但TensorFlow支持將值輸入任何張量。如果它更容易思考,則可以通過tf.identity傳遞A的輸出,以便您擁有像佔位符之類的東西。

另一種方法是通常在GAN中完成的工作(發生器輸出饋入鑑別器)。您可以創建兩個共享變量的「操作塔」。一個塔樓將只是B,你可以將你的輸入輸入到B的佔位符中,只運行B.另一個塔樓可以在A的頂部,B可以用來運行/訓練A和B.這兩座塔樓中的B將具有相同的結構和共享變量,但具有單獨的操作。這種方法可能是最乾淨和最靈活的。

+0

「而是用你的A_IN和A_OUT的混合物」 這正是想什麼,我知道:?該怎麼做 我想知道如果我能做到這一點像這樣: 'A_OUT =自動編碼器(A_IN:orig_images) 混合= tf.concat(A_OUT,A_IN) B_OUT =分類(混合)' – MichaelSB

+0

我可能會丟失一些東西,但爲什麼你認爲它可能是一個問題?只要它在邏輯上是正確的並且形狀匹配....你期望什麼問題? – iga

+0

我不知道「分類器」期望什麼樣的參數,所以很難說出任何內容。它期望'feed_dict'中使用的具體值,它不會「連接」模型。如果它期望張量並將它們用作其操作的輸入,它將「連接」模型。 – iga