@@ -937,4 +937,78 @@ const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type) {
937937 }
938938}
939939
940+ // Return true iff the solver contains any old solver_type specified as enums
941+ bool SolverNeedsTypeUpgrade (const SolverParameter& solver_param) {
942+ if (solver_param.has_solver_type ()) {
943+ return true ;
944+ }
945+ return false ;
946+ }
947+
948+ bool UpgradeSolverType (SolverParameter* solver_param) {
949+ CHECK (!solver_param->has_solver_type () || !solver_param->has_type ())
950+ << " Failed to upgrade solver: old solver_type field (enum) and new type "
951+ << " field (string) cannot be both specified in solver proto text." ;
952+ if (solver_param->has_solver_type ()) {
953+ string type;
954+ switch (solver_param->solver_type ()) {
955+ case SolverParameter_SolverType_SGD:
956+ type = " SGD" ;
957+ break ;
958+ case SolverParameter_SolverType_NESTEROV:
959+ type = " Nesterov" ;
960+ break ;
961+ case SolverParameter_SolverType_ADAGRAD:
962+ type = " AdaGrad" ;
963+ break ;
964+ case SolverParameter_SolverType_RMSPROP:
965+ type = " RMSProp" ;
966+ break ;
967+ case SolverParameter_SolverType_ADADELTA:
968+ type = " AdaDelta" ;
969+ break ;
970+ case SolverParameter_SolverType_ADAM:
971+ type = " Adam" ;
972+ break ;
973+ default :
974+ LOG (FATAL ) << " Unknown SolverParameter solver_type: " << type;
975+ }
976+ solver_param->set_type (type);
977+ solver_param->clear_solver_type ();
978+ } else {
979+ LOG (ERROR ) << " Warning: solver type already up to date. " ;
980+ return false ;
981+ }
982+ return true ;
983+ }
984+
985+ // Check for deprecations and upgrade the SolverParameter as needed.
986+ bool UpgradeSolverAsNeeded (const string& param_file, SolverParameter* param) {
987+ bool success = true ;
988+ // Try to upgrade old style solver_type enum fields into new string type
989+ if (SolverNeedsTypeUpgrade (*param)) {
990+ LOG (INFO ) << " Attempting to upgrade input file specified using deprecated "
991+ << " 'solver_type' field (enum)': " << param_file;
992+ if (!UpgradeSolverType (param)) {
993+ success = false ;
994+ LOG (ERROR ) << " Warning: had one or more problems upgrading "
995+ << " SolverType (see above)." ;
996+ } else {
997+ LOG (INFO ) << " Successfully upgraded file specified using deprecated "
998+ << " 'solver_type' field (enum) to 'type' field (string)." ;
999+ LOG (WARNING ) << " Note that future Caffe releases will only support "
1000+ << " 'type' field (string) for a solver's type." ;
1001+ }
1002+ }
1003+ return success;
1004+ }
1005+
1006+ // Read parameters from a file into a SolverParameter proto message.
1007+ void ReadSolverParamsFromTextFileOrDie (const string& param_file,
1008+ SolverParameter* param) {
1009+ CHECK (ReadProtoFromTextFile (param_file, param))
1010+ << " Failed to parse SolverParameter file: " << param_file;
1011+ UpgradeSolverAsNeeded (param_file, param);
1012+ }
1013+
9401014} // namespace caffe
0 commit comments