我很难弄清楚如何在c#.net中对我创建的LSTM网络进行评估..根本没有任何帮助:)
def create_model(x,num_classes,LSTM_dim):
with default_options(initial_state=0.1):
m = C.layers.Sequential([
C.layers.Recurrence(C.layers.LSTM(LSTM_dim), go_backwards=False),
C.sequence.last,
C.layers.Dense(num_classes)
])
return m(x);
数据看起来像这样
0 |features 0.23 0.24 0 0.245 0.9723383 -0.1125 |labels -8.88333333333333
0 |features -0.01 0.02 0.23 0.075 0.2361691 -0.1725
0 |features 0 0.02 -0.01 0.04 0.1574461 -0.1916667
0 |features 0.02 0.05 0.03 0.15 0.2942928 -0.208125
0 |features -0.02 0.05 -0.01 0.115 0.09446766 -0.215
0 |features 0.04 0.09 0.03 0.165 0.2193967 -0.2204167
我的C#代码...我在C#中的数据在float列表中,我尝试在每6个位置进行拼接,但是在第二个序列中出现以下错误! ...我似乎无法弄清楚我在做什么错了:(
System.ApplicationException:'GetColumnIndex:尝试访问
正在访问不属于序列的一部分的时间步
包含在当前的小批量中。
public CntkDnn(String FileName)
{
device = DeviceDescriptor.GPUDevice(0);
Function modelFunc2 = Function.Load(FileName, device);
// var z = CNTK.CNTKLib.Softmax(modelFunc2);
var z = modelFunc2;
inputVar = z.Arguments.FirstOrDefault();
outputVar = z.Output;
inputShape = inputVar.Shape;
dataCount = inputShape[0];
nn = z;
}
public List<float> EvalSeq(List<float> input,int SplitBy)
{
//if (dataCount != input.Count) return null;
var output = new List<float>();
var starting = true;
for (int jindex = 0; jindex < input.Count; jindex += 6)
{
var thisInput = input.Skip(jindex).Take(6).ToList();
var inputDataMap = new Dictionary<Variable, Value>();
var inputValue = Value.CreateSequence<float>(inputShape, thisInput, starting, device);
inputDataMap.Add(inputVar, inputValue);
var outputDataMap = new Dictionary<Variable, Value>();
outputDataMap.Add(outputVar, null);
nn.Evaluate(inputDataMap, outputDataMap, device);
var outputVal = outputDataMap[outputVar];
var outputData = outputVal.GetDenseData<float>(outputVar)[0];
output.AddRange(outputData.ToList());
starting = false;
}
return output;
}
最佳答案
具有CNTK的C#的支持非常差。
一个代码示例:
public static Function Model { get; set; }
public Function Load(string modelFilePath, DeviceDescriptor device)
{
return Function.Load(modelFilePath, device);
}
然后:
public void Evaluate(string word, function model, DeviceDescriptor device)
{
// Create Input Dictionary Pair:
Dictionary<Variable, Value> ModelInput = new Dictionary<Variable, Value>
{
{ model.Arguments.Single(), Value.CreateBatch<float>(XDim, new int[] { 7 }, DeviceDescriptor.GPUDevice(0), true) }
};
// Vector the Model's Output Variable.
Variable OutputVariable = model.Output;
// Create Output Dictionary Pair:
Dictionary<Variable, Value> ModelOutput = new Dictionary<Variable, Value>
{
{ OutputVariable, null }
};
// Evaluate the Model using the Device:
model.Evaluate(ModelInput, ModelOutput, device);
// Vector evaluate result as dense output
IList<IList<float>> OutputValue = ModelOutput[OutputVariable].GetDenseData<float>(OutputVariable);
IList<float> t = OutputValue[0];
int index = t.IndexOf(t.Max());
// Do what you need with your index...
}
注意:
Value.CreateBatch<float>(XDim, new int[] { 7 }
其中7在您输入类别的长度之内,是一个稀疏变量。您会注意到,有更好的方法可以执行此操作,这只是一个非常基本的示例。
我已经建立了一个网站:http://www.cntking.com/试图使C#和CNTK有所发展。
我希望这有帮助!
关于c# - CNTK LSTM评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46960003/