Changeset 18240 for branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression
- Timestamp:
- 03/23/22 13:10:34 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/TensorFlowConstantOptimizationEvaluator.cs
r18239 r18240 25 25 26 26 using System; 27 using System.Collections; 27 28 using System.Collections.Generic; 28 29 #if LOG_CONSOLE … … 55 56 56 57 //private static readonly TF_DataType DataType = tf.float64; 57 private static readonly TF_DataType DataType = tf.float32;58 //private static readonly TF_DataType DataType = tf.float32; 58 59 59 60 #region Parameter Properties … … 108 109 const bool eager = true; 109 110 110 bool prepared = TreeToTensorConverter.TryPrepareTree( 111 #if LOG_FILE 112 var directoryName = $"C:\\temp\\TFboard\\logdir\\TF_{DateTime.Now.ToString("yyyyMMddHHmmss")}_{maxIterations}_{learningRate.ToString(CultureInfo.InvariantCulture)}"; 113 Directory.CreateDirectory(directoryName); 114 using var predictionTargetLossWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "PredictionTargetLos.csv"))); 115 using var weightsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "Weights.csv"))); 116 using var treeGradsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "TreeGrads.csv"))); 117 using var lossGradsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "LossGrads.csv"))); 118 119 predictionTargetLossWriter.WriteLine(string.Join(";", "Prediction", "Target", "Loss")); 120 weightsWriter.WriteLine(string.Join(";", Enumerable.Range(0, 4).Select(i => $"w_{i}"))); 121 treeGradsWriter.WriteLine(string.Join(";", Enumerable.Range(0, 4).Select(i => $"Tg_{i}"))); 122 lossGradsWriter.WriteLine(string.Join(";", Enumerable.Range(0, 4).Select(i => $"Lg_{i}"))); 123 #endif 124 125 //foreach (var row in rows) { 126 127 bool prepared = TreeToTensorConverter.TryPrepareTree( 111 128 tree, 112 129 problemData, rows.ToList(), 130 //problemData, new List<int>(){ row }, 113 131 updateVariableWeights, applyLinearScaling, 114 132 eager, … … 119 137 120 138 var optimizer = keras.optimizers.Adam((float)learningRate); 121 139 122 140 for (int i = 0; i < maxIterations; i++) { 123 141 if (cancellationToken.IsCancellationRequested) break; 124 142 125 using var tape = tf.GradientTape(); 143 #if LOG_FILE || LOG_CONSOLE 144 using var tape = tf.GradientTape(persistent: true); 145 #else 146 using var tape = tf.GradientTape(persistent: false); 147 #endif 126 148 127 149 bool success = TreeToTensorConverter.TryEvaluate( 128 tree, 150 tree, 129 151 inputFeatures, variables, 130 152 updateVariableWeights, applyLinearScaling, … … 137 159 138 160 progress?.Report(loss.ToArray<float>()[0]); 139 161 140 162 var variablesList = variables.Values.SelectMany(x => x).ToList(); 141 163 var gradients = tape.gradient(loss, variablesList); 142 164 165 #if LOG_FILE 166 predictionTargetLossWriter.WriteLine(string.Join(";", new[] { prediction.ToArray<float>()[0], target.ToArray<float>()[0], loss.ToArray<float>()[0] })); 167 weightsWriter.WriteLine(string.Join(";", variablesList.Select(v => v.numpy().ToArray<float>()[0]))); 168 treeGradsWriter.WriteLine(string.Join(";", tape.gradient(prediction, variablesList).Select(t => t.ToArray<float>()[0]))); 169 lossGradsWriter.WriteLine(string.Join(";", tape.gradient(loss, variablesList).Select(t => t.ToArray<float>()[0]))); 170 #endif 171 172 173 //break; 174 143 175 optimizer.apply_gradients(zip(gradients, variablesList)); 144 176 } 145 177 //} 178 146 179 var cloner = new Cloner(); 147 180 var newTree = cloner.Clone(tree); … … 153 186 154 187 188 189 190 //var numRows = rows.Count(); 191 192 //var variablesFeed = new Hashtable(); 193 //foreach (var kvp in inputFeatures) { 194 // var variableName = kvp.Key; 195 // var variablePlaceholder = kvp.Value; 196 // if (problemData.Dataset.VariableHasType<double>(variableName)) { 197 // var data = problemData.Dataset.GetDoubleValues(variableName, rows).Select(x => (float)x).ToArray(); 198 // variablesFeed.Add(variablePlaceholder, np.array(data).reshape(new Shape(numRows, 1))); 199 // } else if (problemData.Dataset.VariableHasType<DoubleVector>(variableName)) { 200 // var data = problemData.Dataset.GetDoubleVectorValues(variableName, rows).SelectMany(x => x.Select(y => (float)y)).ToArray(); 201 // variablesFeed.Add(variablePlaceholder, np.array(data).reshape(new Shape(numRows, -1))); 202 // } else 203 // throw new NotSupportedException($"Type of the variable is not supported: {variableName}"); 204 //} 205 //var targetData = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows).Select(x => (float)x).ToArray(); 206 //variablesFeed.Add(target, np.array(targetData)); 207 208 //using var session = tf.Session(); 209 210 //var loss2 = tf.constant(1.23f, TF_DataType.TF_FLOAT); 211 212 //var graphOptimizer = tf.train.AdamOptimizer((float)learningRate); 213 //var minimizationOperations = graphOptimizer.minimize(loss2); 214 215 //var init = tf.global_variables_initializer(); 216 //session.run(init); 217 218 //session.run((minimizationOperations, loss2), variablesFeed); 219 220 221 222 155 223 return newTree; 156 224 157 158 159 160 161 // //int numRows = rows.Count(); 162 163 164 165 166 167 168 // var variableLengths = problemData.AllowedInputVariables.ToDictionary( 169 // var => var, 170 // var => { 171 // if (problemData.Dataset.VariableHasType<double>(var)) return 1; 172 // if (problemData.Dataset.VariableHasType<DoubleVector>(var)) return problemData.Dataset.GetDoubleVectorValue(var, 0).Count; 173 // throw new NotSupportedException($"Type of variable {var} is not supported."); 174 // }); 175 176 // var variablesDict = problemData.AllowedInputVariables.ToDictionary( 177 // var => var, 178 // var => { 179 // if (problemData.Dataset.VariableHasType<double>(var)) { 180 // var data = problemData.Dataset.GetDoubleValues(var, rows).Select(x => (float)x).ToArray(); 181 // return tf.convert_to_tensor(np.array(data).reshape(new Shape(numRows, 1)), DataType); 182 // } else if (problemData.Dataset.VariableHasType<DoubleVector>(var)) { 183 // var data = problemData.Dataset.GetDoubleVectorValues(var, rows).SelectMany(x => x.Select(y => (float)y)).ToArray(); 184 // return tf.convert_to_tensor(np.array(data).reshape(new Shape(numRows, -1)), DataType); 185 // } else throw new NotSupportedException($"Type of the variable is not supported: {var}"); 186 // } 187 // ); 188 189 // using var tape = tf.GradientTape(persistent: true); 190 191 // bool success = TreeToTensorConverter.TryEvaluateEager(tree, 192 // numRows, variablesDict, 193 // updateVariableWeights, applyLinearScaling, 194 // out Tensor prediction, 195 // out Dictionary<Tensor, string> parameters, out List<ResourceVariable> variables); 196 197 // //bool success = TreeToTensorConverter.TryConvert(tree, 198 // // numRows, variableLengths, 199 // // updateVariableWeights, applyLinearScaling, 200 // // out Tensor prediction, 201 // // out Dictionary<Tensor, string> parameters, out List<Tensor> variables); 202 203 // if (!success) 204 // return (ISymbolicExpressionTree)tree.Clone(); 205 206 // //var target = tf.placeholder(DataType, new Shape(numRows), name: problemData.TargetVariable); 207 // var targetData = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows).Select(x => (float)x).ToArray(); 208 // var target = tf.convert_to_tensor(np.array(targetData).reshape(new Shape(numRows)), DataType); 209 // // MSE 210 // var cost = tf.reduce_sum(tf.square(prediction - target)); 211 212 // tape.watch(cost); 213 214 // //var optimizer = tf.train.AdamOptimizer((float)learningRate); 215 // //var optimizer = tf.train.AdamOptimizer(tf.constant(learningRate, DataType)); 216 // //var optimizer = tf.train.GradientDescentOptimizer((float)learningRate); 217 // //var optimizer = tf.train.GradientDescentOptimizer(tf.constant(learningRate, DataType)); 218 // //var optimizer = tf.train.GradientDescentOptimizer((float)learningRate); 219 // //var optimizer = tf.train.AdamOptimizer((float)learningRate); 220 // //var optimizationOperation = optimizer.minimize(cost); 221 // var optimizer = keras.optimizers.Adam((float)learningRate); 222 223 // #if EXPORT_GRAPH 225 226 //#if EXPORT_GRAPH 224 227 // //https://github.com/SciSharp/TensorFlow.NET/wiki/Debugging 225 228 // tf.train.export_meta_graph(@"C:\temp\TFboard\graph.meta", as_text: false, 226 229 // clear_devices: true, clear_extraneous_savers: false, strip_default_attrs: true); 227 230 //#endif 231 232 228 233 229 234 // //// features as feed items … … 244 249 // //variablesFeed.Add(target, np.array(targetData)); 245 250 246 247 // List<NDArray> constants;248 // //using (var session = tf.Session()) {249 250 //#if LOG_FILE251 // var directoryName = $"C:\\temp\\TFboard\\logdir\\manual_{DateTime.Now.ToString("yyyyMMddHHmmss")}_{maxIterations}_{learningRate.ToString(CultureInfo.InvariantCulture)}";252 // Directory.CreateDirectory(directoryName);253 // var costsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "Costs.csv")));254 // var weightsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "Weights.csv")));255 // var gradientsWriter = new StreamWriter(File.Create(Path.Combine(directoryName, "Gradients.csv")));256 //#endif257 258 // //session.run(tf.global_variables_initializer());259 260 //#if LOG_CONSOLE || LOG_FILE261 // var gradients = optimizer.compute_gradients(cost);262 //#endif263 264 // //var vars = variables.Select(v => session.run(v, variablesFeed)[0].ToArray<float>()[0]).ToList();265 // //var gradient = optimizer.compute_gradients(cost)266 // // .Where(g => g.Item1 != null)267 // // //.Select(g => session.run(g.Item1, variablesFeed)[0].GetValue<float>(0)).268 // // .Select(g => session.run(g.Item1, variablesFeed)[0].ToArray<float>()[0])269 // // .ToList();270 271 // //var gradientPrediction = optimizer.compute_gradients(prediction)272 // // .Where(g => g.Item1 != null)273 // // .Select(g => session.run(g.Item1, variablesFeed)[0].ToArray<float>()[0])274 // // .ToList();275 276 277 // //progress?.Report(session.run(cost, variablesFeed)[0].ToArray<float>()[0]);278 // progress?.Report(cost.ToArray<float>()[0]);279 280 281 282 283 284 //#if LOG_CONSOLE285 // Trace.WriteLine("Costs:");286 // Trace.WriteLine($"MSE: {session.run(cost, variablesFeed)[0].ToString(true)}");287 288 // Trace.WriteLine("Weights:");289 // foreach (var v in variables) {290 // Trace.WriteLine($"{v.name}: {session.run(v).ToString(true)}");291 // }292 293 // Trace.WriteLine("Gradients:");294 // foreach (var t in gradients) {295 // Trace.WriteLine($"{t.Item2.name}: {session.run(t.Item1, variablesFeed)[0].ToString(true)}");296 // }297 //#endif298 299 //#if LOG_FILE300 // costsWriter.WriteLine("MSE");301 // costsWriter.WriteLine(session.run(cost, variablesFeed)[0].ToArray<float>()[0].ToString(CultureInfo.InvariantCulture));302 303 // weightsWriter.WriteLine(string.Join(";", variables.Select(v => v.name)));304 // weightsWriter.WriteLine(string.Join(";", variables.Select(v => session.run(v).ToArray<float>()[0].ToString(CultureInfo.InvariantCulture))));305 306 // gradientsWriter.WriteLine(string.Join(";", gradients.Select(t => t.Item2.Name)));307 // gradientsWriter.WriteLine(string.Join(";", gradients.Select(t => session.run(t.Item1, variablesFeed)[0].ToArray<float>()[0].ToString(CultureInfo.InvariantCulture))));308 //#endif309 310 // for (int i = 0; i < maxIterations; i++) {311 // if (cancellationToken.IsCancellationRequested)312 // break;313 314 315 // var gradients = tape.gradient(cost, variables);316 // //optimizer.apply_gradients(gradients.Zip(variables, Tuple.Create<Tensor, IVariableV1>).ToArray());317 // optimizer.apply_gradients(zip(gradients, variables));318 319 320 // //session.run(optimizationOperation, variablesFeed);321 322 // progress?.Report(cost.ToArray<float>()[0]);323 // //progress?.Report(session.run(cost, variablesFeed)[0].ToArray<float>()[0]);324 325 //#if LOG_CONSOLE326 // Trace.WriteLine("Costs:");327 // Trace.WriteLine($"MSE: {session.run(cost, variablesFeed)[0].ToString(true)}");328 329 // Trace.WriteLine("Weights:");330 // foreach (var v in variables) {331 // Trace.WriteLine($"{v.name}: {session.run(v).ToString(true)}");332 // }333 334 // Trace.WriteLine("Gradients:");335 // foreach (var t in gradients) {336 // Trace.WriteLine($"{t.Item2.name}: {session.run(t.Item1, variablesFeed)[0].ToString(true)}");337 // }338 //#endif339 340 //#if LOG_FILE341 // costsWriter.WriteLine(session.run(cost, variablesFeed)[0].ToArray<float>()[0].ToString(CultureInfo.InvariantCulture));342 // weightsWriter.WriteLine(string.Join(";", variables.Select(v => session.run(v).ToArray<float>()[0].ToString(CultureInfo.InvariantCulture))));343 // gradientsWriter.WriteLine(string.Join(";", gradients.Select(t => session.run(t.Item1, variablesFeed)[0].ToArray<float>()[0].ToString(CultureInfo.InvariantCulture))));344 //#endif345 // }346 347 //#if LOG_FILE348 // costsWriter.Close();349 // weightsWriter.Close();350 // gradientsWriter.Close();351 //#endif352 // //constants = variables.Select(v => session.run(v)).ToList();353 // constants = variables.Select(v => v.numpy()).ToList();354 // //}355 356 // if (applyLinearScaling)357 // constants = constants.Skip(2).ToList();358 // var newTree = (ISymbolicExpressionTree)tree.Clone();359 // UpdateConstants(newTree, constants, updateVariableWeights);360 361 // return newTree;362 251 } 363 252 … … 384 273 } 385 274 386 //private static void UpdateConstants(ISymbolicExpressionTree tree, IList<NDArray> constants, bool updateVariableWeights) {387 // int i = 0;388 // foreach (var node in tree.Root.IterateNodesPrefix().OfType<SymbolicExpressionTreeTerminalNode>()) {389 // if (node is ConstantTreeNode constantTreeNode) {390 // constantTreeNode.Value = constants[i++].ToArray<float>()[0];391 // } else if (node is VariableTreeNodeBase variableTreeNodeBase && updateVariableWeights) {392 // variableTreeNodeBase.Weight = constants[i++].ToArray<float>()[0];393 // } else if (node is FactorVariableTreeNode factorVarTreeNode && updateVariableWeights) {394 // for (int j = 0; j < factorVarTreeNode.Weights.Length; j++)395 // factorVarTreeNode.Weights[j] = constants[i++].ToArray<float>()[0];396 // }397 // }398 //}399 400 275 public static bool CanOptimizeConstants(ISymbolicExpressionTree tree) { 401 276 return TreeToTensorConverter.IsCompatible(tree);
Note: See TracChangeset
for help on using the changeset viewer.