簡體   English   中英

從凍結模型創建可訓練的Tensorflow圖

[英]Create Trainable Tensorflow graph from frozen model

我試圖從凍結模型創建可訓練的張量流模型。

我有凍結模型的所有權重和張量流層。

使用它,我創建了一個新圖並使用這些權重進行初始化。

看起來還可以。

但是當我打印所有圖層名稱時,每個圖層都會打印三個名稱,例如

Mconv4_stage6_L2/biases
Mconv4_stage6_L2/biases/Assign
Mconv4_stage6_L2/biases/read
Mconv4_stage6_L2/weights
Mconv4_stage6_L2/weights/Assign
Mconv4_stage6_L2/weights/read

那些分配和讀取層是什么?

權重和偏差的初始化如下。

    def make_var(self, name, initializer=[], trainable=True):
       '''Creates a new TensorFlow variable.'''
       return tf.get_variable(name, trainable=self.trainable & trainable, initializer=initializer)

    @layer
    def conv(self,
             input,
             k_h,
             k_w,
             c_o,
             s_h,
             s_w,
             name,
             relu=True,
             padding=DEFAULT_PADDING,
             group=1,
             trainable=False,
             biased=True):
        # Verify that the padding is acceptable
        self.validate_padding(padding)
        # Get the number of channels in the input
        c_i = int(input.get_shape()[-1])
        # Verify that the grouping parameter is valid
        assert c_i % group == 0
        assert c_o % group == 0
        # Convolution for a given input and kernel
        convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding)
        with tf.variable_scope(name) as scope:
            for init_zer in self.inits_:
                if(init_zer['name'] == name+'/'+'weights' and 'conv' in init_zer['name']):
                    #print('weights '+init_zer['name'])
                    kernel = self.make_var('weights', initializer=tf.constant(init_zer['tensor']), trainable=self.trainable & trainable)#shape=[k_h, k_w, c_i / group, c_o]
            if group == 1:
                # This is the common-case. Convolve the input without any further complications.
                output = convolve(input, kernel)
            else:
                # Split the input into groups and then convolve each of them independently
                input_groups = tf.split(3, group, input)
                kernel_groups = tf.split(3, group, kernel)
                output_groups = [convolve(i, k) for i, k in zip(input_groups, kernel_groups)]
                # Concatenate the groups
                output = tf.concat(3, output_groups)
            # Add the biases
            if biased:
                for init_zer in self.inits_:
                    if(init_zer['name'] == name+'/'+'biases' and 'conv' in init_zer['name']):
                        #print('bias '+init_zer['name'])
                        biases = self.make_var('biases', initializer=tf.constant(init_zer['tensor']), trainable=self.trainable & trainable)
                output = tf.nn.bias_add(output, biases)

            if relu:
                # ReLU non-linearity
                output = tf.nn.relu(output, name=scope.name)
            return output

在這種情況下,我是否需要再次運行global_variables_initializer? 我的整個代碼是https://www.dropbox.com/s/rcoc1hsd3j2i0od/CMUNet.py?dl=0

https://www.dropbox.com/s/kcmrm06k9dz40em/network_base.py?dl=0

https://www.dropbox.com/s/2r164gdk2fzshhr/network_cmu.py?dl=0

我的代碼是正確的。 我所做的是上傳模型並初始化權重和偏差。 然后保存模型。 從保存的模型和檢查點凍結新模型。 我在Tensorboard上比較了舊的凍結模型和新的凍結模型。 它們是相同的,我看不到具有Assign和read的任何節點。 但是我想知道當我打印節點名稱時它們是什么。

暫無
暫無

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

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