| 223 | }; |
| 224 | |
| 225 | TEST_F(LayoutOptimizerTest, Conv2DBackpropInput) { |
| 226 | tensorflow::Scope s = tensorflow::Scope::NewRootScope(); |
| 227 | auto conv = SimpleConv2DBackpropInput(&s, 7, 2, "EXPLICIT"); |
| 228 | Output fetch = ops::Identity(s.WithOpName("Fetch"), {conv}); |
| 229 | GrapplerItem item; |
| 230 | TF_CHECK_OK(s.ToGraphDef(&item.graph)); |
| 231 | LayoutOptimizer optimizer; |
| 232 | GraphDef output; |
| 233 | |
| 234 | Status status = optimizer.Optimize(virtual_cluster_.get(), item, &output); |
| 235 | NodeMap node_map(&output); |
| 236 | string input_name = "Conv2DBackpropInput-0-LayoutOptimizer"; |
| 237 | auto input_sizes_node = node_map.GetNode(input_name); |
| 238 | CHECK(input_sizes_node); |
| 239 | auto conv2d_backprop_node = node_map.GetNode("Conv2DBackpropInput"); |
| 240 | CHECK(conv2d_backprop_node); |
| 241 | EXPECT_EQ(input_name, conv2d_backprop_node->input(0)); |
| 242 | auto input_sizes = GetAttrValue(*input_sizes_node); |
| 243 | Tensor input_sizes_expected(DT_INT32, {4}); |
| 244 | test::FillValues<int>(&input_sizes_expected, {128, 3, 7, 7}); |
| 245 | test::ExpectTensorEqual<int>(input_sizes_expected, input_sizes); |
| 246 | |
| 247 | if (gpu_available_) { |
| 248 | TensorShape filter_shape = GetAttrShape(*node_map.GetNode("Filter")); |
| 249 | Tensor filter_data = GenerateRandomTensor<DT_FLOAT>(filter_shape); |
| 250 | std::vector<string> fetch = {"Fetch"}; |
| 251 | auto tensors_expected = |
| 252 | EvaluateNodes(item.graph, fetch, {{"Filter", filter_data}}); |
| 253 | auto tensors = EvaluateNodes(output, fetch, {{"Filter", filter_data}}); |
| 254 | EXPECT_EQ(1, tensors_expected.size()); |
| 255 | EXPECT_EQ(1, tensors.size()); |
| 256 | test::ExpectTensorNear<float>(tensors_expected[0], tensors[0], 1e-6); |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | TEST_F(LayoutOptimizerTest, Conv2DBackpropInputNonConstInputSizes) { |
| 261 | tensorflow::Scope s = tensorflow::Scope::NewRootScope(); |
nothing calls this directly
no test coverage detected