У 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.
Мой вопрос, есть ли более быстрый и лучший способ сделать такую упаковку.Возможно приложение для создания заглушек или что-то?