Оберните Braincript CNTK с C # - PullRequest
0 голосов
/ 14 мая 2019

У CNTK есть C # API, но он настолько глючит, что я нахожу его в большей степени бесполезным.

Я посмотрел на Brainscript CNTK, и он очень C # py!

IЯ частично собрал C # Wrapper, который оборачивает Brainscript, по крайней мере, его части, так что я могу запустить CNTK с Cntk-файлом, созданным на C #.

У меня работает простой код.Вот фрагмент:

int vocabSize = 943;
int numLabels = 129;
int numIntents = 26;

int inputDim = 0;
int labelDim = 0;
int embDim = 150;
int hiddenDim = 300;

string baseDir = ".";

Wrapper wrapper = new Wrapper
{

    // The Command:
    Command = "TrainTagger:TestTagger",

    // Needs some thought, might be able to be done better...
    ModelParameters = new Dictionary<string, int>
    {
        { "vocabSize", vocabSize },
        { "numLabels", numLabels },
        { "numIntents", numIntents }
    },

    // The Action Type:
    ActionType = ActionType.Train,

    // Set the Directory structure:
    RootDir = baseDir,
    DataDir = "Data",
    ModelDir = "Model",
    ModelPath = "slu.cmf",

    // Needs some thought, might be able to be done better...
    ModelHiddenParameters = new Dictionary<string, string>
    {
        { "inputDim", "$vocabSize$" },
        { "labelDim", "$numLabels$" },
        { "embDim", embDim.ToString() },
        { "hiddenDim", hiddenDim.ToString() }
    },

    // The actual Model:
    Sequential = new List<ILayer>
    {

        new EmbeddingLayer(embDim),
        new RecurrentLSTMLayer(hiddenDim, false),
        new DenseLayer(labelDim)
    },

    // Initialise the Input to the Model Input and Input to the Model Output:
    ModelInitialisers = new Dictionary<string, string>
    {
        { "query", "inputDim"},
        { "slotLabels", "labelDim"}
    },

    // The SGD configuration block controls the behavior of the SGD (Stochastic Gradient Descent) algorithm in CNTK:
    SGD = new SGD
    {

        MaxEpochs = 8,
        EpochSize = 36000,
        MinibatchSize = 70,
        LearningRatesPerSample = "0.003 * 2:0.0015 * 12:0.0003",
        GradUpdateType = GradUpdateType.AdaGrad,
        GradientClippingWithTruncation = true,
        ClippingThresholdPerSample = 15.0,
        FirstMBsToShowResult = 10,
        NumMBsToShowResult = 100
    },

    // The reader block is used for all types of readers and the readerType parameter determines which reader to use:
    Reader = new Reader
    {

        ReaderType = ReaderType.CNTKTextFormatReader,
        File = Path.Combine(".", "atis.test.ctf"),
        Randomize = false,
        Input = new Dictionary<string, Input>
        {
            { "features", new Input("S0", vocabSize, FormatType.Sparse) },
            { "intents", new Input("S1", numLabels, FormatType.Sparse) },
            { "labels", new Input("S2", numIntents, FormatType.Sparse) }
        },
    }
};
wrapper.Run();

То, что я делаю, - это преобразование классов в соответствующие функции Brainscript, все в строки.Затем я создаю файл конфигурации для запуска с CNTK.

Мой вопрос, есть ли более быстрый и лучший способ сделать такую ​​упаковку.Возможно приложение для создания заглушек или что-то?

...