Merge branch 'aayushg/floorCeilRoundOp' into aayushg/ops_facade
This commit is contained in:
Коммит
601c96ac7a
|
@ -15,10 +15,7 @@ Format(value, format) = new StringFunction [ what = 'Format' ; arg = value ; how
|
|||
Replace(s, from, to) = new StringFunction [ what = 'Replace' ; arg = s ; replacewhat = from ; withwhat = to ]
|
||||
Substr(s, begin, num) = new StringFunction [ what = 'Substr' ; arg = s ; pos = begin ; chars = num ]
|
||||
Chr(c) = new StringFunction [ what = 'Chr' ; arg = c ]
|
||||
Floor(x) = new NumericFunction [ what = 'Floor' ; arg = x ]
|
||||
Length(x) = new NumericFunction [ what = 'Length' ; arg = x ]
|
||||
Ceil(x) = -Floor(-x)
|
||||
Round(x) = Floor(x+0.5)
|
||||
Sign(x) = if x > 0 then 1 else if x < 0 then -1 else 0
|
||||
Min(a,b) = if a < b then a else b
|
||||
Max(a,b) = if a > b then a else b
|
||||
|
@ -106,6 +103,9 @@ ElementTimes(aMatrix, anotherMatrix, tag='') = new ComputationNode [ operation =
|
|||
ElementDivide(aMatrix, anotherMatrix, tag='') = ElementTimes(aMatrix, Reciprocal(anotherMatrix))
|
||||
ErrorPrediction(labelVectorSequence, outVectorSequence, tag='') = new ComputationNode [ operation = 'ErrorPrediction' ; inputs = (labelVectorSequence : outVectorSequence) /*plus the function args*/ ]
|
||||
Exp(x, tag='') = new ComputationNode [ operation = 'Exp' ; inputs = x /*plus the function args*/ ]
|
||||
Floor(x, tag='') = new ComputationNode [ operation = 'Floor' ; inputs = x /*plus the function args*/ ]
|
||||
Ceil(x, tag='') = Negate(Floor(Negate(x)), tag=tag)
|
||||
Round(x, tag='') = Floor(Plus(x, ConstantTensor(0.5, (1))), tag=tag)
|
||||
GatherPacked(indexSequence, sourceData, tag='') = new ComputationNode [ operation = 'GatherPacked' ; inputs = (indexSequence : sourceData) /*plus the function args*/ ]
|
||||
GMMLogLikelihood(unnormalizedPriorVector, meansAsRows, logStdDevAsRows, dataVectorSequence, tag='') = new ComputationNode [ operation = 'GMMLogLikelihood' ; inputs = (unnormalizedPriorVector : meansAsRows : logStdDevAsRows : dataVectorSequence) /*plus the function args*/ ]
|
||||
InvStdDev(dataVectorSequence, tag='') = new ComputationNode [ operation = 'InvStdDev' ; inputs = dataVectorSequence /*plus the function args*/ ]
|
||||
|
|
|
@ -52,6 +52,7 @@ static shared_ptr<ComputationNode<ElemType>> CreateStandardNode(const std::wstri
|
|||
else if (nodeType == OperationNameOf(EnvironmentInputNode)) return New<EnvironmentInputNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
else if (nodeType == OperationNameOf(ErrorPredictionNode)) return New<ErrorPredictionNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
else if (nodeType == OperationNameOf(ExpNode)) return New<ExpNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
else if (nodeType == OperationNameOf(FloorNode)) return New<FloorNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
else if (nodeType == OperationNameOf(FutureValueNode)) return New<FutureValueNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
else if (nodeType == OperationNameOf(GatherPackedNode)) return New<GatherPackedNode<ElemType>>(forward<_Types>(_Args)...);
|
||||
#ifdef COMING_SOON
|
||||
|
@ -514,6 +515,12 @@ shared_ptr<ComputationNode<ElemType>> ComputationNetworkBuilder<ElemType>::Abs(c
|
|||
return net.AddNodeToNetAndAttachInputs(New<AbsNode<ElemType>>(net.GetDeviceId(), nodeName), { a });
|
||||
}
|
||||
|
||||
template <class ElemType>
|
||||
shared_ptr<ComputationNode<ElemType>> ComputationNetworkBuilder<ElemType>::Floor(const ComputationNodePtr a, const std::wstring nodeName)
|
||||
{
|
||||
return net.AddNodeToNetAndAttachInputs(New<FloorNode<ElemType>>(net.GetDeviceId(), nodeName), { a });
|
||||
}
|
||||
|
||||
template <class ElemType>
|
||||
shared_ptr<ComputationNode<ElemType>> ComputationNetworkBuilder<ElemType>::Hardmax(const ComputationNodePtr a, const std::wstring nodeName)
|
||||
{
|
||||
|
|
|
@ -110,6 +110,7 @@ public:
|
|||
ComputationNodePtr ElementTimes(const ComputationNodePtr a, const ComputationNodePtr b, const std::wstring nodeName = L"");
|
||||
ComputationNodePtr ErrorPrediction(const ComputationNodePtr a, const ComputationNodePtr b, const std::wstring nodeName = L"");
|
||||
ComputationNodePtr Exp(const ComputationNodePtr a, const std::wstring nodeName = L"");
|
||||
ComputationNodePtr Floor(const ComputationNodePtr a, const std::wstring nodeName = L"");
|
||||
ComputationNodePtr FutureValue(const ComputationNodePtr a, const float initHiddenActivity, const size_t row_size, size_t timeStep, const std::wstring nodeName = L"");
|
||||
#ifdef COMING_SOON
|
||||
ComputationNodePtr GMMLogLikelihood(const ComputationNodePtr unnormedPrior, const ComputationNodePtr mean, const ComputationNodePtr logStddev, const ComputationNodePtr feature, const std::wstring nodeName = L"");
|
||||
|
|
|
@ -143,6 +143,7 @@ DeclareUnaryElementWiseWithOpCodeNode(Log, Log, Elementw
|
|||
DeclareUnaryElementWiseWithOpCodeNode(Exp, Exp, ElementwiseProduct, BinaryWithOutputGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Cosine, Cosine, ElementwiseProductWithCosDerivative, BinaryWithInputGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Abs, Abs, ElementwiseProductWithAbsDerivative, BinaryWithInputGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Floor, Floor, ConstZero, UnaryGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Negate, Negate, Negate, UnaryGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Sqrt, Sqrt, ElementwiseProductWithSqrtDerivative, BinaryWithOutputGradient);
|
||||
DeclareUnaryElementWiseWithOpCodeNode(Reciprocal, Reciprocal, ElementwiseProductWithReciprocalDerivative, BinaryWithOutputGradient);
|
||||
|
|
|
@ -70,10 +70,10 @@ private:
|
|||
enum ElementWiseOperator
|
||||
{
|
||||
// nullary
|
||||
opConstOne,
|
||||
opConstOne, opConstZero,
|
||||
// unary (or binary with constant parameter)
|
||||
opCopy,
|
||||
opNegate, opNot, opAbs, opReciprocal,
|
||||
opNegate, opNot, opAbs, opFloor, opReciprocal,
|
||||
opSigmoid, opTanh, opSqr, opSqrt, opExp, opLog, opLinearRectifier, opCosine,
|
||||
// unary ops for use by Matrix class only (there is no TensorView implementation)
|
||||
opSigmoidDerivative, opLinearRectifierDerivative, opNegativeSine,
|
||||
|
@ -98,13 +98,15 @@ enum ElementWiseOperator
|
|||
|
||||
// helper to apply a C macro for all operations of each kind
|
||||
#define ForAllNullaryOps(Macro) \
|
||||
Macro(ConstOne);
|
||||
Macro(ConstOne); \
|
||||
Macro(ConstZero);
|
||||
|
||||
#define ForAllUnaryOps(Macro) \
|
||||
Macro(Copy); \
|
||||
Macro(Negate); \
|
||||
Macro(Not); \
|
||||
Macro(Abs); \
|
||||
Macro(Floor); \
|
||||
Macro(Reciprocal); \
|
||||
Macro(Sigmoid); \
|
||||
Macro(Tanh); \
|
||||
|
|
|
@ -47,6 +47,7 @@ OverloadUnaryMathFns(sqrt);
|
|||
OverloadUnaryMathFns(fabs);
|
||||
OverloadUnaryMathFns(cos);
|
||||
OverloadUnaryMathFns(sin);
|
||||
OverloadUnaryMathFns(floor);
|
||||
|
||||
#pragma push_macro("OverloadUnaryMathFns")
|
||||
|
||||
|
@ -180,6 +181,8 @@ DECL ElemType LogAdd(ElemType x, ElemType y)
|
|||
}
|
||||
|
||||
DefNullaryOp(ConstOne, 1);
|
||||
DefNullaryOp(ConstZero, 0);
|
||||
|
||||
#pragma pop_macro("DefNullaryOp")
|
||||
|
||||
#pragma push_macro("DefUnaryOp")
|
||||
|
@ -194,6 +197,7 @@ DefUnaryOp(Copy, a);
|
|||
DefUnaryOp(Negate, -a);
|
||||
DefUnaryOp(Not, !a);
|
||||
DefUnaryOp(Abs, fabs_(a));
|
||||
DefUnaryOp(Floor, floor_(a));
|
||||
DefUnaryOp(Sigmoid, Sigmoid(a));
|
||||
DefUnaryOp(Tanh, tanh_(a));
|
||||
DefUnaryOp(Sqr, Sqr(a));
|
||||
|
@ -203,6 +207,7 @@ DefUnaryOp(Log, ClippedLog(a));
|
|||
DefUnaryOp(LinearRectifier, a > 0 ? a : 0);
|
||||
DefUnaryOp(Cosine, cos_(a));
|
||||
DefUnaryOp(Reciprocal, a == 0 ? 0 : 1 / a);
|
||||
|
||||
#pragma pop_macro("DefUnaryOp")
|
||||
|
||||
#pragma push_macro("DefBinaryOp")
|
||||
|
|
|
@ -124,6 +124,9 @@
|
|||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="uci_to_cntk_text_format_converter.py" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
|
@ -50,5 +50,13 @@
|
|||
<Filter Include="Common\Include">
|
||||
<UniqueIdentifier>{C6F55578-121A-4D7C-8F57-4172BC5C463B}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Scripts">
|
||||
<UniqueIdentifier>{cd70d891-88aa-40a4-8e47-0e31e4cac48e}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="uci_to_cntk_text_format_converter.py">
|
||||
<Filter>Scripts</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,145 @@
|
|||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="UCI to CNTKText format converter",
|
||||
epilog=("Quick example - converting MNIST data (see Examples/Image/MNIST):"
|
||||
"\n\n\t"
|
||||
"--input_file Examples/Image/MNIST/Data/Train-28x28.txt "
|
||||
"--features_start 1 "
|
||||
"--features_dim 784 "
|
||||
"--labels_start 0 "
|
||||
"--labels_dim 1 "
|
||||
"--num_labels 10 "
|
||||
"--output_file Examples/Image/MNIST/Data/Train-28x28_cntk_text.txt"
|
||||
"\n\n"
|
||||
"For more infomation please visit "
|
||||
"https://github.com/Microsoft/CNTK/wiki/CNTKTextFormat-Reader"),
|
||||
formatter_class=argparse.RawTextHelpFormatter)
|
||||
|
||||
requiredNamed = parser.add_argument_group('required arguments')
|
||||
|
||||
requiredNamed.add_argument("-in", "--input_file",
|
||||
help="input file path", required=True)
|
||||
requiredNamed.add_argument("-fs", "--features_start", type=int,
|
||||
help="start offset of feature columns", required=True)
|
||||
requiredNamed.add_argument("-fd", "--features_dim", type=int,
|
||||
help=("dimension of the feature vector "
|
||||
"(number of feature columns in the input file)"),
|
||||
required=True)
|
||||
|
||||
parser.add_argument("-lt", "--label_type", default="Category",
|
||||
help=("Label type (indicates how the label columns should "
|
||||
" be interpreted)"),
|
||||
choices=["Category", "Regression", "None"])
|
||||
parser.add_argument("-ls", "--labels_start", type=int,
|
||||
help=("dimension of the label vector "
|
||||
"(number of label columns in the input file)"))
|
||||
parser.add_argument("-nl", "--num_labels", type=int,
|
||||
help="number of possible label values "
|
||||
"(required for categorical labels)")
|
||||
parser.add_argument("-ld", "--labels_dim", type=int, default=1,
|
||||
help=("dimension of the input label vector "
|
||||
"(number of label columns in the input file, "
|
||||
"default is 1)"))
|
||||
parser.add_argument("--mapping_file",
|
||||
help=("the path to a file used to map from the label value "
|
||||
"to a numerical label identifier (if omitted, the "
|
||||
"label value is interpreted as a numerical "
|
||||
"identifier)"))
|
||||
parser.add_argument("-out", "--output_file", help="output file path")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# a number of sanity checks
|
||||
if args.label_type != "None" and args.labels_start is None:
|
||||
parser.error("-ls/--label_start is required when label type is not 'None'")
|
||||
|
||||
if args.label_type == "Category":
|
||||
if args.num_labels is None:
|
||||
parser.error("-nl/--num_labels is required when label type is 'Category'")
|
||||
if args.labels_dim > 1:
|
||||
parser.error("-ld/--labels_dim cannot be greater than 1 "
|
||||
"when label type is 'Category'")
|
||||
|
||||
if args.label_type == "Regression":
|
||||
if args.num_labels > args.labels_dim:
|
||||
parser.error("-nl/--num_labels is optional and "
|
||||
" cannot exceed -ld/--labels_dim "
|
||||
" when label type is 'Regression'")
|
||||
|
||||
if args.label_type != 'None':
|
||||
if (((args.labels_start <= args.features_start) and
|
||||
(args.labels_start + args.labels_dim > args.features_start)) or
|
||||
((args.labels_start > args.features_start) and
|
||||
(args.features_start + args.features_dim > args.labels_start))):
|
||||
parser.error("Label and feature column ranges must not overlap.")
|
||||
|
||||
file_in = args.input_file
|
||||
file_out = args.output_file
|
||||
|
||||
num_labels = args.num_labels
|
||||
label_map = {}
|
||||
if args.label_type == "Category":
|
||||
if args.mapping_file is not None:
|
||||
with open(args.mapping_file, 'r') as f:
|
||||
for line in f.read().splitlines():
|
||||
label_map[line] = len(label_map)
|
||||
|
||||
num_labels = max(num_labels, len(label_map))
|
||||
else:
|
||||
label_map = {str(x) : x for x in range(num_labels)}
|
||||
|
||||
if not file_out:
|
||||
dot = file_in.rfind(".")
|
||||
if dot == -1:
|
||||
dot = len(file_in)
|
||||
file_out = file_in[:dot] + "_cntk_text" + file_in[dot:]
|
||||
|
||||
print (" Converting from UCI format\n\t '{}'\n"
|
||||
" to CNTK text format\n\t '{}'").format(file_in, file_out)
|
||||
|
||||
input_file = open(file_in, 'r')
|
||||
output_file = open(file_out, 'w')
|
||||
|
||||
for line in input_file.readlines():
|
||||
values = line.split()
|
||||
|
||||
if args.label_type != 'None':
|
||||
max_length = max(args.labels_start + args.labels_dim,
|
||||
args.features_start + args.features_dim)
|
||||
if len(values) < (args.labels_dim + args.features_dim):
|
||||
raise RuntimeError(
|
||||
("Too few input columns ({} out of expected {}) ")
|
||||
.format(len(values), (args.labels_dim + args.features_dim)))
|
||||
elif len(values) < max_length:
|
||||
raise RuntimeError(
|
||||
("Too few input columns ({} out of expected {}) ")
|
||||
.format(len(values), max_length))
|
||||
|
||||
|
||||
labels = values[args.labels_start:args.labels_start+args.labels_dim]
|
||||
|
||||
if args.label_type == 'Category':
|
||||
one_hot = ['0'] * num_labels
|
||||
# there's only one label
|
||||
label = labels[0]
|
||||
if label not in label_map:
|
||||
raise RuntimeError(("Illegal label value: '{}'").format(label))
|
||||
one_hot[label_map[label]] = '1'
|
||||
labels = one_hot
|
||||
|
||||
output_file.write("|labels " + " ".join(labels))
|
||||
output_file.write("\t")
|
||||
|
||||
elif len(values) < args.features_start+args.features_dim:
|
||||
raise RuntimeError(
|
||||
("Too few input columns ({} out of expected {}) ")
|
||||
.format(len(values), args.features_start+args.features_dim))
|
||||
|
||||
output_file.write(
|
||||
"|features " +
|
||||
" ".join(values[args.features_start:args.features_start+args.features_dim]))
|
||||
output_file.write("\n")
|
||||
|
||||
input_file.close()
|
||||
output_file.close()
|
Загрузка…
Ссылка в новой задаче