2017-02-20 1 views
2

J'écris un code cnn métallique. Metal fournit MPSCNNLocalContrastNormalization, Étant donné que le concept de normalisation d'instance est légèrement différent, j'ai l'intention de l'implémenter en tant que fonction noyau.Je souhaite implémenter la normalisation d'instance

Cependant, le problème est que la moyenne et la variance pour chaque R, G, B devraient être obtenues lorsque la caractéristique est R, G, B dans la texture reçue de l'entrée dans la fonction du noyau. Je veux obtenir quelques conseils sur la façon de mettre en œuvre cela.

enter image description here

kernel void instance_normalization_2darray(texture2d_array<float, access::sample> src [[ texture(0) ]], 
             texture2d_array<float, access::write> dst [[ texture(1) ]], 
             uint3 tid [[thread_position_in_grid]]) { 

} 


    kernel void calculate_avgA(texture2d_array<float, access::read> texture_in [[texture(0)]], 
          texture2d_array<float, access::write> texture_out [[texture(1)]], 
          uint3 tid [[thread_position_in_grid]]) 
{ 
    int width = texture_in.get_width(); 
    int height = texture_in.get_height(); 
    int depth = texture_in.get_array_size(); 
    float4 outColor; 


    uint3 kernelIndex(0,0,0); 
    uint3 textureIndex(0,0,0); 

    for(int k = 0; k < depth; k++) { 
     outColor = (0.0, 0.0, 0.0, 0.0); 
     for (int i=0; i < width; i++) 
     { 
      for (int j=0; j < height; j++) 
      { 
       kernelIndex = uint3(i, j, k); 
       textureIndex = uint3(tid.x + i, tid.y + j, tid.z + k); 
       float4 color = texture_in.read(textureIndex.xy, textureIndex.z).rgba; 
       outColor += color; 
      } 
     } 
     outColor = outColor/(width * height); 
     texture_out.write(float4(outColor.rgba), tid.xy, textureIndex.z); 
    } 
} 

Répondre

0

Mr.Bista J'ai eu le même problème pour cela, Apple n'a pas fourni une fonction pour cela avec vitesse rapide. Et j'utilise juste MPSCNNPoolingAverage pour la moyenne de caculate avant les noyaux. Peut-être que c'est une méthode temporaire pour cela. Et l'autre algorithme n'est pas mieux que cela, comme l'algorithme de somme de réduction après mon test avec des codes. Je vais donc continuer à suivre une meilleure implémentation pour cela.

+0

Wow! Bonne idée..!! Après je moyenne avec mpscnnpoolingaverage, pouvez-vous me donner quelques conseils sur la façon d'obtenir la variance ..? –

+0

Après mpscnnpoolingaverage, vous pouvez obtenir une image mpstemporary avec nchannelx1x1 (1x1 pixle). Et puis vous pouvez utiliser un noyau pour calculer la sous-puissance et la puissance de la sous-image à partir de l'image originale, et faire une moyenne de regroupement à nouveau, vous obtiendrez la variance. – Ericking

+0

Et je vais donner un autre algorithme avec la somme de réduction se référer à l'algorithme d'optimisation INVIDA dans mon projet MetalImage dans Github. (Https://github.com/erickingxu/MetalImage.git) – Ericking