簡體   English   中英

張量流,訓練后分裂自動編碼器

[英]tensorflow, splitting autoencoder after training

我在tensorflow 1x中有自動編碼器模型(不是keras),我正在嘗試在訓練后將模型分為編碼器和解碼器。

兩者都在同一范圍內起作用,我有3個PlaceHolders

self.X = tf.placeholder(shape=[None, vox_res64, vox_res64, vox_res64, 1], dtype=tf.float32)
self.Z = tf.placeholder(shape=[None,500], dtype=tf.float32)

self.Y = tf.placeholder(shape=[None, vox_rex256, vox_rex256, vox_rex256, 1], dtype=tf.float32)

 with tf.variable_scope('aeu'):
            self.lfc=self.encoder(self.X)

            self.Y_pred, self.Y_pred_modi = self.decoder(self.lfc)

編碼器和解碼器如下

    def encoder(self,X):
        with tf.device('/gpu:'+GPU0):
            X = tf.reshape(X,[-1, vox_res64,vox_res64,vox_res64,1])
            c_e = [1,64,128,256,512]
            s_e = [0,1 , 1, 1, 1]
            layers_e = []
            layers_e.append(X)
            for i in range(1,5,1):
                layer = tools.Ops.conv3d(layers_e[-1],k=4,out_c=c_e[i],str=s_e[i],name='e'+str(i))
                layer = tools.Ops.maxpool3d(tools.Ops.xxlu(layer, label='lrelu'), k=2,s=2,pad='SAME')
                layers_e.append(layer)

            ### fc
            [_, d1, d2, d3, cc] = layers_e[-1].get_shape()
            d1=int(d1); d2=int(d2); d3=int(d3); cc=int(cc)
            lfc = tf.reshape(layers_e[-1],[-1, int(d1)*int(d2)*int(d3)*int(cc)])
            lfc = tools.Ops.xxlu(tools.Ops.fc(lfc, out_d=500,name='fc1'), label='relu')
            print (d1)
            print(cc)
        return lfc


    def decoder(self,Z):
        with tf.device('/gpu:'+GPU0):


            lfc = tools.Ops.xxlu(tools.Ops.fc(Z, out_d=2*2*2*512, name='fc2'), label='relu')

            lfc = tf.reshape(lfc, [-1,2,2,2,512])

            c_d = [0,256,128,64]
            s_d = [0,2,2,2]
            layers_d = []
            layers_d.append(lfc)
            for j in range(1,4,1):

                layer = tools.Ops.deconv3d(layers_d[-1],k=4,out_c=c_d[j],str=s_d[j],name='d'+str(len(layers_d)))

                layer = tools.Ops.xxlu(layer, label='relu')
                layers_d.append(layer)
            ###
            layer = tools.Ops.deconv3d(layers_d[-1],k=4,out_c=1,str=2,name='dlast')
            print("****************************",layer)
            ###
            Y_sig = tf.nn.sigmoid(layer)
            Y_sig_modi = tf.maximum(Y_sig,0.01)

        return Y_sig, Y_sig_modi

當我在訓練后嘗試使用模型時


 X = tf.get_default_graph().get_tensor_by_name("Placeholder:0")
 Z = tf.get_default_graph().get_tensor_by_name("Placeholder_1:0")
 Y_pred = tf.get_default_graph().get_tensor_by_name("aeu/Sigmoid:0")
 lfc = tf.get_default_graph().get_tensor_by_name("aeu/Relu:0")


提取潛在代碼工作正常

 lc = sess.run(lfc, feed_dict={X: x_sample})

現在我想將潛在代碼用作解碼器的輸入我遇到錯誤我必須填寫X(PLACEHOLDER)

 y_pred = sess.run(Y_pred, feed_dict={Z: lc})

我如何拆分為編碼器解碼器? 我只搜索了我發現的keras示例

我注意到的第一件事是您沒有將self.Z傳遞到解碼器的任何位置。 因此,tensorflow不能僅將占位符與您先前使用的z自動鏈接起來。

您可以采取幾種措施來解決此問題。 最簡單的方法是嘗試重新創建解碼器圖,但是當您調用變量作用域時,請設置reuse = True。


    with tf.variable_scope('aeu',reuse=True):
        self.new_Y, self.new_Y_modi = self.decoder(self.Z)

    y_pred = sess.run(self.new_Y, feed_dict={self.Z: lc})

這可能是最簡單的方法。 在這種情況下,也可能會要求您填充占位符X,但是您可以只用一個空數組來填充它。 通常,除非存在某種將兩者聯系在一起的控件依賴項,否則Tensorflow不會要求它。

我發現了如何分割模型。

如果有人想知道我會回答

我的錯誤是:

1:我沒有將self.Z傳遞給解碼器

2:對於以下行

y_pred = sess.run(Y_pred, feed_dict={Z: lc})

在我訓練了我的模型tensorflow之后,此文件在不同文件中的這一行將不知道[z]指的是什么,因此您必須使用與確定張量相同的變量,如下所示

 lfc = tf.get_default_graph().get_tensor_by_name("aeu/Relu:0")

我將其命名為[lfc]而不是[Z]

因此更改代碼以解決問題

y_pred = sess.run(Y_pred, feed_dict={lfc: lc})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM