diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-08-30 16:46:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-30 16:46:29 +0200 |
commit | d073e0575c1c4a516615219c5e8732b886eb8d85 (patch) | |
tree | e12cc864b1f22f05ef7810cd97005c7c006a2829 | |
parent | cef4c0f9d7c084f320e77abb2a93522acd7f3f53 (diff) |
Revert "Bratseth/generate rank profiles for all models part 10 2"
17 files changed, 283 insertions, 8442 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/ApplicationPackage.java b/config-model-api/src/main/java/com/yahoo/config/application/api/ApplicationPackage.java index c7258d8aede..f926259f115 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/ApplicationPackage.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/ApplicationPackage.java @@ -159,10 +159,12 @@ public interface ApplicationPackage { } /** - * Returns inforamtion about a file + * Gets a file from the root of the application package + * * * @param relativePath the relative path of the file within this application package. - * @return information abut the file, returned whether or not the file exists + * @return information abut the file + * @throws IllegalArgumentException if the given path does not exist */ ApplicationFile getFile(Path relativePath); diff --git a/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java b/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java index 757dab4cbf3..7404ae14a5d 100644 --- a/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java +++ b/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java @@ -16,17 +16,11 @@ import com.yahoo.searchdefinition.parser.ParseException; import com.yahoo.vespa.config.ConfigDefinitionKey; import com.yahoo.config.application.api.ApplicationPackage; -import java.io.BufferedInputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; import java.io.Reader; import java.io.StringReader; -import java.io.UncheckedIOException; import java.util.*; -import java.util.stream.Collectors; /** * For testing purposes only @@ -119,7 +113,7 @@ public class MockApplicationPackage implements ApplicationPackage { @Override public ApplicationFile getFile(Path file) { - return new MockApplicationFile(file, Path.fromString(root.toString())); + throw new UnsupportedOperationException(); } @Override @@ -306,122 +300,4 @@ public class MockApplicationPackage implements ApplicationPackage { return xmlStringWithIdAttribute.substring(idStart + 4, idEnd - 1); } - public static class MockApplicationFile extends ApplicationFile { - - /** The path to the application package root */ - private final Path root; - - /** The File pointing to the actual file represented by this */ - private final File file; - - public MockApplicationFile(Path filePath, Path applicationPackagePath) { - super(filePath); - this.root = applicationPackagePath; - file = applicationPackagePath.append(filePath).toFile(); - } - - @Override - public boolean isDirectory() { - return file.isDirectory(); - } - - @Override - public boolean exists() { - return file.exists(); - } - - @Override - public Reader createReader() throws FileNotFoundException { - try { - if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist"); - return IOUtils.createReader(file, "UTF-8"); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - @Override - public InputStream createInputStream() throws FileNotFoundException { - try { - if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist"); - return new BufferedInputStream(new FileInputStream(file)); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - @Override - public ApplicationFile createDirectory() { - file.mkdirs(); - return this; - } - - @Override - public ApplicationFile writeFile(Reader input) { - try { - IOUtils.writeFile(file, IOUtils.readAll(input), false); - return this; - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - @Override - public ApplicationFile appendFile(String value) { - try { - IOUtils.writeFile(file, value, true); - return this; - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - @Override - public List<ApplicationFile> listFiles(PathFilter filter) { - if ( ! isDirectory()) return Collections.emptyList(); - return Arrays.stream(file.listFiles()).filter(f -> filter.accept(Path.fromString(f.toString()))) - .map(f -> new MockApplicationFile(asApplicationRelativePath(f), root)) - .collect(Collectors.toList()); - } - - @Override - public ApplicationFile delete() { - file.delete(); - return this; - } - - @Override - public MetaData getMetaData() { - throw new UnsupportedOperationException(); - } - - @Override - public int compareTo(ApplicationFile other) { - return this.getPath().getName().compareTo((other).getPath().getName()); - } - - /** Strips the application package root path prefix from the path of the given file */ - private Path asApplicationRelativePath(File file) { - Path path = Path.fromString(file.toString()); - - Iterator<String> pathIterator = path.iterator(); - // Skip the path elements this shares with the root - for (Iterator<String> rootIterator = root.iterator(); rootIterator.hasNext(); ) { - String rootElement = rootIterator.next(); - String pathElement = pathIterator.next(); - if ( ! rootElement.equals(pathElement)) throw new RuntimeException("Assumption broken"); - } - // Build a path from the remaining - Path relative = Path.fromString(""); - while (pathIterator.hasNext()) - relative = relative.append(pathIterator.next()); - return relative; - } - - } - } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/ConvertedModel.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/ConvertedModel.java index f7a06f86ab7..0911f567fa1 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/ConvertedModel.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/ConvertedModel.java @@ -1,6 +1,5 @@ package com.yahoo.searchdefinition.expressiontransforms; -import com.google.common.collect.ImmutableMap; import com.yahoo.collections.Pair; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationPackage; @@ -17,6 +16,7 @@ import com.yahoo.searchlib.rankingexpression.evaluation.DoubleValue; import com.yahoo.searchlib.rankingexpression.evaluation.TensorValue; import com.yahoo.searchlib.rankingexpression.evaluation.Value; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModel; +import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; import com.yahoo.searchlib.rankingexpression.parser.ParseException; import com.yahoo.searchlib.rankingexpression.rule.Arguments; import com.yahoo.searchlib.rankingexpression.rule.CompositeNode; @@ -38,6 +38,7 @@ import com.yahoo.tensor.serialization.TypedBinaryFormat; import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.Reader; import java.io.StringReader; @@ -64,91 +65,49 @@ import java.util.stream.Collectors; public class ConvertedModel { private final String modelName; - private final String modelDescription; - private final ImmutableMap<String, RankingExpression> expressions; - - /** The source importedModel, or empty if this was created from a stored converted model */ - private final Optional<ImportedModel> sourceModel; - - private ConvertedModel(String modelName, - String modelDescription, - Map<String, RankingExpression> expressions, - Optional<ImportedModel> sourceModel) { - this.modelName = modelName; - this.modelDescription = modelDescription; - this.expressions = ImmutableMap.copyOf(expressions); - this.sourceModel = sourceModel; - } + private final Path modelPath; /** - * Create and store a converted model for a rank profile given from either an imported model, - * or (if unavailable) from stored application package data. + * The ranking expressions of this, indexed by their name. which is a 1-3 part string separated by dots + * where the first part is always the model name, the second the signature or (if none) + * expression name (if more than one), and the third is the output name (if any). */ - public static ConvertedModel fromSourceOrStore(Path modelPath, RankProfileTransformContext context) { - File sourceModel = sourceModelFile(context.rankProfile().applicationPackage(), modelPath); - if (sourceModel.exists()) - return fromSource(toModelName(modelPath), - modelPath.toString(), - context.rankProfile(), - context.queryProfiles(), - context.importedModels().get(sourceModel)); // TODO: Convert to name here, make sure its done just one way - else - return fromStore(toModelName(modelPath), - modelPath.toString(), - context.rankProfile()); - } - - public static ConvertedModel fromSource(String modelName, - String modelDescription, - RankProfile rankProfile, - QueryProfileRegistry queryProfileRegistry, - ImportedModel importedModel) { - ModelStore modelStore = new ModelStore(rankProfile.applicationPackage(), modelName); - return new ConvertedModel(modelName, - modelDescription, - convertAndStore(importedModel, rankProfile, queryProfileRegistry, modelStore), - Optional.of(importedModel)); - } - - public static ConvertedModel fromStore(String modelName, - String modelDescription, - RankProfile rankProfile) { - ModelStore modelStore = new ModelStore(rankProfile.applicationPackage(), modelName); - return new ConvertedModel(modelName, - modelDescription, - convertStored(modelStore, rankProfile), - Optional.empty()); - } + private final Map<String, RankingExpression> expressions; /** - * Returns all the output expressions of this indexed by name. The names consist of one or two parts - * separated by dot, where the first part is the signature name - * if signatures are used, or the expression name if signatures are not used and there are multiple - * expressions, and the second is the output name if signature names are used. + * Create a converted model for a rank profile given from either an imported model, + * or (if unavailable) from stored application package data. */ - public Map<String, RankingExpression> expressions() { return expressions; } + public ConvertedModel(Path modelPath, RankProfileTransformContext context) { + this.modelPath = modelPath; + this.modelName = toModelName(modelPath); + ModelStore store = new ModelStore(context.rankProfile().applicationPackage(), modelPath); + if ( store.hasSourceModel()) + expressions = convertModel(store, context.rankProfile(), context.queryProfiles(), context.importedModels()); + else + expressions = transformFromStoredModel(store, context.rankProfile()); + } - /** - * Returns the expression matching the given arguments. - */ - public ExpressionNode expression(FeatureArguments arguments, RankProfileTransformContext context) { - RankingExpression expression = selectExpression(arguments); - if (sourceModel.isPresent()) // we can verify - verifyRequiredMacros(expression, sourceModel.get(), context.rankProfile(), context.queryProfiles()); - return expression.getRoot(); + private Map<String, RankingExpression> convertModel(ModelStore store, + RankProfile profile, + QueryProfileRegistry queryProfiles, + ImportedModels importedModels) { + ImportedModel model = importedModels.get(store.sourceModelFile()); + return transformFromImportedModel(model, store, profile, queryProfiles); } - private RankingExpression selectExpression(FeatureArguments arguments) { + /** Returns the expression matching the given arguments */ + public ExpressionNode expression(FeatureArguments arguments) { if (expressions.isEmpty()) throw new IllegalArgumentException("No expressions available in " + this); RankingExpression expression = expressions.get(arguments.toName()); - if (expression != null) return expression; + if (expression != null) return expression.getRoot(); if ( ! arguments.signature().isPresent()) { if (expressions.size() > 1) throw new IllegalArgumentException("Multiple candidate expressions " + missingExpressionMessageSuffix()); - return expressions.values().iterator().next(); + return expressions.values().iterator().next().getRoot(); } if ( ! arguments.output().isPresent()) { @@ -160,23 +119,21 @@ public class ConvertedModel { if (entriesWithTheRightPrefix.size() > 1) throw new IllegalArgumentException("Multiple candidate expression named '" + arguments.signature().get() + missingExpressionMessageSuffix()); - return entriesWithTheRightPrefix.get(0).getValue(); + return entriesWithTheRightPrefix.get(0).getValue().getRoot(); } throw new IllegalArgumentException("No expression '" + arguments.toName() + missingExpressionMessageSuffix()); } private String missingExpressionMessageSuffix() { - return "' in model '" + modelDescription + "'. " + + return "' in model '" + this.modelPath + "'. " + "Available expressions: " + expressions.keySet().stream().collect(Collectors.joining(", ")); } - // ----------------------- Static model conversion/storage below here - - private static Map<String, RankingExpression> convertAndStore(ImportedModel model, - RankProfile profile, - QueryProfileRegistry queryProfiles, - ModelStore store) { + private Map<String, RankingExpression> transformFromImportedModel(ImportedModel model, + ModelStore store, + RankProfile profile, + QueryProfileRegistry queryProfiles) { // Add constants Set<String> constantsReplacedByMacros = new HashSet<>(); model.smallConstants().forEach((k, v) -> transformSmallConstant(store, profile, k, v)); @@ -204,21 +161,22 @@ public class ConvertedModel { return expressions; } - private static void addExpression(RankingExpression expression, - String expressionName, - Set<String> constantsReplacedByMacros, - ImportedModel model, - ModelStore store, - RankProfile profile, - QueryProfileRegistry queryProfiles, - Map<String, RankingExpression> expressions) { + private void addExpression(RankingExpression expression, + String expressionName, + Set<String> constantsReplacedByMacros, + ImportedModel model, + ModelStore store, + RankProfile profile, + QueryProfileRegistry queryProfiles, + Map<String, RankingExpression> expressions) { expression = replaceConstantsByMacros(expression, constantsReplacedByMacros); + verifyRequiredMacros(expression, model, profile, queryProfiles); reduceBatchDimensions(expression, model, profile, queryProfiles); store.writeExpression(expressionName, expression); expressions.put(expressionName, expression); } - private static Map<String, RankingExpression> convertStored(ModelStore store, RankProfile profile) { + private Map<String, RankingExpression> transformFromStoredModel(ModelStore store, RankProfile profile) { for (Pair<String, Tensor> constant : store.readSmallConstants()) profile.addConstant(constant.getFirst(), asValue(constant.getSecond())); @@ -234,12 +192,12 @@ public class ConvertedModel { return store.readExpressions(); } - private static void transformSmallConstant(ModelStore store, RankProfile profile, String constantName, Tensor constantValue) { + private void transformSmallConstant(ModelStore store, RankProfile profile, String constantName, Tensor constantValue) { store.writeSmallConstant(constantName, constantValue); profile.addConstant(constantName, asValue(constantValue)); } - private static void transformLargeConstant(ModelStore store, RankProfile profile, QueryProfileRegistry queryProfiles, + private void transformLargeConstant(ModelStore store, RankProfile profile, QueryProfileRegistry queryProfiles, Set<String> constantsReplacedByMacros, String constantName, Tensor constantValue) { RankProfile.Macro macroOverridingConstant = profile.getMacros().get(constantName); @@ -259,7 +217,7 @@ public class ConvertedModel { } } - private static void transformGeneratedMacro(ModelStore store, + private void transformGeneratedMacro(ModelStore store, Set<String> constantsReplacedByMacros, String macroName, RankingExpression expression) { @@ -268,16 +226,15 @@ public class ConvertedModel { store.writeMacro(macroName, expression); } - private static void addGeneratedMacroToProfile(RankProfile profile, String macroName, RankingExpression expression) { + private void addGeneratedMacroToProfile(RankProfile profile, String macroName, RankingExpression expression) { if (profile.getMacros().containsKey(macroName)) { if ( ! profile.getMacros().get(macroName).getRankingExpression().equals(expression)) throw new IllegalArgumentException("Generated macro '" + macroName + "' already exists in " + profile + - " - with a different definition" + - ": Has\n" + profile.getMacros().get(macroName).getRankingExpression() + - "\nwant to add " + expression + "\n"); + " - with a different definition"); return; } - RankProfile.Macro macro = profile.addMacro(macroName, false); // TODO: Inline if only used once + profile.addMacro(macroName, false); // todo: inline if only used once + RankProfile.Macro macro = profile.getMacros().get(macroName); macro.setRankingExpression(expression); macro.setTextualExpression(expression.getRoot().toString()); } @@ -286,8 +243,8 @@ public class ConvertedModel { * Verify that the macros referred in the given expression exists in the given rank profile, * and return tensors of the types specified in requiredMacros. */ - private static void verifyRequiredMacros(RankingExpression expression, ImportedModel model, - RankProfile profile, QueryProfileRegistry queryProfiles) { + private void verifyRequiredMacros(RankingExpression expression, ImportedModel model, + RankProfile profile, QueryProfileRegistry queryProfiles) { Set<String> macroNames = new HashSet<>(); addMacroNamesIn(expression.getRoot(), macroNames, model); for (String macroName : macroNames) { @@ -315,7 +272,7 @@ public class ConvertedModel { } } - private static String typeMismatchExplanation(TensorType requiredType, TensorType actualType) { + private String typeMismatchExplanation(TensorType requiredType, TensorType actualType) { return "The required type of this is " + requiredType + ", but this macro returns " + actualType + (actualType.rank() == 0 ? ". This is often due to missing declaration of query tensor features " + "in query profile types - see the documentation." @@ -325,7 +282,7 @@ public class ConvertedModel { /** * Add the generated macros to the rank profile */ - private static void addGeneratedMacros(ImportedModel model, RankProfile profile) { + private void addGeneratedMacros(ImportedModel model, RankProfile profile) { model.macros().forEach((k, v) -> addGeneratedMacroToProfile(profile, k, v.copy())); } @@ -334,8 +291,8 @@ public class ConvertedModel { * macro specifies that a single exemplar should be evaluated, we can * reduce the batch dimension out. */ - private static void reduceBatchDimensions(RankingExpression expression, ImportedModel model, - RankProfile profile, QueryProfileRegistry queryProfiles) { + private void reduceBatchDimensions(RankingExpression expression, ImportedModel model, + RankProfile profile, QueryProfileRegistry queryProfiles) { TypeContext<Reference> typeContext = profile.typeContext(queryProfiles); TensorType typeBeforeReducing = expression.getRoot().type(typeContext); @@ -362,8 +319,8 @@ public class ConvertedModel { expression.setRoot(root); } - private static ExpressionNode reduceBatchDimensionsAtInput(ExpressionNode node, ImportedModel model, - TypeContext<Reference> typeContext) { + private ExpressionNode reduceBatchDimensionsAtInput(ExpressionNode node, ImportedModel model, + TypeContext<Reference> typeContext) { if (node instanceof TensorFunctionNode) { TensorFunction tensorFunction = ((TensorFunctionNode) node).function(); if (tensorFunction instanceof Rename) { @@ -393,7 +350,7 @@ public class ConvertedModel { return node; } - private static ExpressionNode reduceBatchDimensionExpression(TensorFunction function, TypeContext<Reference> context) { + private ExpressionNode reduceBatchDimensionExpression(TensorFunction function, TypeContext<Reference> context) { TensorFunction result = function; TensorType type = function.type(context); if (type.dimensions().size() > 1) { @@ -415,7 +372,7 @@ public class ConvertedModel { * for any following computation of the tensor. */ // TODO: determine when this is not necessary! - private static ExpressionNode expandBatchDimensionsAtOutput(ExpressionNode node, TensorType before, TensorType after) { + private ExpressionNode expandBatchDimensionsAtOutput(ExpressionNode node, TensorType before, TensorType after) { if (after.equals(before)) { return node; } @@ -442,14 +399,14 @@ public class ConvertedModel { * If a constant c is overridden by a macro, we need to replace instances of "constant(c)" by "c" in expressions. * This method does that for the given expression and returns the result. */ - private static RankingExpression replaceConstantsByMacros(RankingExpression expression, + private RankingExpression replaceConstantsByMacros(RankingExpression expression, Set<String> constantsReplacedByMacros) { if (constantsReplacedByMacros.isEmpty()) return expression; return new RankingExpression(expression.getName(), replaceConstantsByMacros(expression.getRoot(), constantsReplacedByMacros)); } - private static ExpressionNode replaceConstantsByMacros(ExpressionNode node, Set<String> constantsReplacedByMacros) { + private ExpressionNode replaceConstantsByMacros(ExpressionNode node, Set<String> constantsReplacedByMacros) { if (node instanceof ReferenceNode) { Reference reference = ((ReferenceNode)node).reference(); if (FeatureNames.isSimpleFeature(reference) && reference.name().equals("constant")) { @@ -467,7 +424,7 @@ public class ConvertedModel { return node; } - private static void addMacroNamesIn(ExpressionNode node, Set<String> names, ImportedModel model) { + private void addMacroNamesIn(ExpressionNode node, Set<String> names, ImportedModel model) { if (node instanceof ReferenceNode) { ReferenceNode referenceNode = (ReferenceNode)node; if (referenceNode.getOutput() == null) { // macro references cannot specify outputs @@ -483,7 +440,7 @@ public class ConvertedModel { } } - private static Value asValue(Tensor tensor) { + private Value asValue(Tensor tensor) { if (tensor.type().rank() == 0) return new DoubleValue(tensor.asDouble()); // the backend gets offended by dimensionless tensors else @@ -498,13 +455,6 @@ public class ConvertedModel { public String toString() { return "model '" + modelName + "'"; } /** - * Returns the directory which contains the source model to use for these arguments - */ - public static File sourceModelFile(ApplicationPackage application, Path sourceModelPath) { - return application.getFileReference(ApplicationPackage.MODELS_DIR.append(sourceModelPath)); - } - - /** * Provides read/write access to the correct directories of the application package given by the feature arguments */ static class ModelStore { @@ -512,9 +462,20 @@ public class ConvertedModel { private final ApplicationPackage application; private final ModelFiles modelFiles; - ModelStore(ApplicationPackage application, String modelName) { + ModelStore(ApplicationPackage application, Path modelPath) { this.application = application; - this.modelFiles = new ModelFiles(modelName); + this.modelFiles = new ModelFiles(modelPath); + } + + public boolean hasSourceModel() { + return sourceModelFile().exists(); + } + + /** + * Returns the directory which contains the source model to use for these arguments + */ + public File sourceModelFile() { + return application.getFileReference(ApplicationPackage.MODELS_DIR.append(modelFiles.modelPath())); } /** @@ -547,7 +508,7 @@ public class ConvertedModel { return expressions; } - /** Adds this macro expression to the application package so it can be read later. */ + /** Adds this macro expression to the application package to it can be read later. */ void writeMacro(String name, RankingExpression expression) { application.getFile(modelFiles.macrosPath()).appendFile(name + "\t" + expression.getRoot().toString() + "\n"); @@ -557,7 +518,7 @@ public class ConvertedModel { List<Pair<String, RankingExpression>> readMacros() { try { ApplicationFile file = application.getFile(modelFiles.macrosPath()); - if ( ! file.exists()) return Collections.emptyList(); + if (!file.exists()) return Collections.emptyList(); List<Pair<String, RankingExpression>> macros = new ArrayList<>(); BufferedReader reader = new BufferedReader(file.createReader()); @@ -566,7 +527,7 @@ public class ConvertedModel { String[] parts = line.split("\t"); String name = parts[0]; try { - RankingExpression expression = new RankingExpression(parts[0], parts[1]); + RankingExpression expression = new RankingExpression(parts[1]); macros.add(new Pair<>(name, expression)); } catch (ParseException e) { @@ -587,7 +548,7 @@ public class ConvertedModel { List<RankingConstant> readLargeConstants() { try { List<RankingConstant> constants = new ArrayList<>(); - for (ApplicationFile constantFile : application.getFile(modelFiles.largeConstantsInfoPath()).listFiles()) { + for (ApplicationFile constantFile : application.getFile(modelFiles.largeConstantsPath()).listFiles()) { String[] parts = IOUtils.readAll(constantFile.createReader()).split(":"); constants.add(new RankingConstant(parts[0], TensorType.fromSpec(parts[1]), parts[2])); } @@ -605,13 +566,13 @@ public class ConvertedModel { * @return the path to the stored constant, relative to the application package root */ Path writeLargeConstant(String name, Tensor constant) { - Path constantsPath = modelFiles.largeConstantsContentPath(); + Path constantsPath = ApplicationPackage.MODELS_GENERATED_DIR.append(modelFiles.modelPath()).append("constants"); // "tbf" ending for "typed binary format" - recognized by the nodes receiving the file: Path constantPath = constantsPath.append(name + ".tbf"); // Remember the constant in a file we replicate in ZooKeeper - application.getFile(modelFiles.largeConstantsInfoPath().append(name + ".constant")) + application.getFile(modelFiles.largeConstantsPath().append(name + ".constant")) .writeFile(new StringReader(name + ":" + constant.type() + ":" + correct(constantPath))); // Write content explicitly as a file on the file system as this is distributed using file distribution @@ -648,8 +609,8 @@ public class ConvertedModel { public void writeSmallConstant(String name, Tensor constant) { // Secret file format for remembering constants: application.getFile(modelFiles.smallConstantsPath()).appendFile(name + "\t" + - constant.type().toString() + "\t" + - constant.toString() + "\n"); + constant.type().toString() + "\t" + + constant.toString() + "\n"); } /** Workaround for being constructed with the .preprocessed dir as root while later being used outside it */ @@ -671,24 +632,40 @@ public class ConvertedModel { } } + private void close(Reader reader) { + try { + if (reader != null) + reader.close(); + } + catch (IOException e) { + // ignore + } + } + } static class ModelFiles { - String modelName; + Path modelPath; - public ModelFiles(String modelName) { - this.modelName = modelName; + public ModelFiles(Path modelPath) { + this.modelPath = modelPath; } + /** Returns modelPath with slashes replaced by underscores */ + public String modelName() { return modelPath.toString().replace('/', '_').replace('.', '_'); } + + /** Returns relative path to this model below the "models/" dir in the application package */ + public Path modelPath() { return modelPath; } + /** Files stored below this path will be replicated in zookeeper */ public Path storedModelReplicatedPath() { - return ApplicationPackage.MODELS_GENERATED_REPLICATED_DIR.append(modelName); + return ApplicationPackage.MODELS_GENERATED_REPLICATED_DIR.append(modelPath()); } - /** Files stored below this path will not be replicated in zookeeper */ + /** Files stored below this path will not be replicated */ public Path storedModelPath() { - return ApplicationPackage.MODELS_GENERATED_DIR.append(modelName); + return ApplicationPackage.MODELS_GENERATED_DIR.append(modelPath()); } public Path expressionPath(String name) { @@ -704,12 +681,7 @@ public class ConvertedModel { } /** Path to the large (ranking) constants directory */ - public Path largeConstantsContentPath() { - return storedModelPath().append("constants"); - } - - /** Path to the large (ranking) constants directory */ - public Path largeConstantsInfoPath() { + public Path largeConstantsPath() { return storedModelReplicatedPath().append("constants"); } @@ -723,19 +695,27 @@ public class ConvertedModel { /** Encapsulates the arguments of a specific model output */ static class FeatureArguments { + private final String modelName; + private final Path modelPath; + /** Optional arguments */ private final Optional<String> signature, output; public FeatureArguments(Arguments arguments) { - this(optionalArgument(1, arguments), + this(Path.fromString(asString(arguments.expressions().get(0))), + optionalArgument(1, arguments), optionalArgument(2, arguments)); } - public FeatureArguments(Optional<String> signature, Optional<String> output) { + public FeatureArguments(Path modelPath, Optional<String> signature, Optional<String> output) { + this.modelPath = modelPath; + this.modelName = toModelName(modelPath); this.signature = signature; this.output = output; } + public Path modelPath() { return modelPath; } + public Optional<String> signature() { return signature; } public Optional<String> output() { return output; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/OnnxFeatureConverter.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/OnnxFeatureConverter.java index 229ae0ebaaf..36dc200f3c9 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/OnnxFeatureConverter.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/OnnxFeatureConverter.java @@ -13,7 +13,6 @@ import java.io.File; import java.io.UncheckedIOException; import java.util.HashMap; import java.util.Map; -import java.util.Optional; /** * Replaces instances of the onnx(model-path, output) @@ -42,11 +41,10 @@ public class OnnxFeatureConverter extends ExpressionTransformer<RankProfileTrans if ( ! feature.getName().equals("onnx")) return feature; try { - // TODO: Put modelPath in FeatureArguments instead Path modelPath = Path.fromString(ConvertedModel.FeatureArguments.asString(feature.getArguments().expressions().get(0))); ConvertedModel convertedModel = - convertedOnnxModels.computeIfAbsent(modelPath, __ -> ConvertedModel.fromSourceOrStore(modelPath, context)); - return convertedModel.expression(asFeatureArguments(feature.getArguments()), context); + convertedOnnxModels.computeIfAbsent(modelPath, __ -> new ConvertedModel(modelPath, context)); + return convertedModel.expression(asFeatureArguments(feature.getArguments())); } catch (IllegalArgumentException | UncheckedIOException e) { throw new IllegalArgumentException("Could not use Onnx model from " + feature, e); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/TensorFlowFeatureConverter.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/TensorFlowFeatureConverter.java index bcb8ef1521d..619c13da764 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/TensorFlowFeatureConverter.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/TensorFlowFeatureConverter.java @@ -41,8 +41,8 @@ public class TensorFlowFeatureConverter extends ExpressionTransformer<RankProfil try { Path modelPath = Path.fromString(ConvertedModel.FeatureArguments.asString(feature.getArguments().expressions().get(0))); ConvertedModel convertedModel = - convertedTensorFlowModels.computeIfAbsent(modelPath, __ -> ConvertedModel.fromSourceOrStore(modelPath, context)); - return convertedModel.expression(asFeatureArguments(feature.getArguments()), context); + convertedTensorFlowModels.computeIfAbsent(modelPath, __ -> new ConvertedModel(modelPath, context)); + return convertedModel.expression(asFeatureArguments(feature.getArguments())); } catch (IllegalArgumentException | UncheckedIOException e) { throw new IllegalArgumentException("Could not use tensorflow model from " + feature, e); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/XgboostFeatureConverter.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/XgboostFeatureConverter.java index b4a5069b9d6..e6b08ab0350 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/XgboostFeatureConverter.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/XgboostFeatureConverter.java @@ -43,8 +43,8 @@ public class XgboostFeatureConverter extends ExpressionTransformer<RankProfileTr try { Path modelPath = Path.fromString(ConvertedModel.FeatureArguments.asString(feature.getArguments().expressions().get(0))); ConvertedModel convertedModel = - convertedXGBoostModels.computeIfAbsent(modelPath, __ -> ConvertedModel.fromSourceOrStore(modelPath, context)); - return convertedModel.expression(asFeatureArguments(feature.getArguments()), context); + convertedXGBoostModels.computeIfAbsent(modelPath, __ -> new ConvertedModel(modelPath, context)); + return convertedModel.expression(asFeatureArguments(feature.getArguments())); } catch (IllegalArgumentException | UncheckedIOException e) { throw new IllegalArgumentException("Could not use XGBoost model from " + feature, e); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java index 3e9d188670e..73dd60f63eb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java @@ -8,7 +8,6 @@ import com.yahoo.config.ConfigInstance; import com.yahoo.config.ConfigInstance.Builder; import com.yahoo.config.ConfigurationRuntimeException; import com.yahoo.config.FileReference; -import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.ValidationId; @@ -27,13 +26,11 @@ import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.model.producer.UserConfigRepo; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.log.LogLevel; -import com.yahoo.search.query.profile.QueryProfileRegistry; import com.yahoo.searchdefinition.RankProfile; import com.yahoo.searchdefinition.RankProfileRegistry; import com.yahoo.searchdefinition.RankingConstants; import com.yahoo.searchdefinition.derived.AttributeFields; import com.yahoo.searchdefinition.derived.RankProfileList; -import com.yahoo.searchdefinition.expressiontransforms.ConvertedModel; import com.yahoo.searchlib.rankingexpression.RankingExpression; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModel; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; @@ -165,9 +162,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri this.applicationPackage = deployState.getApplicationPackage(); root = builder.getRoot(VespaModel.ROOT_CONFIGID, deployState, this); - createGlobalRankProfiles(deployState.getImportedModels(), - deployState.rankProfileRegistry(), - deployState.getQueryProfiles().getRegistry()); + createGlobalRankProfiles(deployState.getImportedModels(), deployState.rankProfileRegistry()); this.rankProfileList = new RankProfileList(null, // null search -> global AttributeFields.empty, deployState.rankProfileRegistry(), @@ -225,30 +220,14 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri * Creates a rank profile not attached to any search definition, for each imported model in the application package */ private ImmutableList<RankProfile> createGlobalRankProfiles(ImportedModels importedModels, - RankProfileRegistry rankProfileRegistry, - QueryProfileRegistry queryProfiles) { + RankProfileRegistry rankProfileRegistry) { List<RankProfile> profiles = new ArrayList<>(); - if ( ! importedModels.all().isEmpty()) { // models/ directory is available - for (ImportedModel model : importedModels.all()) { - RankProfile profile = new RankProfile(model.name(), this, rankProfileRegistry); - rankProfileRegistry.add(profile); - ConvertedModel convertedModel = ConvertedModel.fromSource(model.name(), model.name(), profile, queryProfiles, model); - for (Map.Entry<String, RankingExpression> entry : convertedModel.expressions().entrySet()) { - profile.addMacro(entry.getKey(), false).setRankingExpression(entry.getValue()); - } - } - } - else { // generated and stored model information may be available instead - ApplicationFile generatedModelsDir = applicationPackage.getFile(ApplicationPackage.MODELS_GENERATED_REPLICATED_DIR); - for (ApplicationFile generatedModelDir : generatedModelsDir.listFiles()) { - String modelName = generatedModelDir.getPath().last(); - RankProfile profile = new RankProfile(modelName, this, rankProfileRegistry); - rankProfileRegistry.add(profile); - ConvertedModel convertedModel = ConvertedModel.fromStore(modelName, modelName, profile); - for (Map.Entry<String, RankingExpression> entry : convertedModel.expressions().entrySet()) { - profile.addMacro(entry.getKey(), false).setRankingExpression(entry.getValue()); - } + for (ImportedModel model : importedModels.all()) { + RankProfile profile = new RankProfile(model.name(), this, rankProfileRegistry); + for (Pair<String, RankingExpression> entry : model.outputExpressions()) { + profile.addMacro(entry.getFirst(), false).setRankingExpression(entry.getSecond()); } + rankProfileRegistry.add(profile); } return ImmutableList.copyOf(profiles); } diff --git a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/saved_model.pbtxt b/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/saved_model.pbtxt deleted file mode 100644 index eb926836576..00000000000 --- a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/saved_model.pbtxt +++ /dev/null @@ -1,7982 +0,0 @@ -saved_model_schema_version: 1 -meta_graphs { - meta_info_def { - stripped_op_list { - op { - name: "Add" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_UINT8 - type: DT_INT8 - type: DT_INT16 - type: DT_INT32 - type: DT_INT64 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_STRING - } - } - } - } - op { - name: "AddN" - input_arg { - name: "inputs" - type_attr: "T" - number_attr: "N" - } - output_arg { - name: "sum" - type_attr: "T" - } - attr { - name: "N" - type: "int" - has_minimum: true - minimum: 1 - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT64 - type: DT_INT32 - type: DT_UINT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT8 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_QINT8 - type: DT_QUINT8 - type: DT_QINT32 - type: DT_HALF - type: DT_VARIANT - } - } - } - is_aggregate: true - is_commutative: true - } - op { - name: "ApplyGradientDescent" - input_arg { - name: "var" - type_attr: "T" - is_ref: true - } - input_arg { - name: "alpha" - type_attr: "T" - } - input_arg { - name: "delta" - type_attr: "T" - } - output_arg { - name: "out" - type_attr: "T" - is_ref: true - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT64 - type: DT_INT32 - type: DT_UINT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT8 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_QINT8 - type: DT_QUINT8 - type: DT_QINT32 - type: DT_HALF - } - } - } - attr { - name: "use_locking" - type: "bool" - default_value { - b: false - } - } - } - op { - name: "Assign" - input_arg { - name: "ref" - type_attr: "T" - is_ref: true - } - input_arg { - name: "value" - type_attr: "T" - } - output_arg { - name: "output_ref" - type_attr: "T" - is_ref: true - } - attr { - name: "T" - type: "type" - } - attr { - name: "validate_shape" - type: "bool" - default_value { - b: true - } - } - attr { - name: "use_locking" - type: "bool" - default_value { - b: true - } - } - allows_uninitialized_input: true - } - op { - name: "BroadcastGradientArgs" - input_arg { - name: "s0" - type_attr: "T" - } - input_arg { - name: "s1" - type_attr: "T" - } - output_arg { - name: "r0" - type_attr: "T" - } - output_arg { - name: "r1" - type_attr: "T" - } - attr { - name: "T" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "Cast" - input_arg { - name: "x" - type_attr: "SrcT" - } - output_arg { - name: "y" - type_attr: "DstT" - } - attr { - name: "SrcT" - type: "type" - } - attr { - name: "DstT" - type: "type" - } - } - op { - name: "Const" - output_arg { - name: "output" - type_attr: "dtype" - } - attr { - name: "value" - type: "tensor" - } - attr { - name: "dtype" - type: "type" - } - } - op { - name: "ExpandDims" - input_arg { - name: "input" - type_attr: "T" - } - input_arg { - name: "dim" - type_attr: "Tdim" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - attr { - name: "Tdim" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "Fill" - input_arg { - name: "dims" - type: DT_INT32 - } - input_arg { - name: "value" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - } - op { - name: "FloorDiv" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_UINT8 - type: DT_INT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT32 - type: DT_INT64 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - } - } - } - } - op { - name: "GreaterEqual" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type: DT_BOOL - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT32 - type: DT_INT64 - type: DT_UINT8 - type: DT_INT16 - type: DT_INT8 - type: DT_UINT16 - type: DT_HALF - } - } - } - } - op { - name: "Identity" - input_arg { - name: "input" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - } - op { - name: "InTopKV2" - input_arg { - name: "predictions" - type: DT_FLOAT - } - input_arg { - name: "targets" - type_attr: "T" - } - input_arg { - name: "k" - type_attr: "T" - } - output_arg { - name: "precision" - type: DT_BOOL - } - attr { - name: "T" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "MatMul" - input_arg { - name: "a" - type_attr: "T" - } - input_arg { - name: "b" - type_attr: "T" - } - output_arg { - name: "product" - type_attr: "T" - } - attr { - name: "transpose_a" - type: "bool" - default_value { - b: false - } - } - attr { - name: "transpose_b" - type: "bool" - default_value { - b: false - } - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT32 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - } - } - } - } - op { - name: "Maximum" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT32 - type: DT_INT64 - } - } - } - is_commutative: true - } - op { - name: "Mean" - input_arg { - name: "input" - type_attr: "T" - } - input_arg { - name: "reduction_indices" - type_attr: "Tidx" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "keep_dims" - type: "bool" - default_value { - b: false - } - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT64 - type: DT_INT32 - type: DT_UINT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT8 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_QINT8 - type: DT_QUINT8 - type: DT_QINT32 - type: DT_HALF - } - } - } - attr { - name: "Tidx" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "MergeV2Checkpoints" - input_arg { - name: "checkpoint_prefixes" - type: DT_STRING - } - input_arg { - name: "destination_prefix" - type: DT_STRING - } - attr { - name: "delete_old_dirs" - type: "bool" - default_value { - b: true - } - } - is_stateful: true - } - op { - name: "Mul" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_UINT8 - type: DT_INT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT32 - type: DT_INT64 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - } - } - } - is_commutative: true - } - op { - name: "NoOp" - } - op { - name: "Pack" - input_arg { - name: "values" - type_attr: "T" - number_attr: "N" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "N" - type: "int" - has_minimum: true - minimum: 1 - } - attr { - name: "T" - type: "type" - } - attr { - name: "axis" - type: "int" - default_value { - i: 0 - } - } - } - op { - name: "Placeholder" - output_arg { - name: "output" - type_attr: "dtype" - } - attr { - name: "dtype" - type: "type" - } - attr { - name: "shape" - type: "shape" - default_value { - shape { - unknown_rank: true - } - } - } - } - op { - name: "PreventGradient" - input_arg { - name: "input" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - attr { - name: "message" - type: "string" - default_value { - s: "" - } - } - } - op { - name: "Prod" - input_arg { - name: "input" - type_attr: "T" - } - input_arg { - name: "reduction_indices" - type_attr: "Tidx" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "keep_dims" - type: "bool" - default_value { - b: false - } - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT64 - type: DT_INT32 - type: DT_UINT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT8 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_QINT8 - type: DT_QUINT8 - type: DT_QINT32 - type: DT_HALF - } - } - } - attr { - name: "Tidx" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "RealDiv" - input_arg { - name: "x" - type_attr: "T" - } - input_arg { - name: "y" - type_attr: "T" - } - output_arg { - name: "z" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - type: DT_UINT8 - type: DT_INT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT32 - type: DT_INT64 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - } - } - } - } - op { - name: "Reshape" - input_arg { - name: "tensor" - type_attr: "T" - } - input_arg { - name: "shape" - type_attr: "Tshape" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - attr { - name: "Tshape" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "RestoreV2" - input_arg { - name: "prefix" - type: DT_STRING - } - input_arg { - name: "tensor_names" - type: DT_STRING - } - input_arg { - name: "shape_and_slices" - type: DT_STRING - } - output_arg { - name: "tensors" - type_list_attr: "dtypes" - } - attr { - name: "dtypes" - type: "list(type)" - has_minimum: true - minimum: 1 - } - is_stateful: true - } - op { - name: "SaveV2" - input_arg { - name: "prefix" - type: DT_STRING - } - input_arg { - name: "tensor_names" - type: DT_STRING - } - input_arg { - name: "shape_and_slices" - type: DT_STRING - } - input_arg { - name: "tensors" - type_list_attr: "dtypes" - } - attr { - name: "dtypes" - type: "list(type)" - has_minimum: true - minimum: 1 - } - is_stateful: true - } - op { - name: "ScalarSummary" - input_arg { - name: "tags" - type: DT_STRING - } - input_arg { - name: "values" - type_attr: "T" - } - output_arg { - name: "summary" - type: DT_STRING - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT32 - type: DT_INT64 - type: DT_UINT8 - type: DT_INT16 - type: DT_INT8 - type: DT_UINT16 - type: DT_HALF - } - } - } - } - op { - name: "Select" - input_arg { - name: "condition" - type: DT_BOOL - } - input_arg { - name: "t" - type_attr: "T" - } - input_arg { - name: "e" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - } - op { - name: "Selu" - input_arg { - name: "features" - type_attr: "T" - } - output_arg { - name: "activations" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - } - } - } - } - op { - name: "SeluGrad" - input_arg { - name: "gradients" - type_attr: "T" - } - input_arg { - name: "outputs" - type_attr: "T" - } - output_arg { - name: "backprops" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - } - } - } - } - op { - name: "Shape" - input_arg { - name: "input" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "out_type" - } - attr { - name: "T" - type: "type" - } - attr { - name: "out_type" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "ShardedFilename" - input_arg { - name: "basename" - type: DT_STRING - } - input_arg { - name: "shard" - type: DT_INT32 - } - input_arg { - name: "num_shards" - type: DT_INT32 - } - output_arg { - name: "filename" - type: DT_STRING - } - } - op { - name: "SparseSoftmaxCrossEntropyWithLogits" - input_arg { - name: "features" - type_attr: "T" - } - input_arg { - name: "labels" - type_attr: "Tlabels" - } - output_arg { - name: "loss" - type_attr: "T" - } - output_arg { - name: "backprop" - type_attr: "T" - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - } - } - } - attr { - name: "Tlabels" - type: "type" - default_value { - type: DT_INT64 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "StringJoin" - input_arg { - name: "inputs" - type: DT_STRING - number_attr: "N" - } - output_arg { - name: "output" - type: DT_STRING - } - attr { - name: "N" - type: "int" - has_minimum: true - minimum: 1 - } - attr { - name: "separator" - type: "string" - default_value { - s: "" - } - } - } - op { - name: "Sum" - input_arg { - name: "input" - type_attr: "T" - } - input_arg { - name: "reduction_indices" - type_attr: "Tidx" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "keep_dims" - type: "bool" - default_value { - b: false - } - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_FLOAT - type: DT_DOUBLE - type: DT_INT64 - type: DT_INT32 - type: DT_UINT8 - type: DT_UINT16 - type: DT_INT16 - type: DT_INT8 - type: DT_COMPLEX64 - type: DT_COMPLEX128 - type: DT_QINT8 - type: DT_QUINT8 - type: DT_QINT32 - type: DT_HALF - } - } - } - attr { - name: "Tidx" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "Tile" - input_arg { - name: "input" - type_attr: "T" - } - input_arg { - name: "multiples" - type_attr: "Tmultiples" - } - output_arg { - name: "output" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - attr { - name: "Tmultiples" - type: "type" - default_value { - type: DT_INT32 - } - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - } - op { - name: "TruncatedNormal" - input_arg { - name: "shape" - type_attr: "T" - } - output_arg { - name: "output" - type_attr: "dtype" - } - attr { - name: "seed" - type: "int" - default_value { - i: 0 - } - } - attr { - name: "seed2" - type: "int" - default_value { - i: 0 - } - } - attr { - name: "dtype" - type: "type" - allowed_values { - list { - type: DT_HALF - type: DT_FLOAT - type: DT_DOUBLE - } - } - } - attr { - name: "T" - type: "type" - allowed_values { - list { - type: DT_INT32 - type: DT_INT64 - } - } - } - is_stateful: true - } - op { - name: "VariableV2" - output_arg { - name: "ref" - type_attr: "dtype" - is_ref: true - } - attr { - name: "shape" - type: "shape" - } - attr { - name: "dtype" - type: "type" - } - attr { - name: "container" - type: "string" - default_value { - s: "" - } - } - attr { - name: "shared_name" - type: "string" - default_value { - s: "" - } - } - is_stateful: true - } - op { - name: "ZerosLike" - input_arg { - name: "x" - type_attr: "T" - } - output_arg { - name: "y" - type_attr: "T" - } - attr { - name: "T" - type: "type" - } - } - } - tags: "serve" - tensorflow_version: "1.4.1" - tensorflow_git_version: "v1.4.0-19-ga52c8d9" - } - graph_def { - node { - name: "input" - op: "Placeholder" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 784 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: -1 - } - dim { - size: 784 - } - } - } - } - } - node { - name: "y" - op: "Placeholder" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT64 - } - } - attr { - key: "shape" - value { - shape { - unknown_rank: true - } - } - } - } - node { - name: "dnn/hidden1/truncated_normal/shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 2 - } - } - tensor_content: "\020\003\000\000,\001\000\000" - } - } - } - } - node { - name: "dnn/hidden1/truncated_normal/mean" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/hidden1/truncated_normal/stddev" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.0714285746216774 - } - } - } - } - node { - name: "dnn/hidden1/truncated_normal/TruncatedNormal" - op: "TruncatedNormal" - input: "dnn/hidden1/truncated_normal/shape" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "seed" - value { - i: 0 - } - } - attr { - key: "seed2" - value { - i: 0 - } - } - } - node { - name: "dnn/hidden1/truncated_normal/mul" - op: "Mul" - input: "dnn/hidden1/truncated_normal/TruncatedNormal" - input: "dnn/hidden1/truncated_normal/stddev" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/truncated_normal" - op: "Add" - input: "dnn/hidden1/truncated_normal/mul" - input: "dnn/hidden1/truncated_normal/mean" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/weights" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/hidden1/weights/Assign" - op: "Assign" - input: "dnn/hidden1/weights" - input: "dnn/hidden1/truncated_normal" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/hidden1/weights/read" - op: "Identity" - input: "dnn/hidden1/weights" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/zeros" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - dim { - size: 300 - } - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/hidden1/bias" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 300 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/hidden1/bias/Assign" - op: "Assign" - input: "dnn/hidden1/bias" - input: "dnn/hidden1/zeros" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/hidden1/bias/read" - op: "Identity" - input: "dnn/hidden1/bias" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/MatMul" - op: "MatMul" - input: "input" - input: "dnn/hidden1/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "dnn/hidden1/add" - op: "Add" - input: "dnn/hidden1/MatMul" - input: "dnn/hidden1/bias/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/mul/x" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.009999999776482582 - } - } - } - } - node { - name: "dnn/hidden1/mul" - op: "Mul" - input: "dnn/hidden1/mul/x" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden1/Maximum" - op: "Maximum" - input: "dnn/hidden1/mul" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "dnn/hidden2/truncated_normal/shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 2 - } - } - tensor_content: ",\001\000\000d\000\000\000" - } - } - } - } - node { - name: "dnn/hidden2/truncated_normal/mean" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/hidden2/truncated_normal/stddev" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.1154700517654419 - } - } - } - } - node { - name: "dnn/hidden2/truncated_normal/TruncatedNormal" - op: "TruncatedNormal" - input: "dnn/hidden2/truncated_normal/shape" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "seed" - value { - i: 0 - } - } - attr { - key: "seed2" - value { - i: 0 - } - } - } - node { - name: "dnn/hidden2/truncated_normal/mul" - op: "Mul" - input: "dnn/hidden2/truncated_normal/TruncatedNormal" - input: "dnn/hidden2/truncated_normal/stddev" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/hidden2/truncated_normal" - op: "Add" - input: "dnn/hidden2/truncated_normal/mul" - input: "dnn/hidden2/truncated_normal/mean" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/hidden2/weights" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/hidden2/weights/Assign" - op: "Assign" - input: "dnn/hidden2/weights" - input: "dnn/hidden2/truncated_normal" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/hidden2/weights/read" - op: "Identity" - input: "dnn/hidden2/weights" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/hidden2/zeros" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - dim { - size: 100 - } - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/hidden2/bias" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 100 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/hidden2/bias/Assign" - op: "Assign" - input: "dnn/hidden2/bias" - input: "dnn/hidden2/zeros" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/hidden2/bias/read" - op: "Identity" - input: "dnn/hidden2/bias" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/hidden2/MatMul" - op: "MatMul" - input: "dnn/hidden1/Maximum" - input: "dnn/hidden2/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "dnn/hidden2/add" - op: "Add" - input: "dnn/hidden2/MatMul" - input: "dnn/hidden2/bias/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/hidden2/Selu" - op: "Selu" - input: "dnn/hidden2/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "dnn/outputs/truncated_normal/shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 2 - } - } - tensor_content: "d\000\000\000\n\000\000\000" - } - } - } - } - node { - name: "dnn/outputs/truncated_normal/mean" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/outputs/truncated_normal/stddev" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.20000000298023224 - } - } - } - } - node { - name: "dnn/outputs/truncated_normal/TruncatedNormal" - op: "TruncatedNormal" - input: "dnn/outputs/truncated_normal/shape" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "seed" - value { - i: 0 - } - } - attr { - key: "seed2" - value { - i: 0 - } - } - } - node { - name: "dnn/outputs/truncated_normal/mul" - op: "Mul" - input: "dnn/outputs/truncated_normal/TruncatedNormal" - input: "dnn/outputs/truncated_normal/stddev" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "dnn/outputs/truncated_normal" - op: "Add" - input: "dnn/outputs/truncated_normal/mul" - input: "dnn/outputs/truncated_normal/mean" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "dnn/outputs/weights" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/outputs/weights/Assign" - op: "Assign" - input: "dnn/outputs/weights" - input: "dnn/outputs/truncated_normal" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/outputs/weights/read" - op: "Identity" - input: "dnn/outputs/weights" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "dnn/outputs/zeros" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - dim { - size: 10 - } - } - float_val: 0.0 - } - } - } - } - node { - name: "dnn/outputs/bias" - op: "VariableV2" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - attr { - key: "container" - value { - s: "" - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "shape" - value { - shape { - dim { - size: 10 - } - } - } - } - attr { - key: "shared_name" - value { - s: "" - } - } - } - node { - name: "dnn/outputs/bias/Assign" - op: "Assign" - input: "dnn/outputs/bias" - input: "dnn/outputs/zeros" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "dnn/outputs/bias/read" - op: "Identity" - input: "dnn/outputs/bias" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - } - node { - name: "dnn/outputs/MatMul" - op: "MatMul" - input: "dnn/hidden2/Selu" - input: "dnn/outputs/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "dnn/outputs/add" - op: "Add" - input: "dnn/outputs/MatMul" - input: "dnn/outputs/bias/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "loss/SparseSoftmaxCrossEntropyWithLogits/Shape" - op: "Shape" - input: "y" - attr { - key: "T" - value { - type: DT_INT64 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits" - op: "SparseSoftmaxCrossEntropyWithLogits" - input: "dnn/outputs/add" - input: "y" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tlabels" - value { - type: DT_INT64 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "loss/Const" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 0 - } - } - } - } - node { - name: "loss/loss" - op: "Mean" - input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits" - input: "loss/Const" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/Shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - } - } - } - } - } - } - node { - name: "train/gradients/Const" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 1.0 - } - } - } - } - node { - name: "train/gradients/Fill" - op: "Fill" - input: "train/gradients/Shape" - input: "train/gradients/Const" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Reshape/shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 1 - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Reshape" - op: "Reshape" - input: "train/gradients/Fill" - input: "train/gradients/loss/loss_grad/Reshape/shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Shape" - op: "Shape" - input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/loss/loss_grad/Tile" - op: "Tile" - input: "train/gradients/loss/loss_grad/Reshape" - input: "train/gradients/loss/loss_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tmultiples" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Shape_1" - op: "Shape" - input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/loss/loss_grad/Shape_2" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - } - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Const" - op: "Const" - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 0 - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Prod" - op: "Prod" - input: "train/gradients/loss/loss_grad/Shape_1" - input: "train/gradients/loss/loss_grad/Const" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/loss/loss_grad/Const_1" - op: "Const" - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 0 - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Prod_1" - op: "Prod" - input: "train/gradients/loss/loss_grad/Shape_2" - input: "train/gradients/loss/loss_grad/Const_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/loss/loss_grad/Maximum/y" - op: "Const" - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - } - int_val: 1 - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Maximum" - op: "Maximum" - input: "train/gradients/loss/loss_grad/Prod_1" - input: "train/gradients/loss/loss_grad/Maximum/y" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/floordiv" - op: "FloorDiv" - input: "train/gradients/loss/loss_grad/Prod" - input: "train/gradients/loss/loss_grad/Maximum" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/loss/loss_grad/Shape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/Cast" - op: "Cast" - input: "train/gradients/loss/loss_grad/floordiv" - attr { - key: "DstT" - value { - type: DT_FLOAT - } - } - attr { - key: "SrcT" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/loss/loss_grad/truediv" - op: "RealDiv" - input: "train/gradients/loss/loss_grad/Tile" - input: "train/gradients/loss/loss_grad/Cast" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/zeros_like" - op: "ZerosLike" - input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/PreventGradient" - op: "PreventGradient" - input: "loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "message" - value { - s: "Currently there is no way to take the second derivative of sparse_softmax_cross_entropy_with_logits due to the fused implementation\'s interaction with tf.gradients()" - } - } - } - node { - name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - } - int_val: -1 - } - } - } - } - node { - name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims" - op: "ExpandDims" - input: "train/gradients/loss/loss_grad/truediv" - input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims/dim" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tdim" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 1 - } - } - } - } - } - } - node { - name: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul" - op: "Mul" - input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/ExpandDims" - input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/PreventGradient" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Shape" - op: "Shape" - input: "dnn/outputs/MatMul" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Shape_1" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 10 - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/BroadcastGradientArgs" - op: "BroadcastGradientArgs" - input: "train/gradients/dnn/outputs/add_grad/Shape" - input: "train/gradients/dnn/outputs/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Sum" - op: "Sum" - input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul" - input: "train/gradients/dnn/outputs/add_grad/BroadcastGradientArgs" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Reshape" - op: "Reshape" - input: "train/gradients/dnn/outputs/add_grad/Sum" - input: "train/gradients/dnn/outputs/add_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Sum_1" - op: "Sum" - input: "train/gradients/loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits_grad/mul" - input: "train/gradients/dnn/outputs/add_grad/BroadcastGradientArgs:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/Reshape_1" - op: "Reshape" - input: "train/gradients/dnn/outputs/add_grad/Sum_1" - input: "train/gradients/dnn/outputs/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/outputs/add_grad/Reshape" - input: "^train/gradients/dnn/outputs/add_grad/Reshape_1" - } - node { - name: "train/gradients/dnn/outputs/add_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/outputs/add_grad/Reshape" - input: "^train/gradients/dnn/outputs/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/outputs/add_grad/Reshape" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/add_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/outputs/add_grad/Reshape_1" - input: "^train/gradients/dnn/outputs/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/outputs/add_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/MatMul_grad/MatMul" - op: "MatMul" - input: "train/gradients/dnn/outputs/add_grad/tuple/control_dependency" - input: "dnn/outputs/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: true - } - } - } - node { - name: "train/gradients/dnn/outputs/MatMul_grad/MatMul_1" - op: "MatMul" - input: "dnn/hidden2/Selu" - input: "train/gradients/dnn/outputs/add_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: true - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/outputs/MatMul_grad/MatMul" - input: "^train/gradients/dnn/outputs/MatMul_grad/MatMul_1" - } - node { - name: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/outputs/MatMul_grad/MatMul" - input: "^train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/outputs/MatMul_grad/MatMul" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/outputs/MatMul_grad/MatMul_1" - input: "^train/gradients/dnn/outputs/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/outputs/MatMul_grad/MatMul_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/Selu_grad/SeluGrad" - op: "SeluGrad" - input: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency" - input: "dnn/hidden2/Selu" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Shape" - op: "Shape" - input: "dnn/hidden2/MatMul" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Shape_1" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 100 - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs" - op: "BroadcastGradientArgs" - input: "train/gradients/dnn/hidden2/add_grad/Shape" - input: "train/gradients/dnn/hidden2/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Sum" - op: "Sum" - input: "train/gradients/dnn/hidden2/Selu_grad/SeluGrad" - input: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Reshape" - op: "Reshape" - input: "train/gradients/dnn/hidden2/add_grad/Sum" - input: "train/gradients/dnn/hidden2/add_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Sum_1" - op: "Sum" - input: "train/gradients/dnn/hidden2/Selu_grad/SeluGrad" - input: "train/gradients/dnn/hidden2/add_grad/BroadcastGradientArgs:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/Reshape_1" - op: "Reshape" - input: "train/gradients/dnn/hidden2/add_grad/Sum_1" - input: "train/gradients/dnn/hidden2/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden2/add_grad/Reshape" - input: "^train/gradients/dnn/hidden2/add_grad/Reshape_1" - } - node { - name: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden2/add_grad/Reshape" - input: "^train/gradients/dnn/hidden2/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden2/add_grad/Reshape" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden2/add_grad/Reshape_1" - input: "^train/gradients/dnn/hidden2/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden2/add_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul" - op: "MatMul" - input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency" - input: "dnn/hidden2/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: true - } - } - } - node { - name: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1" - op: "MatMul" - input: "dnn/hidden1/Maximum" - input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: true - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul" - input: "^train/gradients/dnn/hidden2/MatMul_grad/MatMul_1" - } - node { - name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul" - input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden2/MatMul_grad/MatMul_1" - input: "^train/gradients/dnn/hidden2/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden2/MatMul_grad/MatMul_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Shape" - op: "Shape" - input: "dnn/hidden1/mul" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Shape_1" - op: "Shape" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Shape_2" - op: "Shape" - input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/zeros/Const" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.0 - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/zeros" - op: "Fill" - input: "train/gradients/dnn/hidden1/Maximum_grad/Shape_2" - input: "train/gradients/dnn/hidden1/Maximum_grad/zeros/Const" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/GreaterEqual" - op: "GreaterEqual" - input: "dnn/hidden1/mul" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/BroadcastGradientArgs" - op: "BroadcastGradientArgs" - input: "train/gradients/dnn/hidden1/Maximum_grad/Shape" - input: "train/gradients/dnn/hidden1/Maximum_grad/Shape_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Select" - op: "Select" - input: "train/gradients/dnn/hidden1/Maximum_grad/GreaterEqual" - input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency" - input: "train/gradients/dnn/hidden1/Maximum_grad/zeros" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Select_1" - op: "Select" - input: "train/gradients/dnn/hidden1/Maximum_grad/GreaterEqual" - input: "train/gradients/dnn/hidden1/Maximum_grad/zeros" - input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Sum" - op: "Sum" - input: "train/gradients/dnn/hidden1/Maximum_grad/Select" - input: "train/gradients/dnn/hidden1/Maximum_grad/BroadcastGradientArgs" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Reshape" - op: "Reshape" - input: "train/gradients/dnn/hidden1/Maximum_grad/Sum" - input: "train/gradients/dnn/hidden1/Maximum_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Sum_1" - op: "Sum" - input: "train/gradients/dnn/hidden1/Maximum_grad/Select_1" - input: "train/gradients/dnn/hidden1/Maximum_grad/BroadcastGradientArgs:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/Reshape_1" - op: "Reshape" - input: "train/gradients/dnn/hidden1/Maximum_grad/Sum_1" - input: "train/gradients/dnn/hidden1/Maximum_grad/Shape_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden1/Maximum_grad/Reshape" - input: "^train/gradients/dnn/hidden1/Maximum_grad/Reshape_1" - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden1/Maximum_grad/Reshape" - input: "^train/gradients/dnn/hidden1/Maximum_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/Maximum_grad/Reshape" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/Maximum_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden1/Maximum_grad/Reshape_1" - input: "^train/gradients/dnn/hidden1/Maximum_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/Maximum_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Shape" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Shape_1" - op: "Shape" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/BroadcastGradientArgs" - op: "BroadcastGradientArgs" - input: "train/gradients/dnn/hidden1/mul_grad/Shape" - input: "train/gradients/dnn/hidden1/mul_grad/Shape_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/mul" - op: "Mul" - input: "train/gradients/dnn/hidden1/Maximum_grad/tuple/control_dependency" - input: "dnn/hidden1/add" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Sum" - op: "Sum" - input: "train/gradients/dnn/hidden1/mul_grad/mul" - input: "train/gradients/dnn/hidden1/mul_grad/BroadcastGradientArgs" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Reshape" - op: "Reshape" - input: "train/gradients/dnn/hidden1/mul_grad/Sum" - input: "train/gradients/dnn/hidden1/mul_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/mul_1" - op: "Mul" - input: "dnn/hidden1/mul/x" - input: "train/gradients/dnn/hidden1/Maximum_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Sum_1" - op: "Sum" - input: "train/gradients/dnn/hidden1/mul_grad/mul_1" - input: "train/gradients/dnn/hidden1/mul_grad/BroadcastGradientArgs:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/Reshape_1" - op: "Reshape" - input: "train/gradients/dnn/hidden1/mul_grad/Sum_1" - input: "train/gradients/dnn/hidden1/mul_grad/Shape_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden1/mul_grad/Reshape" - input: "^train/gradients/dnn/hidden1/mul_grad/Reshape_1" - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden1/mul_grad/Reshape" - input: "^train/gradients/dnn/hidden1/mul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/mul_grad/Reshape" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/mul_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden1/mul_grad/Reshape_1" - input: "^train/gradients/dnn/hidden1/mul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/mul_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/AddN" - op: "AddN" - input: "train/gradients/dnn/hidden1/Maximum_grad/tuple/control_dependency_1" - input: "train/gradients/dnn/hidden1/mul_grad/tuple/control_dependency_1" - attr { - key: "N" - value { - i: 2 - } - } - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/Maximum_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Shape" - op: "Shape" - input: "dnn/hidden1/MatMul" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 2 - } - } - } - } - } - attr { - key: "out_type" - value { - type: DT_INT32 - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Shape_1" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 300 - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs" - op: "BroadcastGradientArgs" - input: "train/gradients/dnn/hidden1/add_grad/Shape" - input: "train/gradients/dnn/hidden1/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Sum" - op: "Sum" - input: "train/gradients/AddN" - input: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Reshape" - op: "Reshape" - input: "train/gradients/dnn/hidden1/add_grad/Sum" - input: "train/gradients/dnn/hidden1/add_grad/Shape" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Sum_1" - op: "Sum" - input: "train/gradients/AddN" - input: "train/gradients/dnn/hidden1/add_grad/BroadcastGradientArgs:1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/Reshape_1" - op: "Reshape" - input: "train/gradients/dnn/hidden1/add_grad/Sum_1" - input: "train/gradients/dnn/hidden1/add_grad/Shape_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tshape" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden1/add_grad/Reshape" - input: "^train/gradients/dnn/hidden1/add_grad/Reshape_1" - } - node { - name: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden1/add_grad/Reshape" - input: "^train/gradients/dnn/hidden1/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/add_grad/Reshape" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden1/add_grad/Reshape_1" - input: "^train/gradients/dnn/hidden1/add_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/add_grad/Reshape_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul" - op: "MatMul" - input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency" - input: "dnn/hidden1/weights/read" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 784 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: false - } - } - attr { - key: "transpose_b" - value { - b: true - } - } - } - node { - name: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1" - op: "MatMul" - input: "input" - input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "transpose_a" - value { - b: true - } - } - attr { - key: "transpose_b" - value { - b: false - } - } - } - node { - name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps" - op: "NoOp" - input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul" - input: "^train/gradients/dnn/hidden1/MatMul_grad/MatMul_1" - } - node { - name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency" - op: "Identity" - input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul" - input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - dim { - size: 784 - } - } - } - } - } - } - node { - name: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1" - op: "Identity" - input: "train/gradients/dnn/hidden1/MatMul_grad/MatMul_1" - input: "^train/gradients/dnn/hidden1/MatMul_grad/tuple/group_deps" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@train/gradients/dnn/hidden1/MatMul_grad/MatMul_1" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - } - node { - name: "train/GradientDescent/learning_rate" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_FLOAT - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_FLOAT - tensor_shape { - } - float_val: 0.009999999776482582 - } - } - } - } - node { - name: "train/GradientDescent/update_dnn/hidden1/weights/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/hidden1/weights" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/hidden1/MatMul_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent/update_dnn/hidden1/bias/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/hidden1/bias" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/hidden1/add_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent/update_dnn/hidden2/weights/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/hidden2/weights" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/hidden2/MatMul_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent/update_dnn/hidden2/bias/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/hidden2/bias" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/hidden2/add_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent/update_dnn/outputs/weights/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/outputs/weights" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/outputs/MatMul_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent/update_dnn/outputs/bias/ApplyGradientDescent" - op: "ApplyGradientDescent" - input: "dnn/outputs/bias" - input: "train/GradientDescent/learning_rate" - input: "train/gradients/dnn/outputs/add_grad/tuple/control_dependency_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: false - } - } - } - node { - name: "train/GradientDescent" - op: "NoOp" - input: "^train/GradientDescent/update_dnn/hidden1/weights/ApplyGradientDescent" - input: "^train/GradientDescent/update_dnn/hidden1/bias/ApplyGradientDescent" - input: "^train/GradientDescent/update_dnn/hidden2/weights/ApplyGradientDescent" - input: "^train/GradientDescent/update_dnn/hidden2/bias/ApplyGradientDescent" - input: "^train/GradientDescent/update_dnn/outputs/weights/ApplyGradientDescent" - input: "^train/GradientDescent/update_dnn/outputs/bias/ApplyGradientDescent" - } - node { - name: "eval/in_top_k/InTopKV2/k" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT64 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT64 - tensor_shape { - } - int64_val: 1 - } - } - } - } - node { - name: "eval/in_top_k/InTopKV2" - op: "InTopKV2" - input: "dnn/outputs/add" - input: "y" - input: "eval/in_top_k/InTopKV2/k" - attr { - key: "T" - value { - type: DT_INT64 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "eval/Cast" - op: "Cast" - input: "eval/in_top_k/InTopKV2" - attr { - key: "DstT" - value { - type: DT_FLOAT - } - } - attr { - key: "SrcT" - value { - type: DT_BOOL - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: -1 - } - } - } - } - } - } - node { - name: "eval/Const" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - dim { - size: 1 - } - } - int_val: 0 - } - } - } - } - node { - name: "eval/Mean" - op: "Mean" - input: "eval/Cast" - input: "eval/Const" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "Tidx" - value { - type: DT_INT32 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "keep_dims" - value { - b: false - } - } - } - node { - name: "init" - op: "NoOp" - input: "^dnn/hidden1/weights/Assign" - input: "^dnn/hidden1/bias/Assign" - input: "^dnn/hidden2/weights/Assign" - input: "^dnn/hidden2/bias/Assign" - input: "^dnn/outputs/weights/Assign" - input: "^dnn/outputs/bias/Assign" - } - node { - name: "Accuracy/tags" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - } - string_val: "Accuracy" - } - } - } - } - node { - name: "Accuracy" - op: "ScalarSummary" - input: "Accuracy/tags" - input: "eval/Mean" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "save/Const" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - } - string_val: "model" - } - } - } - } - node { - name: "save/StringJoin/inputs_1" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - } - string_val: "_temp_de3cfc5e8e7e4734ae221577e8fd36a2/part" - } - } - } - } - node { - name: "save/StringJoin" - op: "StringJoin" - input: "save/Const" - input: "save/StringJoin/inputs_1" - attr { - key: "N" - value { - i: 2 - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "separator" - value { - s: "" - } - } - } - node { - name: "save/num_shards" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - } - int_val: 1 - } - } - } - } - node { - name: "save/ShardedFilename/shard" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - attr { - key: "dtype" - value { - type: DT_INT32 - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_INT32 - tensor_shape { - } - int_val: 0 - } - } - } - } - node { - name: "save/ShardedFilename" - op: "ShardedFilename" - input: "save/StringJoin" - input: "save/ShardedFilename/shard" - input: "save/num_shards" - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "save/SaveV2/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 6 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 6 - } - } - string_val: "dnn/hidden1/bias" - string_val: "dnn/hidden1/weights" - string_val: "dnn/hidden2/bias" - string_val: "dnn/hidden2/weights" - string_val: "dnn/outputs/bias" - string_val: "dnn/outputs/weights" - } - } - } - } - node { - name: "save/SaveV2/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 6 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 6 - } - } - string_val: "" - string_val: "" - string_val: "" - string_val: "" - string_val: "" - string_val: "" - } - } - } - } - node { - name: "save/SaveV2" - op: "SaveV2" - input: "save/ShardedFilename" - input: "save/SaveV2/tensor_names" - input: "save/SaveV2/shape_and_slices" - input: "dnn/hidden1/bias" - input: "dnn/hidden1/weights" - input: "dnn/hidden2/bias" - input: "dnn/hidden2/weights" - input: "dnn/outputs/bias" - input: "dnn/outputs/weights" - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - type: DT_FLOAT - type: DT_FLOAT - type: DT_FLOAT - type: DT_FLOAT - type: DT_FLOAT - } - } - } - } - node { - name: "save/control_dependency" - op: "Identity" - input: "save/ShardedFilename" - input: "^save/SaveV2" - attr { - key: "T" - value { - type: DT_STRING - } - } - attr { - key: "_class" - value { - list { - s: "loc:@save/ShardedFilename" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "save/MergeV2Checkpoints/checkpoint_prefixes" - op: "Pack" - input: "save/ShardedFilename" - input: "^save/control_dependency" - attr { - key: "N" - value { - i: 1 - } - } - attr { - key: "T" - value { - type: DT_STRING - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "axis" - value { - i: 0 - } - } - } - node { - name: "save/MergeV2Checkpoints" - op: "MergeV2Checkpoints" - input: "save/MergeV2Checkpoints/checkpoint_prefixes" - input: "save/Const" - attr { - key: "delete_old_dirs" - value { - b: true - } - } - } - node { - name: "save/Identity" - op: "Identity" - input: "save/Const" - input: "^save/control_dependency" - input: "^save/MergeV2Checkpoints" - attr { - key: "T" - value { - type: DT_STRING - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - } - } - } - } - } - node { - name: "save/RestoreV2/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/hidden1/bias" - } - } - } - } - node { - name: "save/RestoreV2/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2/tensor_names" - input: "save/RestoreV2/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign" - op: "Assign" - input: "dnn/hidden1/bias" - input: "save/RestoreV2" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/RestoreV2_1/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/hidden1/weights" - } - } - } - } - node { - name: "save/RestoreV2_1/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2_1" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2_1/tensor_names" - input: "save/RestoreV2_1/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign_1" - op: "Assign" - input: "dnn/hidden1/weights" - input: "save/RestoreV2_1" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden1/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 784 - } - dim { - size: 300 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/RestoreV2_2/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/hidden2/bias" - } - } - } - } - node { - name: "save/RestoreV2_2/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2_2" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2_2/tensor_names" - input: "save/RestoreV2_2/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign_2" - op: "Assign" - input: "dnn/hidden2/bias" - input: "save/RestoreV2_2" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/RestoreV2_3/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/hidden2/weights" - } - } - } - } - node { - name: "save/RestoreV2_3/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2_3" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2_3/tensor_names" - input: "save/RestoreV2_3/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign_3" - op: "Assign" - input: "dnn/hidden2/weights" - input: "save/RestoreV2_3" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/hidden2/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 300 - } - dim { - size: 100 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/RestoreV2_4/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/outputs/bias" - } - } - } - } - node { - name: "save/RestoreV2_4/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2_4" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2_4/tensor_names" - input: "save/RestoreV2_4/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign_4" - op: "Assign" - input: "dnn/outputs/bias" - input: "save/RestoreV2_4" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/bias" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/RestoreV2_5/tensor_names" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "dnn/outputs/weights" - } - } - } - } - node { - name: "save/RestoreV2_5/shape_and_slices" - op: "Const" - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 1 - } - } - } - } - } - attr { - key: "dtype" - value { - type: DT_STRING - } - } - attr { - key: "value" - value { - tensor { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - } - string_val: "" - } - } - } - } - node { - name: "save/RestoreV2_5" - op: "RestoreV2" - input: "save/Const" - input: "save/RestoreV2_5/tensor_names" - input: "save/RestoreV2_5/shape_and_slices" - attr { - key: "_output_shapes" - value { - list { - shape { - unknown_rank: true - } - } - } - } - attr { - key: "dtypes" - value { - list { - type: DT_FLOAT - } - } - } - } - node { - name: "save/Assign_5" - op: "Assign" - input: "dnn/outputs/weights" - input: "save/RestoreV2_5" - attr { - key: "T" - value { - type: DT_FLOAT - } - } - attr { - key: "_class" - value { - list { - s: "loc:@dnn/outputs/weights" - } - } - } - attr { - key: "_output_shapes" - value { - list { - shape { - dim { - size: 100 - } - dim { - size: 10 - } - } - } - } - } - attr { - key: "use_locking" - value { - b: true - } - } - attr { - key: "validate_shape" - value { - b: true - } - } - } - node { - name: "save/restore_shard" - op: "NoOp" - input: "^save/Assign" - input: "^save/Assign_1" - input: "^save/Assign_2" - input: "^save/Assign_3" - input: "^save/Assign_4" - input: "^save/Assign_5" - } - node { - name: "save/restore_all" - op: "NoOp" - input: "^save/restore_shard" - } - versions { - producer: 24 - } - } - saver_def { - filename_tensor_name: "save/Const:0" - save_tensor_name: "save/Identity:0" - restore_op_name: "save/restore_all" - max_to_keep: 5 - sharded: true - keep_checkpoint_every_n_hours: 10000.0 - version: V2 - } - collection_def { - key: "summaries" - value { - node_list { - value: "Accuracy:0" - } - } - } - collection_def { - key: "train_op" - value { - node_list { - value: "train/GradientDescent" - } - } - } - collection_def { - key: "trainable_variables" - value { - bytes_list { - value: "\n\025dnn/hidden1/weights:0\022\032dnn/hidden1/weights/Assign\032\032dnn/hidden1/weights/read:02\036dnn/hidden1/truncated_normal:0" - value: "\n\022dnn/hidden1/bias:0\022\027dnn/hidden1/bias/Assign\032\027dnn/hidden1/bias/read:02\023dnn/hidden1/zeros:0" - value: "\n\025dnn/hidden2/weights:0\022\032dnn/hidden2/weights/Assign\032\032dnn/hidden2/weights/read:02\036dnn/hidden2/truncated_normal:0" - value: "\n\022dnn/hidden2/bias:0\022\027dnn/hidden2/bias/Assign\032\027dnn/hidden2/bias/read:02\023dnn/hidden2/zeros:0" - value: "\n\025dnn/outputs/weights:0\022\032dnn/outputs/weights/Assign\032\032dnn/outputs/weights/read:02\036dnn/outputs/truncated_normal:0" - value: "\n\022dnn/outputs/bias:0\022\027dnn/outputs/bias/Assign\032\027dnn/outputs/bias/read:02\023dnn/outputs/zeros:0" - } - } - } - collection_def { - key: "variables" - value { - bytes_list { - value: "\n\025dnn/hidden1/weights:0\022\032dnn/hidden1/weights/Assign\032\032dnn/hidden1/weights/read:02\036dnn/hidden1/truncated_normal:0" - value: "\n\022dnn/hidden1/bias:0\022\027dnn/hidden1/bias/Assign\032\027dnn/hidden1/bias/read:02\023dnn/hidden1/zeros:0" - value: "\n\025dnn/hidden2/weights:0\022\032dnn/hidden2/weights/Assign\032\032dnn/hidden2/weights/read:02\036dnn/hidden2/truncated_normal:0" - value: "\n\022dnn/hidden2/bias:0\022\027dnn/hidden2/bias/Assign\032\027dnn/hidden2/bias/read:02\023dnn/hidden2/zeros:0" - value: "\n\025dnn/outputs/weights:0\022\032dnn/outputs/weights/Assign\032\032dnn/outputs/weights/read:02\036dnn/outputs/truncated_normal:0" - value: "\n\022dnn/outputs/bias:0\022\027dnn/outputs/bias/Assign\032\027dnn/outputs/bias/read:02\023dnn/outputs/zeros:0" - } - } - } - signature_def { - key: "serving_default" - value { - inputs { - key: "x" - value { - name: "input:0" - dtype: DT_FLOAT - tensor_shape { - dim { - size: -1 - } - dim { - size: 784 - } - } - } - } - outputs { - key: "y" - value { - name: "dnn/outputs/add:0" - dtype: DT_FLOAT - tensor_shape { - dim { - size: -1 - } - dim { - size: 10 - } - } - } - } - method_name: "tensorflow/serving/predict" - } - } -} diff --git a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.data-00000-of-00001 b/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.data-00000-of-00001 Binary files differdeleted file mode 100644 index a7ca01888c7..00000000000 --- a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.data-00000-of-00001 +++ /dev/null diff --git a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.index b/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.index Binary files differdeleted file mode 100644 index 7989c109a3a..00000000000 --- a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.index +++ /dev/null diff --git a/config-model/src/test/cfg/application/ml_serving/models/mnist/simple_mnist.py b/config-model/src/test/cfg/application/ml_serving/models/mnist/simple_mnist.py deleted file mode 100644 index 26529f67919..00000000000 --- a/config-model/src/test/cfg/application/ml_serving/models/mnist/simple_mnist.py +++ /dev/null @@ -1,97 +0,0 @@ - -# Common imports -import numpy as np -import tensorflow as tf - -from tensorflow.examples.tutorials.mnist import input_data -from datetime import datetime - -now = datetime.utcnow().strftime("%Y%m%d%H%M%S") -root_logdir = "tf_logs" -logdir = "{}/run-{}/".format(root_logdir, now) - -mnist = input_data.read_data_sets("/tmp/data/") -X_train = mnist.train.images -X_test = mnist.test.images -y_train = mnist.train.labels.astype("int") -y_test = mnist.test.labels.astype("int") - -n_inputs = 28*28 # MNIST -n_hidden1 = 300 -n_hidden2 = 100 -n_hidden3 = 40 -n_outputs = 10 - -learning_rate = 0.01 -n_epochs = 20 -batch_size = 50 - -input = tf.placeholder(tf.float32, shape=(None, n_inputs), name="input") -y = tf.placeholder(tf.int64, shape=(None), name="y") - - -def neuron_layer(X, n_neurons, name, activation=None): - with tf.name_scope(name): - n_inputs = int(X.get_shape()[1]) - stddev = 2 / np.sqrt(n_inputs) - init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev) - W = tf.Variable(init, name="weights") - b = tf.Variable(tf.zeros([n_neurons]), name="bias") - Z = tf.matmul(X, W) + b - if activation is not None: - return activation(Z) - else: - return Z - - -def leaky_relu(z, name=None): - return tf.maximum(0.01 * z, z, name=name) - - -with tf.name_scope("dnn"): - hidden1 = neuron_layer(input, n_hidden1, name="hidden1", activation=leaky_relu) - hidden2 = neuron_layer(hidden1, n_hidden2, name="hidden2", activation=tf.nn.selu) - logits = neuron_layer(hidden2, n_outputs, name="outputs") #, activation=tf.nn.sigmoid) - -with tf.name_scope("loss"): - xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) - loss = tf.reduce_mean(xentropy, name="loss") - -with tf.name_scope("train"): - optimizer = tf.train.GradientDescentOptimizer(learning_rate) - training_op = optimizer.minimize(loss) - -with tf.name_scope("eval"): - correct = tf.nn.in_top_k(logits, y, 1) - accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) - -init = tf.global_variables_initializer() -accuracy_summary = tf.summary.scalar('Accuracy', accuracy) -file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph()) - -with tf.Session() as sess: - init.run() - for epoch in range(n_epochs): - for iteration in range(mnist.train.num_examples // batch_size): - X_batch, y_batch = mnist.train.next_batch(batch_size) - sess.run(training_op, feed_dict={input: X_batch, y: y_batch}) - acc_train = accuracy.eval(feed_dict={input: X_batch, y: y_batch}) - acc_val = accuracy.eval(feed_dict={input: mnist.validation.images, - y: mnist.validation.labels}) - print(epoch, "Train accuracy:", acc_train, "Val accuracy:", acc_val) - - # Save summary for tensorboard - summary_str = accuracy_summary.eval(feed_dict={input: mnist.validation.images, - y: mnist.validation.labels}) - file_writer.add_summary(summary_str, epoch) - - export_path = "saved" - print('Exporting trained model to ', export_path) - builder = tf.saved_model.builder.SavedModelBuilder(export_path) - signature = tf.saved_model.signature_def_utils.predict_signature_def(inputs = {'x':input}, outputs = {'y':logits}) - builder.add_meta_graph_and_variables(sess, - [tf.saved_model.tag_constants.SERVING], - signature_def_map={'serving_default':signature}) - builder.save(as_text=True) - -file_writer.close()
\ No newline at end of file diff --git a/config-model/src/test/java/com/yahoo/config/model/ModelEvaluationTest.java b/config-model/src/test/java/com/yahoo/config/model/ModelEvaluationTest.java index c5fb4f575cf..677a7615f04 100644 --- a/config-model/src/test/java/com/yahoo/config/model/ModelEvaluationTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/ModelEvaluationTest.java @@ -2,13 +2,10 @@ package com.yahoo.config.model; import ai.vespa.models.evaluation.Model; import ai.vespa.models.evaluation.ModelsEvaluator; -import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.io.IOUtils; -import com.yahoo.path.Path; +import com.yahoo.config.model.application.provider.FilesApplicationPackage; import com.yahoo.vespa.config.search.RankProfilesConfig; import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.container.ContainerCluster; -import org.junit.After; import org.junit.Test; import org.xml.sax.SAXException; @@ -25,41 +22,17 @@ import static org.junit.Assert.assertTrue; */ public class ModelEvaluationTest { - private static final Path appDir = Path.fromString("src/test/cfg/application/ml_serving"); - - @After - public void removeGeneratedModelFiles() { - IOUtils.recursiveDeleteDir(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile()); - } + private static final String TESTDIR = "src/test/cfg/application/"; @Test public void testMl_ServingApplication() throws SAXException, IOException { - ApplicationPackageTester tester = ApplicationPackageTester.create(appDir.toString()); + ApplicationPackageTester tester = ApplicationPackageTester.create(TESTDIR + "ml_serving"); VespaModel model = new VespaModel(tester.app()); - assertHasMlModels(model); - - // At this point the expression is stored - copy application to another location which do not have a models dir - Path storedAppDir = appDir.append("copy"); - try { - storedAppDir.toFile().mkdirs(); - IOUtils.copy(appDir.append("services.xml").toString(), storedAppDir.append("services.xml").toString()); - IOUtils.copyDirectory(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile(), - storedAppDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile()); - ApplicationPackageTester storedTester = ApplicationPackageTester.create(storedAppDir.toString()); - VespaModel storedModel = new VespaModel(storedTester.app()); - assertHasMlModels(storedModel); - } - finally { - IOUtils.recursiveDeleteDir(storedAppDir.toFile()); - } - } - - private void assertHasMlModels(VespaModel model) { ContainerCluster cluster = model.getContainerClusters().get("container"); RankProfilesConfig.Builder b = new RankProfilesConfig.Builder(); cluster.getConfig(b); RankProfilesConfig config = new RankProfilesConfig(b); - assertEquals(4, config.rankprofile().size()); + assertEquals(3, config.rankprofile().size()); Set<String> modelNames = config.rankprofile().stream().map(v -> v.name()).collect(Collectors.toSet()); assertTrue(modelNames.contains("xgboost_2_2")); assertTrue(modelNames.contains("mnist_softmax")); @@ -67,7 +40,7 @@ public class ModelEvaluationTest { ModelsEvaluator evaluator = new ModelsEvaluator(config); - assertEquals(4, evaluator.models().size()); + assertEquals(3, evaluator.models().size()); Model xgboost = evaluator.models().get("xgboost_2_2"); assertNotNull(xgboost); assertNotNull(xgboost.evaluatorOf()); diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithOnnxTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithOnnxTestCase.java index 04a6f953bb6..815a01cdb99 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithOnnxTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithOnnxTestCase.java @@ -142,6 +142,7 @@ public class RankingExpressionWithOnnxTestCase { } } + @Test public void testOnnxReferenceWithWrongMacroType() { try { diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithTensorFlowTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithTensorFlowTestCase.java index 28fcf871cf3..c317f07b87a 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithTensorFlowTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithTensorFlowTestCase.java @@ -403,7 +403,7 @@ public class RankingExpressionWithTensorFlowTestCase { */ private void assertLargeConstant(String name, RankProfileSearchFixture search, Optional<Long> expectedSize) { try { - Path constantApplicationPackagePath = Path.fromString("models.generated/mnist_softmax_saved/constants").append(name + ".tbf"); + Path constantApplicationPackagePath = Path.fromString("models.generated/mnist_softmax/saved/constants").append(name + ".tbf"); RankingConstant rankingConstant = search.search().rankingConstants().get(name); assertEquals(name, rankingConstant.getName()); assertTrue(rankingConstant.getFileName().endsWith(constantApplicationPackagePath.toString())); @@ -485,7 +485,7 @@ public class RankingExpressionWithTensorFlowTestCase { @Override public ApplicationFile getFile(Path file) { - return new MockApplicationFile(file, Path.fromString(root().toString())); + return new StoringApplicationPackageFile(file, Path.fromString(root().toString())); } @Override @@ -505,4 +505,123 @@ public class RankingExpressionWithTensorFlowTestCase { } + static class StoringApplicationPackageFile extends ApplicationFile { + + /** The path to the application package root */ + private final Path root; + + /** The File pointing to the actual file represented by this */ + private final File file; + + StoringApplicationPackageFile(Path filePath, Path applicationPackagePath) { + super(filePath); + this.root = applicationPackagePath; + file = applicationPackagePath.append(filePath).toFile(); + } + + @Override + public boolean isDirectory() { + return file.isDirectory(); + } + + @Override + public boolean exists() { + return file.exists(); + } + + @Override + public Reader createReader() throws FileNotFoundException { + try { + if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist"); + return IOUtils.createReader(file, "UTF-8"); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public InputStream createInputStream() throws FileNotFoundException { + try { + if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist"); + return new BufferedInputStream(new FileInputStream(file)); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public ApplicationFile createDirectory() { + file.mkdirs(); + return this; + } + + @Override + public ApplicationFile writeFile(Reader input) { + try { + IOUtils.writeFile(file, IOUtils.readAll(input), false); + return this; + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public ApplicationFile appendFile(String value) { + try { + IOUtils.writeFile(file, value, true); + return this; + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public List<ApplicationFile> listFiles(PathFilter filter) { + if ( ! isDirectory()) return Collections.emptyList(); + return Arrays.stream(file.listFiles()).filter(f -> filter.accept(Path.fromString(f.toString()))) + .map(f -> new StoringApplicationPackageFile(asApplicationRelativePath(f), + root)) + .collect(Collectors.toList()); + } + + @Override + public ApplicationFile delete() { + file.delete(); + return this; + } + + @Override + public MetaData getMetaData() { + throw new UnsupportedOperationException(); + } + + @Override + public int compareTo(ApplicationFile other) { + return this.getPath().getName().compareTo((other).getPath().getName()); + } + + /** Strips the application package root path prefix from the path of the given file */ + private Path asApplicationRelativePath(File file) { + Path path = Path.fromString(file.toString()); + + Iterator<String> pathIterator = path.iterator(); + // Skip the path elements this shares with the root + for (Iterator<String> rootIterator = root.iterator(); rootIterator.hasNext(); ) { + String rootElement = rootIterator.next(); + String pathElement = pathIterator.next(); + if ( ! rootElement.equals(pathElement)) throw new RuntimeException("Assumption broken"); + } + // Build a path from the remaining + Path relative = Path.fromString(""); + while (pathIterator.hasNext()) + relative = relative.append(pathIterator.next()); + return relative; + } + + } + } diff --git a/model-evaluation/src/main/java/ai/vespa/models/evaluation/ModelsEvaluator.java b/model-evaluation/src/main/java/ai/vespa/models/evaluation/ModelsEvaluator.java index dacf20b7ef2..682a7fa057c 100644 --- a/model-evaluation/src/main/java/ai/vespa/models/evaluation/ModelsEvaluator.java +++ b/model-evaluation/src/main/java/ai/vespa/models/evaluation/ModelsEvaluator.java @@ -43,8 +43,8 @@ public class ModelsEvaluator extends AbstractComponent { public Model requireModel(String name) { Model model = models.get(name); if (model == null) - throw new IllegalArgumentException("No model named '" + name + "'. Available models: " + - String.join(", ", models.keySet())); + throw new IllegalArgumentException("No model named '" + name + ". Available models: " + + models.keySet().stream().collect(Collectors.joining(", "))); return model; } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModel.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModel.java index f7fe91cb56f..6716993e1dd 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModel.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModel.java @@ -98,33 +98,33 @@ public class ImportedModel { void requiredMacro(String name, TensorType type) { requiredMacros.put(name, type); } /** - * Returns all the output expressions of this indexed by name. The names consist of one or two parts - * separated by dot, where the first part is the signature name + * Returns all the outputs of this by name. The names consist of one to three parts + * separated by dot, where the first part is the model name, the second is the signature name * if signatures are used, or the expression name if signatures are not used and there are multiple - * expressions, and the second is the output name if signature names are used. + * expressions, and the third is the output name if signature names are used. */ public List<Pair<String, RankingExpression>> outputExpressions() { - List<Pair<String, RankingExpression>> expressions = new ArrayList<>(); + List<Pair<String, RankingExpression>> names = new ArrayList<>(); for (Map.Entry<String, Signature> signatureEntry : signatures().entrySet()) { for (Map.Entry<String, String> outputEntry : signatureEntry.getValue().outputs().entrySet()) - expressions.add(new Pair<>(signatureEntry.getKey() + "." + outputEntry.getKey(), - expressions().get(outputEntry.getValue()))); + names.add(new Pair<>(signatureEntry.getKey() + "." + outputEntry.getKey(), + expressions().get(outputEntry.getValue()))); if (signatureEntry.getValue().outputs().isEmpty()) // fallback: Signature without outputs - expressions.add(new Pair<>(signatureEntry.getKey(), - expressions().get(signatureEntry.getKey()))); + names.add(new Pair<>(signatureEntry.getKey(), + expressions().get(signatureEntry.getKey()))); } if (signatures().isEmpty()) { // fallback for models without signatures if (expressions().size() == 1) { - Map.Entry<String, RankingExpression> singleEntry = this.expressions.entrySet().iterator().next(); - expressions.add(new Pair<>(singleEntry.getKey(), singleEntry.getValue())); + Map.Entry<String, RankingExpression> singleEntry = expressions.entrySet().iterator().next(); + names.add(new Pair<>(singleEntry.getKey(), singleEntry.getValue())); } else { for (Map.Entry<String, RankingExpression> expressionEntry : expressions().entrySet()) { - expressions.add(new Pair<>(expressionEntry.getKey(), expressionEntry.getValue())); + names.add(new Pair<>(expressionEntry.getKey(), expressionEntry.getValue())); } } } - return expressions; + return names; } /** diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModels.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModels.java index 32d33622a33..b1714b49256 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModels.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModels.java @@ -10,9 +10,7 @@ import java.util.Collection; import java.util.Optional; /** - * All models imported from the models/ directory in the application package. - * If this is empty it may be due to either not having any models in the application package, - * or this being created for a ZooKeeper application package, which does not have imported models. + * All models imported from the models/ directory in the application package * * @author bratseth */ @@ -56,22 +54,16 @@ public class ImportedModels { } /** - * Returns the model at the given location in the application package. + * Returns the model at the given location in the application package (lazily loaded), * - * @param modelPath the path to this model (file or directory, depending on model type) - * under the application package, both from the root or relative to the - * models directory works - * @return the model at this path or null if none + * @param modelPath the full path to this model (file or directory, depending on model type) + * under the application package + * @throws IllegalArgumentException if the model cannot be loaded */ public ImportedModel get(File modelPath) { - System.out.println("Name from " + modelPath + ": " + toName(modelPath)); return importedModels.get(toName(modelPath)); } - public ImportedModel get(String modelName) { - return importedModels.get(modelName); - } - /** Returns an immutable collection of all the imported models */ public Collection<ImportedModel> all() { return importedModels.values(); |