// Create transformers based on the configuration, i.e. // deserializers = [ // [ // type = "ImageDataDeserializer" // module = "ImageReader" // input = [ // features = [ //----> transforms = [ // [type = "Crop"]:[type = "Scale"]... void CompositeDataReader::CreateTransforms(const ConfigParameters& deserializerConfig) { std::string defaultModule = deserializerConfig("module"); if (!deserializerConfig.Exists("input")) return; const ConfigParameters& inputs = deserializerConfig("input"); for (const pair<string, ConfigParameters>& section : inputs) { ConfigParameters inputBody = section.second; // Trying to find transforms in the input section of the config. if (inputBody.find("transforms") == inputBody.end()) continue; std::wstring inputName = Microsoft::MSR::CNTK::ToFixedWStringFromMultiByte(section.first); // Read transformers in order and appending them to the transformer pipeline. argvector<ConfigParameters> transforms = inputBody("transforms"); for (size_t j = 0; j < transforms.size(); ++j) { ConfigParameters p = transforms[j]; p.Insert("precision", deserializerConfig("precision")); TransformerPtr transformer = CreateTransformer(p, defaultModule, std::wstring()); m_transforms.push_back(Transformation{ transformer, inputName }); } // Let's add a cast transformer by default. It is noop if the type provided by others is float // or double, but will do a proper cast if the type is uchar. auto cast = CreateTransformer(inputBody, defaultModule, std::wstring(L"Cast")); m_transforms.push_back(Transformation{ cast, inputName }); } }
void TestConfiguration(const ConfigParameters& configBase) { ConfigParameters configMacros = configBase("macroExample"); for (auto iterMacro = configMacros.begin(); iterMacro != configMacros.end(); iterMacro++) { std::map<std::string, ConfigValue> paramsMap; ConfigParameters configCN = iterMacro->second; if (configCN.Exists("parameters")) { ConfigArray params = configCN("parameters"); for (int i = 0; i < params.size(); ++i) paramsMap[params[i]] = ConfigValue("uninitialized"); } ConfigParameters configNodes = configCN("NodeList"); for (auto iter = configNodes.begin(); iter != configNodes.end(); iter++) { std::wstring nodeName; nodeName = msra::strfun::utf16(iter->first); ConfigArray configNode = iter->second; std::string opName = configNode[0]; if (IsParameter(paramsMap, opName)) { ; } if (opName == "InputValue" && configNode.size() >= 2) { size_t rows = 0; if (!IsParameter(paramsMap, configNode[1])) rows = configNode[1]; } else if (opName == "LearnableParameter" && configNode.size() >= 3) { size_t rows = 0; if (!IsParameter(paramsMap, configNode[1])) rows = configNode[1]; size_t cols = 0; if (!IsParameter(paramsMap, configNode[2])) cols = configNode[2]; bool learningRateMultiplier = 0; bool init = false; ConfigArray initData; // look for optional parameters for (int i = 3; i < configNode.size(); ++i) { bool needsGradient = false; ConfigParameters configParam = configNode[i]; if (configParam.Exists("learningRateMultiplier")) // TODO: should this be a test for 'true' rather than Exists()? needsGradient = (float)configParam("learningRateMultiplier") > 0? true : false; else if (configParam.Exists("init")) { init = true; initData = configParam["init"]; } } // if initializing, do so now if (init) { bool uniform = true; ElemType initValueScale = 1; size_t inputSize = cols; if (initData.size() > 0) initValueScale = initData[0]; if (initData.size() > 1) uniform = EqualCI(initData[1], "uniform"); } } } // now link up all the nodes configNodes = configCN("Relation"); for (auto iter = configNodes.begin(); iter != configNodes.end(); iter++) { std::wstring nodeName = msra::strfun::utf16(iter->first); ConfigArray configNode = iter->second; int numChildren = (int) configNode.size(); for (int i = 0; i < numChildren; ++i) { std::wstring nodeName = configNode[i]; } } ConfigParameters configRoots = configCN("RootNodes"); ConfigArray configNode = configRoots("FeatureNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } if (configRoots.Exists("LabelNodes")) { configNode = configRoots("LabelNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } } if (configRoots.Exists("CriterionNodes")) { configNode = configRoots("CriterionNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } } if (configRoots.Exists("CriteriaNodes")) // legacy { configNode = configRoots("CriteriaNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } } if (configRoots.Exists("NodesReqMultiSeqHandling")) { configNode = configRoots("NodesReqMultiSeqHandling"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } fprintf(stderr, "WARNING: 'NodesReqMultiSeqHandling' flag is defunct\n"); } if (configRoots.Exists("EvalNodes")) { configNode = configRoots("EvalNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } } if (configRoots.Exists("OutputNodes")) { configNode = configRoots("OutputNodes"); for (size_t i = 0; i < configNode.size(); i++) { std::wstring nodeName = configNode[i]; } } } }