2017-09-15 6 views
1

Je suis actuellement en train de réimplémenter mon implémentation TensorFlow de Jonathan Longs FCN8-s en utilisant CNTK. Alors que TensorFlow est entre-temps très familier avec moi, je suis très inexpérimenté en utilisant Microsofts CNTK pour le moment. J'ai lu quelques tutoriels CNTK Github mais maintenant je suis au point où je veux ajouter pool4_score avec le calque upscore. Dans tensorflow Je voudrais simplement utiliser tf.add(pool4_score, upscore1) mais CNTK je dois utiliser Sequentials (correct?) Donc, mon code ressemble à:Comment ajouter deux couches dans un séquentiel CNTK

with default_options(activation=None, pad=True, bias=True): 
    z = Sequential([ 
     For(range(2), lambda i: [ 
      Convolution2D((3,3), 64, pad=True, name='conv1_{}'.format(i)), 
      Activation(activation=relu, name='relu1_{}'.format(i)), 
     ]), 
     MaxPooling((2,2), (2,2), name='pool1'), 

     For(range(2), lambda i: [ 
      Convolution2D((3,3), 128, pad=True, name='conv2_{}'.format(i)), 
      Activation(activation=relu, name='relu2_{}'.format(i)), 
     ]), 
     MaxPooling((2,2), (2,2), name='pool2'), 

     For(range(3), lambda i: [ 
      Convolution2D((3,3), 256, pad=True, name='conv3_{}'.format(i)), 
      Activation(activation=relu, name='relu3_{}'.format(i)), 
     ]), 
     MaxPooling((2,2), (2,2), name='pool3'), 

     For(range(3), lambda i: [ 
      Convolution2D((3,3), 512, pad=True, name='conv4_{}'.format(i)), 
      Activation(activation=relu, name='relu4_{}'.format(i)), 
     ]), 
     MaxPooling((2,2), (2,2), name='pool4'), 

     For(range(3), lambda i: [ 
      Convolution2D((3,3), 512, pad=True, name='conv5_{}'.format(i)), 
      Activation(activation=relu, name='relu5_{}'.format(i)), 
     ]), 
     MaxPooling((2,2), (2,2), name='pool5'), 

     Convolution2D((7,7), 4096, pad=True, name='fc6'), 
     Activation(activation=relu, name='relu6'), 
     Dropout(0.5, name='drop6'), 

     Convolution2D((1,1), 4096, pad=True, name='fc7'), 
     Activation(activation=relu, name='relu7'), 
     Dropout(0.5, name='drop7'), 

     Convolution2D((1,1), num_classes, pad=True, name='fc8') 

     ConvolutionTranspose2D((4,4), num_classes, strides=(1,2), name='upscore1') 
     # TODO: 
     # conv for pool4_score with (1x512) and 21 classes 
     # combine upscore 1 and pool4_score 
    ])(input) 

Je lis qu'il ya une méthode combine .. Mais je l'ai trouvé aucun exemple comment utiliser dans le séquentiel. Alors, comment pourrais-je implémenter la méthode tf.add en utilisant CNTK?

Merci beaucoup!

Répondre

2

Vous pouvez utiliser C.plus ou +, dans ce cas, vous devrez diviser votre séquence pour accéder au calque que vous souhaitez ajouter.

Par exemple, le ci-dessous:

z = Sequential([Convolution2D((3,3), 64, pad=True), 
       MaxPooling((2,2), (2,2))])(input) 

équivaut à:

z1 = Convolution2D((3,3), 64, pad=True)(input) 
z2 = MaxPooling((2,2), (2,2))(z1) 

Vous pouvez maintenant faire z1 + z2.