optimizer minimize loss时报错,无具体错误信息
收藏
0
收藏
全部评论(4)
def build_adjacency_edge_features(self, image, vertex_features, graph_node_features):
"""
Build adjacency edge features, feature is gathered from node features and relative distance
:param graph_node_features: Node features (Shape of [batch, max_vertices, node_feature_size])
:return: Adjacency edge features (Shape of [batch, max_vertices, max_vertices, edge_feature_size])
"""
x = fluid.layers.expand(
fluid.layers.unsqueeze(fluid.layers.range(0, self.max_vertices, 1, dtype="int32"), axes=[0, 1]),
expand_times=[self.batch_size, self.max_vertices, 1]) # [batch, max_vertices, max_vertices]
y = fluid.layers.unsqueeze(fluid.layers.range(0, self.batch_size, 1, dtype="int32"), axes=[1])
y = fluid.layers.expand(y, expand_times=[1, self.max_vertices]) # [batch, max_vertices]
batch_range = fluid.layers.expand(fluid.layers.unsqueeze(y, axes=[-1]),
expand_times=[1, 1, self.max_vertices]) # [batch, max_vertices, max_vertices]
indexing_tensor = fluid.layers.concat(
[fluid.layers.unsqueeze(batch_range, axes=[-1]), fluid.layers.unsqueeze(x, axes=[-1])],
axis=-1) # [batch, max_vertices, max_vertices, 2]
x_axis_graph_node_features = fluid.layers.gather_nd(graph_node_features,
indexing_tensor) # [batch, max_vertices, max_vertices, features]
expand_graph_node_features = fluid.layers.unsqueeze(graph_node_features, axes=[2]) # [batch, max_vertices, 1, features]
y_axis_graph_node_features = fluid.layers.expand(expand_graph_node_features,
expand_times=[1, 1, self.max_vertices, 1])
adjacency_edge_features = fluid.layers.concat([x_axis_graph_node_features, y_axis_graph_node_features], axis=-1)
# 计算节点之间的相对位置
_, image_height, image_width, _ = image.shape
pos_x1 = vertex_features[:, :, self.dim_vertex_x_position]
pos_y1 = vertex_features[:, :, self.dim_vertex_y_position]
pos_x2 = vertex_features[:, :, self.dim_vertex_x2_position]
pos_y2 = vertex_features[:, :, self.dim_vertex_y2_position]
rel_x1 = fluid.layers.elementwise_sub(fluid.layers.expand(
fluid.layers.unsqueeze(pos_x1, axes=[-1]), (1, 1, self.max_vertices)),
fluid.layers.expand(
fluid.layers.unsqueeze(pos_x1, axes=[1]), (1, self.max_vertices, 1))) / float(image_width)
rel_y1 = fluid.layers.elementwise_sub(fluid.layers.expand(
fluid.layers.unsqueeze(pos_y1, axes=[-1]), (1, 1, self.max_vertices)),
fluid.layers.expand(
fluid.layers.unsqueeze(pos_y1, axes=[1]), (1, self.max_vertices, 1))) / float(image_height)
rel_x2 = fluid.layers.elementwise_sub(fluid.layers.expand(
fluid.layers.unsqueeze(pos_x2, axes=[-1]), (1, 1, self.max_vertices)),
fluid.layers.expand(
fluid.layers.unsqueeze(pos_x2, axes=[1]), (1, self.max_vertices, 1))) / float(image_width)
rel_y2 = fluid.layers.elementwise_sub(fluid.layers.expand(
fluid.layers.unsqueeze(pos_y2, axes=[-1]), (1, 1, self.max_vertices)),
fluid.layers.expand(
fluid.layers.unsqueeze(pos_y2, axes=[1]), (1, self.max_vertices, 1))) / float(image_height)
relative_pos = fluid.layers.concat([fluid.layers.unsqueeze(rel_x1, axes=[3]),
fluid.layers.unsqueeze(rel_y1, axes=[3]),
fluid.layers.unsqueeze(rel_x2, axes=[3]),
fluid.layers.unsqueeze(rel_y2, axes=[3])], axis=-1)
adjacency_edge_features = fluid.layers.concat([adjacency_edge_features, relative_pos], axis=-1)
return adjacency_edge_features
def gather_feature_from_conv_head(self, image_features, vertex_features, scale_y, scale_x):
"""
Select vertex image feature from convolution feature map
:param image_features:
:param vertex_features:
:param scale_y:
:param scale_x:
:return:
"""
image_features = fluid.layers.transpose(image_features, perm=[0, 2, 3, 1])
logging.info("Shape of transpose image_features: {}".format(image_features.shape))
vertices_y = vertex_features[:, :, self.dim_vertex_y_position]
vertices_x = vertex_features[:, :, self.dim_vertex_x_position]
vertices_y2 = vertex_features[:, :, self.dim_vertex_y2_position]
vertices_x2 = vertex_features[:, :, self.dim_vertex_x2_position]
vertices_y = fluid.layers.cast(vertices_y, "float32") * scale_y
vertices_x = fluid.layers.cast(vertices_x, "float32") * scale_x
vertices_y2 = fluid.layers.cast(vertices_y2, "float32") * scale_y
vertices_x2 = fluid.layers.cast(vertices_x2, "float32") * scale_x
batch_size, max_vertices = vertices_y.shape
batch_size, max_vertices = int(batch_size), int(max_vertices)
batch_range = fluid.layers.unsqueeze(fluid.layers.range(0, batch_size, 1, dtype="float32"), axes=[1, 2])
batch_range = fluid.layers.expand(batch_range, expand_times=[1, max_vertices, 1])
indexing_tensor = fluid.layers.concat(
[batch_range,
fluid.layers.unsqueeze(fluid.layers.elementwise_add(vertices_y, vertices_y2) / 2, axes=[2]),
fluid.layers.unsqueeze(fluid.layers.elementwise_add(vertices_x, vertices_x2) / 2, axes=[2])], axis=-1)
indexing_tensor = fluid.layers.cast(indexing_tensor, "int64")
return fluid.layers.gather_nd(image_features, indexing_tensor)
def edge_conv_layer(input_feature,
num_neighbors=30,
dense_layers=(64, 64, 64),
aggregation_function=fluid.layers.reduce_max,
edge_activation=None):
# Shape of indexing: (batch_size, n_max_entries, k, 2)
indexing, _ = get_indexing_tensor(input_feature, num_neighbors)
# Shape of neighbour_space: (batch_size, n_max_entries, k, input_feature.shape[-1])
neighbour_space = fluid.layers.gather_nd(input_feature, indexing)
# Shape of expanded_input_feature: (batch_size, n_max_entries, 1, input_feature.shape[-1])
expanded_input_feature = fluid.layers.unsqueeze(input_feature, axes=[2])
expanded_input_feature = fluid.layers.expand(expanded_input_feature, [1, 1, num_neighbors, 1])
diff = expanded_input_feature - neighbour_space
edge = fluid.layers.concat([expanded_input_feature, diff], axis=-1)
for units in dense_layers:
edge = fluid.layers.fc(edge, units, num_flatten_dims=3, act="relu")
if edge_activation is not None:
edge = edge_activation(edge)
output_feature = aggregation_function(edge, dim=2)
return output_feature
共这三处用到了gather_nd函数
0
可以试下在以下代码中的gather_nd
前加上indexing_tensor.stop_gradient=True
indexing_tensor = fluid.layers.concat(
[batch_range,
fluid.layers.unsqueeze(fluid.layers.elementwise_add(vertices_y, vertices_y2) / 2, axes=[2]),
fluid.layers.unsqueeze(fluid.layers.elementwise_add(vertices_x, vertices_x2) / 2, axes=[2])], axis=-1)
indexing_tensor = fluid.layers.cast(indexing_tensor, "int64")
return fluid.layers.gather_nd(image_features, indexing_tensor)
0
请登录后评论
版本、环境信息:
1)PaddlePaddle版本:1.6.2
2)python:3.6.3
训练信息
1)单机单卡
在minimize total loss时报错