TF Updates (#87)

* tf updates

* pom

* copyright

* graphrunner tests

* gpu test

* getSessionOptionsConfigProto

* dtype fix

* Small fix

Signed-off-by: AlexDBlack <blacka101@gmail.com>

* cast graphs

* savemodel test fix

* testresource instead of local

* Logging level

Signed-off-by: AlexDBlack <blacka101@gmail.com>

* gson dependency issue fix; fix GraphRunnerTest for no session options config case

Signed-off-by: Alex Black <blacka101@gmail.com>

* Final tweaks

Signed-off-by: AlexDBlack <blacka101@gmail.com>

* few minor fixes

Signed-off-by: raver119 <raver119@gmail.com>

* one more fix

Signed-off-by: raver119 <raver119@gmail.com>

* Tweak configuration for GraphRunnerTest

Signed-off-by: AlexDBlack <blacka101@gmail.com>

* nd4j align config

* tf warmup
master
Fariz Rahman 2019-12-04 11:41:03 +05:30 committed by Alex Black
parent 190575196c
commit 0d14032d26
132 changed files with 1940 additions and 516 deletions

View File

@ -28,6 +28,7 @@ import org.nd4j.linalg.api.concurrency.AffinityManager;
import org.nd4j.linalg.api.concurrency.BasicAffinityManager;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.jcublas.buffer.BaseCudaDataBuffer;
import org.nd4j.linalg.jcublas.context.CudaContext;
import org.nd4j.nativeblas.NativeOpsHolder;
import org.slf4j.Logger;
@ -298,9 +299,12 @@ public class CudaAffinityManager extends BasicAffinityManager {
@Override
public void ensureLocation(INDArray array, Location location) {
// to location to ensure for empty array
if (array.isEmpty())
if (array.isEmpty() || array.isS())
return;
// let's make sure host pointer actually exists
((BaseCudaDataBuffer) array.data()).lazyAllocateHostPointer();
val point = AtomicAllocator.getInstance().getAllocationPoint(array);
switch (location) {
case HOST: {

View File

@ -1,5 +1,6 @@
/*******************************************************************************
* Copyright (c) 2015-2018 Skymind, Inc.
* Copyright (c) 2019 Konduit K.K.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
@ -16,6 +17,12 @@
package org.nd4j.tensorflow.conversion;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.bytedeco.tensorflow.TF_Tensor;
import org.nd4j.linalg.api.buffer.DataType;
import org.nd4j.resources.Resources;
import org.nd4j.shade.protobuf.Descriptors;
import org.nd4j.shade.protobuf.util.JsonFormat;
import org.apache.commons.io.IOUtils;
import org.junit.Ignore;
@ -27,6 +34,8 @@ import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.io.ClassPathResource;
import org.nd4j.tensorflow.conversion.graphrunner.GraphRunner;
import org.nd4j.tensorflow.conversion.graphrunner.SavedModelConfig;
import org.tensorflow.framework.ConfigProto;
import org.tensorflow.framework.GPUOptions;
import java.io.File;
import java.util.Arrays;
@ -39,12 +48,25 @@ import static org.junit.Assert.assertNotNull;
public class GraphRunnerTest {
public static ConfigProto getConfig(){
String backend = Nd4j.getExecutioner().getEnvironmentInformation().getProperty("backend");
if("CUDA".equalsIgnoreCase(backend)) {
org.tensorflow.framework.ConfigProto configProto = org.tensorflow.framework.ConfigProto.getDefaultInstance();
ConfigProto.Builder b = configProto.toBuilder().addDeviceFilters(TensorflowConversion.defaultDeviceForThread());
return b.setGpuOptions(GPUOptions.newBuilder()
.setAllowGrowth(true)
.setPerProcessGpuMemoryFraction(0.5)
.build()).build();
}
return null;
}
@Test
public void testGraphRunner() throws Exception {
List<String> inputs = Arrays.asList("input_0","input_1");
byte[] content = IOUtils.toByteArray(new ClassPathResource("/tf_graphs/nd4j_convert/simple_graph/frozen_model.pb").getInputStream());
try(GraphRunner graphRunner = new GraphRunner(content,inputs)) {
try(GraphRunner graphRunner = GraphRunner.builder().graphBytes(content).inputNames(inputs).sessionOptionsConfigProto(getConfig()).build()) {
runGraphRunnerTest(graphRunner);
}
}
@ -52,8 +74,9 @@ public class GraphRunnerTest {
@Test
public void testGraphRunnerFilePath() throws Exception {
List<String> inputs = Arrays.asList("input_0","input_1");
File file = new ClassPathResource("/tf_graphs/nd4j_convert/simple_graph/frozen_model.pb").getFile();
try(GraphRunner graphRunner = new GraphRunner(file.getAbsolutePath(),inputs)) {
byte[] content = FileUtils.readFileToByteArray(Resources.asFile("/tf_graphs/nd4j_convert/simple_graph/frozen_model.pb"));
try(GraphRunner graphRunner = GraphRunner.builder().graphBytes(content).inputNames(inputs).sessionOptionsConfigProto(getConfig()).build()) {
runGraphRunnerTest(graphRunner);
}
}
@ -62,37 +85,42 @@ public class GraphRunnerTest {
public void testInputOutputResolution() throws Exception {
ClassPathResource lenetPb = new ClassPathResource("tf_graphs/lenet_frozen.pb");
byte[] content = IOUtils.toByteArray(lenetPb.getInputStream());
GraphRunner graphRunner = new GraphRunner(content,Arrays.asList("Reshape/tensor"));
assertEquals(1,graphRunner.getInputOrder().size());
assertEquals(1,graphRunner.getOutputOrder().size());
List<String> inputs = Arrays.asList("Reshape/tensor");
try(GraphRunner graphRunner = GraphRunner.builder().graphBytes(content).inputNames(inputs).sessionOptionsConfigProto(getConfig()).build()) {
assertEquals(1, graphRunner.getInputOrder().size());
assertEquals(1, graphRunner.getOutputOrder().size());
}
}
@Test @Ignore //Ignored 2019/02/05: ssd_inception_v2_coco_2019_01_28 does not exist in test resources
public void testMultiOutputGraph() throws Exception {
ClassPathResource classPathResource = new ClassPathResource("/tf_graphs/examples/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb");
GraphRunner graphRunner = new GraphRunner(classPathResource.getFile().getAbsolutePath(),Arrays.asList("image_tensor"));
String[] outputs = new String[] { "detection_boxes", "detection_scores", "detection_classes", "num_detections"};
List<String> inputs = Arrays.asList("image_tensor");
byte[] content = IOUtils.toByteArray(new ClassPathResource("/tf_graphs/examples/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb").getInputStream());
try(GraphRunner graphRunner = GraphRunner.builder().graphBytes(content).inputNames(inputs).sessionOptionsConfigProto(getConfig()).build()) {
String[] outputs = new String[]{"detection_boxes", "detection_scores", "detection_classes", "num_detections"};
assertEquals(1,graphRunner.getInputOrder().size());
System.out.println(graphRunner.getOutputOrder());
assertEquals(4,graphRunner.getOutputOrder().size());
assertEquals(1, graphRunner.getInputOrder().size());
System.out.println(graphRunner.getOutputOrder());
assertEquals(4, graphRunner.getOutputOrder().size());
}
}
private void runGraphRunnerTest(GraphRunner graphRunner) throws Exception {
org.tensorflow.framework.ConfigProto.Builder builder = org.tensorflow.framework.ConfigProto.newBuilder();
String json = graphRunner.sessionOptionsToJson();
JsonFormat.parser().merge(json,builder);
org.tensorflow.framework.ConfigProto build = builder.build();
assertEquals(build,graphRunner.getProtoBufConfigProto());
if( json != null ) {
org.tensorflow.framework.ConfigProto.Builder builder = org.tensorflow.framework.ConfigProto.newBuilder();
JsonFormat.parser().merge(json, builder);
org.tensorflow.framework.ConfigProto build = builder.build();
assertEquals(build,graphRunner.getSessionOptionsConfigProto());
}
assertNotNull(graphRunner.getInputOrder());
assertNotNull(graphRunner.getOutputOrder());
org.tensorflow.framework.ConfigProto configProto1 = GraphRunner.fromJson(json);
org.tensorflow.framework.ConfigProto configProto1 = json == null ? null : GraphRunner.fromJson(json);
assertEquals(graphRunner.getProtoBufConfigProto(),configProto1);
assertEquals(graphRunner.getSessionOptionsConfigProto(),configProto1);
assertEquals(2,graphRunner.getInputOrder().size());
assertEquals(1,graphRunner.getOutputOrder().size());
@ -125,15 +153,31 @@ public class GraphRunnerTest {
.signatureKey("incr_counter_by")
.modelTag("serve")
.build();
try(GraphRunner graphRunner = new GraphRunner(savedModelConfig)) {
try(GraphRunner graphRunner = GraphRunner.builder().savedModelConfig(savedModelConfig).sessionOptionsConfigProto(getConfig()).build()) {
INDArray delta = Nd4j.create(new float[] { 42 }, new long[0]);
Map<String,INDArray> inputs = new LinkedHashMap<>();
inputs.put("delta",delta);
inputs.put("delta:0",delta);
Map<String,INDArray> outputs = graphRunner.run(inputs);
assertEquals(1, outputs.size());
INDArray output = outputs.get("output");
System.out.println(Arrays.toString(outputs.keySet().toArray(new String[0])));
INDArray output = outputs.values().toArray(new INDArray[0])[0];
assertEquals(42.0, output.getDouble(0), 0.0);
}
}
@Test
public void testGraphRunnerCast() {
INDArray arr = Nd4j.linspace(1,4,4).castTo(DataType.FLOAT);
TF_Tensor tensor = TensorflowConversion.getInstance().tensorFromNDArray(arr);
TF_Tensor tf_tensor = GraphRunner.castTensor(tensor, TensorDataType.FLOAT,TensorDataType.DOUBLE);
INDArray doubleNDArray = TensorflowConversion.getInstance().ndArrayFromTensor(tf_tensor);
TestCase.assertEquals(DataType.DOUBLE,doubleNDArray.dataType());
arr = arr.castTo(DataType.INT);
tensor = TensorflowConversion.getInstance().tensorFromNDArray(arr);
tf_tensor = GraphRunner.castTensor(tensor, TensorDataType.fromNd4jType(DataType.INT),TensorDataType.DOUBLE);
doubleNDArray = TensorflowConversion.getInstance().ndArrayFromTensor(tf_tensor);
TestCase.assertEquals(DataType.DOUBLE,doubleNDArray.dataType());
}
}

View File

@ -1,33 +0,0 @@
/*******************************************************************************
* Copyright (c) 2015-2018 Skymind, Inc.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* SPDX-License-Identifier: Apache-2.0
******************************************************************************/
package org.nd4j.tensorflow.conversion;
import org.junit.Test;
import org.nd4j.tensorflow.conversion.graphrunner.GraphRunner;
import org.tensorflow.framework.ConfigProto;
import static junit.framework.TestCase.assertTrue;
public class GpuDeviceAlignmentTest {
@Test
public void testDeviceAlignment() {
ConfigProto configProto = GraphRunner.getAlignedWithNd4j();
assertTrue(configProto.getDeviceFilters(0).contains("gpu"));
}
}

View File

@ -1,5 +1,6 @@
/*******************************************************************************
/* ******************************************************************************
* Copyright (c) 2015-2018 Skymind, Inc.
* Copyright (c) 2019 Konduit K.K.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
@ -18,7 +19,6 @@ package org.nd4j.tensorflow.conversion;
import org.nd4j.shade.protobuf.util.JsonFormat;
import org.apache.commons.io.IOUtils;
import org.junit.Ignore;
import org.junit.Test;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
@ -28,6 +28,7 @@ import org.tensorflow.framework.ConfigProto;
import org.tensorflow.framework.GPUOptions;
import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
@ -36,34 +37,34 @@ import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@Ignore("AB 2019/05/24 - Failing on CI - no jnitensorflow in java.library.path - see issue #7657")
public class GpuGraphRunnerTest {
@Test
public void testGraphRunner() throws Exception {
File f = new ClassPathResource("/tf_graphs/nd4j_convert/simple_graph/frozen_model.pb").getFile();
byte[] content = IOUtils.toByteArray(new FileInputStream(new File("C:\\Users\\fariz\\code\\dl4j-test-resources\\src\\main\\resources\\tf_graphs\\nd4j_convert\\simple_graph\\frozen_model.pb")));
//byte[] content = IOUtils.toByteArray(new ClassPathResource("/tf_graphs/nd4j_convert/simple_graph/frozen_model.pb").getInputStream());
List<String> inputNames = Arrays.asList("input_0","input_1");
ConfigProto configProto = ConfigProto.newBuilder()
.setGpuOptions(GPUOptions.newBuilder()
.setPerProcessGpuMemoryFraction(0.01)
.setPerProcessGpuMemoryFraction(0.1)
.setAllowGrowth(false)
.build())
.build();
try(GraphRunner graphRunner = new GraphRunner(f.getAbsolutePath(), inputNames, configProto)) {
try(GraphRunner graphRunner = GraphRunner.builder().graphBytes(content).inputNames(inputNames).sessionOptionsConfigProto(configProto).build()) {
org.tensorflow.framework.ConfigProto.Builder builder = org.tensorflow.framework.ConfigProto.newBuilder();
String json = graphRunner.sessionOptionsToJson();
JsonFormat.parser().merge(json,builder);
org.tensorflow.framework.ConfigProto build = builder.build();
assertEquals(build,graphRunner.getProtoBufConfigProto());
assertEquals(build,graphRunner.getSessionOptionsConfigProto());
assertNotNull(graphRunner.getInputOrder());
assertNotNull(graphRunner.getOutputOrder());
org.tensorflow.framework.ConfigProto configProto1 = GraphRunner.fromJson(json);
assertEquals(graphRunner.getProtoBufConfigProto(),configProto1);
assertEquals(graphRunner.getSessionOptionsConfigProto(),configProto1);
assertEquals(2,graphRunner.getInputOrder().size());
assertEquals(1,graphRunner.getOutputOrder().size());
@ -83,9 +84,4 @@ public class GpuGraphRunnerTest {
}
}
}

View File

@ -45,9 +45,20 @@
<artifactId>tensorflow</artifactId>
<version>${tensorflow.javacpp.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>tensorflow-platform</artifactId>
<version>${tensorflow.javacpp.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

View File

@ -0,0 +1,131 @@
/* ******************************************************************************
* Copyright (c) 2015-2018 Skymind, Inc.
* Copyright (c) 2019 Konduit K.K.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* SPDX-License-Identifier: Apache-2.0
******************************************************************************/
package org.nd4j.tensorflow.conversion;
import org.nd4j.linalg.api.buffer.DataType;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.compression.CompressedDataBuffer;
import org.nd4j.linalg.compression.CompressionDescriptor;
public enum TensorDataType {
INVALID,
FLOAT,
DOUBLE,
INT32,
UINT8,
INT16,
INT8,
STRING,
COMPLEX64,
INT64,
BOOL,
QINT8,
QUINT8,
QINT32,
BFLOAT16,
QINT16,
QUINT16,
UINT16,
COMPLEX128,
HALF,
RESOURCE,
VARIANT,
UINT32,
UINT64;
/**
* Map a tensor data type to a proto value found in tensorflow.
* Generally, this is just replacing DT_ with empty
* and returning enum.valueOf(string)
* @param value the input string
* @return the associated {@link TensorDataType}
*/
public static TensorDataType fromProtoValue(String value) {
String valueReplace = value.replace("DT_","");
return TensorDataType.valueOf(valueReplace);
}
/**
* Get the python name for the given data type
* @param tensorDataType the python name for the given data type
* @return float64 for double, float32 for double, float16 for half, otherwise
* the type's name converted to lower case
*/
public static String toPythonName(TensorDataType tensorDataType) {
switch(tensorDataType) {
case DOUBLE: return "float64";
case FLOAT: return "float32";
case HALF: return "float16";
default: return tensorDataType.name().toLowerCase();
}
}
public static DataType toNd4jType(TensorDataType tensorDataType) {
switch(tensorDataType) {
case FLOAT: return DataType.FLOAT;
case DOUBLE: return DataType.DOUBLE;
case BOOL: return DataType.BOOL;
case INT32: return DataType.INT;
case INT64: return DataType.LONG;
case STRING: return DataType.UTF8;
case HALF: return DataType.HALF;
default: throw new IllegalArgumentException("Unsupported type " + tensorDataType.name());
}
}
public static TensorDataType fromNd4jType(DataType dataType) {
switch(dataType) {
case FLOAT: return TensorDataType.FLOAT;
case LONG: return TensorDataType.INT64;
case INT: return TensorDataType.INT32;
case BOOL: return TensorDataType.BOOL;
case DOUBLE: return TensorDataType.DOUBLE;
case HALF: return TensorDataType.HALF;
case UTF8: return TensorDataType.STRING;
case COMPRESSED: throw new IllegalStateException("Unable to work with compressed data type. Could be 1 or more types.");
case SHORT: return TensorDataType.INT16;
default: throw new IllegalArgumentException("Unknown data type " + dataType);
}
}
public static TensorDataType fromNd4jType(INDArray array) {
DataType dataType = array.dataType();
switch(dataType) {
case COMPRESSED:
CompressedDataBuffer compressedData = (CompressedDataBuffer) array.data();
CompressionDescriptor desc = compressedData.getCompressionDescriptor();
String algo = desc.getCompressionAlgorithm();
switch (algo) {
case "FLOAT16": return HALF;
case "INT8": return INT8;
case "UINT8": return UINT8;
case "INT16": return INT16;
case "UINT16": return UINT16;
default: throw new IllegalArgumentException("Unsupported compression algorithm: " + algo);
}
default: return fromNd4jType(dataType);
}
}
}

View File

@ -239,7 +239,8 @@ public class TensorflowConversion {
DataBuffer d = Nd4j.createBuffer(indexer.pointer(),nd4jType,length,indexer);
array = Nd4j.create(d,ndShape);
}
Nd4j.getAffinityManager().tagLocation(array, AffinityManager.Location.HOST);
// we don't need this in this case. Device memory will be updated right in the constructor
//Nd4j.getAffinityManager().tagLocation(array, AffinityManager.Location.HOST);
return array;
}

View File

@ -0,0 +1,17 @@
import tensorflow as tf
dtypes = [tf.float16,tf.float32,tf.float64,tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8,tf.uint16,tf.uint32,tf.uint64]
# Quick solution from https://stackoverflow.com/questions/5360220/how-to-split-a-list-into-pairs-in-all-possible-ways :)
import itertools
def all_pairs(lst):
return [(x,y) for x in dtypes for y in dtypes]
for item in all_pairs(dtypes):
from_dtype, out_dtype = item
tf.reset_default_graph()
input = tf.placeholder(name='input',dtype=from_dtype)
result = tf.cast(input,name='cast_output',dtype=out_dtype)
with tf.Session() as session:
tf.train.write_graph(tf.get_default_graph(),logdir='.',name='cast_' + from_dtype.name + '_' + out_dtype.name + '.pb',as_text=True)

View File

@ -0,0 +1,5 @@
0
input Placeholder*
shape:*
dtype0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
shape:*
dtype0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
dtype0*
shape:"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0 *
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
shape:*
dtype0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
dtype0*
shape:"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0 *
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
DstT0*
SrcT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
DstT0*
SrcT0 "

View File

@ -0,0 +1,5 @@
0
input Placeholder*
dtype0 *
shape:"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0 *
shape:
2
cast_outputCastinput*
SrcT0 *
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0 *
SrcT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
dtype0*
shape:"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
DstT0*
SrcT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0 "

View File

@ -0,0 +1,11 @@
0
input Placeholder*
dtype0*
shape:
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,5 @@
0
input Placeholder*
dtype0*
shape:"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

View File

@ -0,0 +1,11 @@
0
input Placeholder*
shape:*
dtype0
2
cast_outputCastinput*
SrcT0*
DstT0"

Some files were not shown because too many files have changed in this diff Show More