2017-09-25 1 views
-1

일부 데이터 샘플을 사용하여 CNTK 모델을 교육하기 위해 Python으로 작업 스크립트를 만들었습니다. 이제 CNTK V2.2에서 C#으로 변환하려고하지만 다른 결과가 나타납니다.C#의 CNTK 시퀀스

def create_model_function(num_hidden_layers,hidden_layers_dim,num_output_classes): 
    return Sequential([For(range(num_hidden_layers) 
          , lambda i: Dense(hidden_layers_dim 
          , activation=cntk.tanh)) 
          , Dense(num_classes,init=cntk.glorot_uniform() 
          , activation=cntk.softmax)]) 

감사


내 C# 기능은 다음과 같습니다 :

private Function CreateModel(DeviceDescriptor device, int HiddenLayerCount, int HiddenLayerDimension,int OutputClassesCount, Variable Input) 
    { 

     Function[] HiddenLayers= new Function[HiddenLayerCount]; 
     for (int i = 1; i < HiddenLayerCount - 1; i++) 
     { 
      HiddenLayers[i] = Dense(HiddenLayers[i - 1], HiddenLayerDimension, device, Activation.Tanh, ""); 
     } 

     return Dense(HiddenLayers[HiddenLayerCount-1], OutputClassesCount, device, Activation.Sigmoid, ""); 

    } 

난 그냥 아니에요

내가 모델을 만들 파이썬에있어 무엇인가 이것이 파이썬 순차와 동일하다는 것을 명심하십시오.

+0

그리고 동일한 C# 코드는 무엇입니까? 결과는 어떻게 다른가요? –

+0

이 함수를 사용해 보았습니다 : private 함수 CreateModel (DeviceDescriptor 장치, int HiddenLayerCount, int HiddenLayerDimension, int OutputClassesCount, 변수 입력) { 함수 [] HiddenLayers = new 함수 [HiddenLayerCount]; for (int i = 1; i

답변

0

파이썬 밀도 함수는 C#에서 아직 직접 지원되지 않습니다. C#에서 사용한 Dense 함수는 CNTK Python 구현과 다를 수 있습니다. C#에서 사용할 수있는 연산자를 사용하여 C# 및 Python으로 모델을 빌드하고 이들이 동일한 지 확인할 수 있습니까?

모델 그래프를 확인할 수 있도록 C# 함수를 추가했습니다. C#으로로드 된 파이썬 모델과 함께 사용하고 C#에서 만든 것과 비교하십시오. 감사.

static void PrintGraph(Function function, int spaces, bool useName = false) 
    { 
     string indent = new string('.', spaces); 
     if (function.Inputs.Count() == 0) 
     { 
      Console.WriteLine(indent + "(" + (useName ? function.Name : function.Uid) + ")" + 
       "(" + function.OpName + ")" + function.AsString()); 
      return; 
     } 

     foreach (var input in function.Inputs) 
     { 
      Console.WriteLine(indent + "(" + (useName ? function.Name : function.Uid) + ")" + 
       "(" + function.OpName + ")" + "->" + 
       "(" + (useName ? input.Name : input.Uid) + ")" + input.AsString()); 
     } 

     foreach (var input in function.Inputs) 
     { 
      if (input.Owner != null) 
      { 
       Function f = input.Owner; 
       PrintGraph(f, spaces + 4, useName); 
      } 
     } 
    } 
0

다음 예는 왼쪽에서 오른쪽으로 간단한 피드 순방향 경로를 보여줍니다.

깊은 네트워크를 생성하려면 은 요구 사항에 따라 FOR LOOP을 제어합니다.

이 예제에서는 루프 제어가 짝수 및 홀수 루프 개수가있는 노드 수를 수정하고 있습니다. CreateUniteLayer가 단위 층을 만듭니다. - 왼쪽의 LXNodes가 오른쪽의 LYNodes에 연결되었습니다. 다른 변수는 자체적으로 설명됩니다.

트레이너를 만들려면 ParameterVector NetParamVec이 필요합니다. CNTKLib.xxxx_learner 기능을 사용하는 경우 매개 변수로 전달하십시오. 조심 입력 연결 확인

첫번째 층에 마련되어, 제 1 중간 층 층을하고 마지막 층에 연결 마침내 시그 모이 선도. 필요에 따라 LXNodes 및 LYNodes 변수를 적절하게 조정하십시오.

이 코드를 클래스에 추가하거나 애플리케이션에 적합한 메서드 내에서 가져옵니다.

경우 동일한 노드 크기의 모든 레이어, 레이어

NetOut 깊은 네트워크의 최종 출력을 나타내는 당 노드 LXNodes = LYNodes 번호 = 건물.

네가 찾고있는 그물을 만드는 데 도움이되기를 바랍니다.

최고의 소원.

List<Function> Layers = new List<Function>() ; 
ParameterVector NetParamVec = new ParameterVector(); 

// Define first layer immediately after input. 
Function layer1 = CreateUnitLayer(features, LXNodes, inputDim, "NetLayer0", InitWeight, InitBias); 
Layers.Add(layer1); 

//Defines Intermediate hidden layers 
for (int i = 1; i < LayerCount; i++) 
{ 
    Function ly; 
    if (i % 2 == 0) 
     ly = CreateUnitLayer(Layers[i - 1], LXNodes, LYNodes, "NetLayer" + i.ToString(), InitWeight, InitBias); 
    else 
     ly = CreateUnitLayer(Layers[i - 1], LYNodes, LXNodes, "NetLayer" + i.ToString(), InitWeight, InitBias); 
    Layers.Add(ly); 
} 

//Defines Last layer 
int lastDim = LXNodes; 
if (LayerCount % 2 == 0)lastDim = LYNodes; 
Function layerLast = CreateUnitLayer(Layers[LayerCount - 1], outDim, lastDim, "NetLayerOut", InitWeight, InitBias); 
Layers.Add(layerLast); 

Function NetOut = CNTKLib.Sigmoid(layerLast); 

public Function CreateUnitLayer(Variable LXIn, int LYNodes, int LXNodes, string LYName, float InitWeight, float InitBias) 
{ 
    Parameter weightParamy = new Parameter(new int[] { LYNodes, LXNodes }, DataType.Float, InitWeight, device, "W" + LYName); 
    Parameter biasParamy = new Parameter(new int[] { LYNodes }, DataType.Float, InitBias, device, "B" + LYName); 
    Function LayerY = CNTKLib.Plus(CNTKLib.Times(weightParamy, LXIn), biasParamy); 
    NetParamVec.Add(weightParamy); 
    NetParamVec.Add(biasParamy); 
    return LayerY; 
}