summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/ApplicationPackage.java6
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java126
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/ConvertedModel.java258
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/OnnxFeatureConverter.java6
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/TensorFlowFeatureConverter.java4
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/XgboostFeatureConverter.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java35
-rw-r--r--config-model/src/test/cfg/application/ml_serving/models/mnist/saved/saved_model.pbtxt7982
-rw-r--r--config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.data-00000-of-00001bin1066440 -> 0 bytes
-rw-r--r--config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.indexbin308 -> 0 bytes
-rw-r--r--config-model/src/test/cfg/application/ml_serving/models/mnist/simple_mnist.py97
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/ModelEvaluationTest.java37
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithOnnxTestCase.java1
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/RankingExpressionWithTensorFlowTestCase.java123
-rw-r--r--model-evaluation/src/main/java/ai/vespa/models/evaluation/ModelsEvaluator.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModel.java24
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/integration/ml/ImportedModels.java18
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
deleted 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
Binary files differ
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
deleted file mode 100644
index 7989c109a3a..00000000000
--- a/config-model/src/test/cfg/application/ml_serving/models/mnist/saved/variables/variables.index
+++ /dev/null
Binary files differ
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();