title: How to get the encoder from a trained VGG16 network
body: <p>I'm using Python 3.7.7. and Tensorflow 2.1.0.</p>
  <p>I have a pre-trained VGG16 network, and I want to get the first layers, i.e. from conv1 layer to conv5 layer.</p>
  <p>In the following picture:</p>
  <p><a href="https://i.stack.imgur.com/9NrtT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9NrtT.png" alt="enter image description here" /></a></p>
  <p>You can see a convolutional encoder-decoder architecture. I want to get the encoder part, that is, the layers that appears on the left of the image:</p>
  <p><a href="https://i.stack.imgur.com/wt1Oc.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wt1Oc.png" alt="enter image description here" /></a></p>
  <p>This is only an example but If I get the VGG16 from this function:</p>
  <pre><code>def vgg16_encoder_decoder(input_size = (200,200,1)):
      #################################
      # Encoder
      #################################
      inputs = Input(input_size, name = 'input')
  
      conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
      conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
      pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)
  
      conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
      conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
      pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)
      
      conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
      conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
      conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
      pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)
      
      conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
      conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
      conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)
      pool4 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_4')(conv4)
  
      conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
      conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
      conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
      pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)
  
      #################################
      # Decoder
      #################################
      #conv1 = Conv2DTranspose(512, (2, 2), strides = 2, name = 'conv1')(pool5)
  
      upsp1 = UpSampling2D(size = (2,2), name = 'upsp1')(pool5)
      conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv6_1')(upsp1)
      conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv6_2')(conv6)
      conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv6_3')(conv6)
  
      upsp2 = UpSampling2D(size = (2,2), name = 'upsp2')(conv6)
      conv7 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv7_1')(upsp2)
      conv7 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv7_2')(conv7)
      conv7 = Conv2D(512, 3, activation = 'relu', padding = 'same', name = 'conv7_3')(conv7)
      zero1 = ZeroPadding2D(padding =  ((1, 0), (1, 0)), data_format = 'channels_last', name='zero1')(conv7)
  
      upsp3 = UpSampling2D(size = (2,2), name = 'upsp3')(zero1)
      conv8 = Conv2D(256, 3, activation = 'relu', padding = 'same', name = 'conv8_1')(upsp3)
      conv8 = Conv2D(256, 3, activation = 'relu', padding = 'same', name = 'conv8_2')(conv8)
      conv8 = Conv2D(256, 3, activation = 'relu', padding = 'same', name = 'conv8_3')(conv8)
  
      upsp4 = UpSampling2D(size = (2,2), name = 'upsp4')(conv8)
      conv9 = Conv2D(128, 3, activation = 'relu', padding = 'same', name = 'conv9_1')(upsp4)
      conv9 = Conv2D(128, 3, activation = 'relu', padding = 'same', name = 'conv9_2')(conv9)
  
      upsp5 = UpSampling2D(size = (2,2), name = 'upsp5')(conv9)
      conv10 = Conv2D(64, 3, activation = 'relu', padding = 'same', name = 'conv10_1')(upsp5)
      conv10 = Conv2D(64, 3, activation = 'relu', padding = 'same', name = 'conv10_2')(conv10)
  
      conv11 = Conv2D(1, 3, activation = 'relu', padding = 'same', name = 'conv11')(conv10)
  
      model = Model(inputs = inputs, outputs = conv11, name = 'vgg-16_encoder_decoder')
  
      return model
  </code></pre>
  <p>I train the network, and after train it. How can I get the encoder part? In other words, get the a model with only the original layers from <code>conv1</code> to <code>pool5</code>.</p>
  <p>I think it could be something like this:</p>
  <pre><code>model_new = Model(input=model_old.layers[0].input, 
                    output=model_old.layers[12].output)
  </code></pre>