in mmdnn/conversion/caffe/graph.py [0:0]
def process_train_proto(self):
layers = self.model.layer or self.model.layers
delete_layer = set()
split_op_map = dict()
loss_layers = [layer for layer in layers if NodeKind.map_raw_kind(layer.type) in (NodeKind.SoftmaxWithLoss, NodeKind.SigmoidCrossEntropyLoss)]
a = [layers.remove(layer) for layer in layers[:] if layer in loss_layers[:-1] or NodeKind.map_raw_kind(layer.type) in LAYER_IN_TRAIN_PROTO]
for layer in layers[:]:
if 'label' in layer.bottom:
if NodeKind.map_raw_kind(layer.type) in (NodeKind.SoftmaxWithLoss, NodeKind.SigmoidCrossEntropyLoss):
continue
elif NodeKind.map_raw_kind(layer.type) == NodeKind.Split:
for item in layer.top:
delete_layer.add(item)
layers.remove(layer)
elif NodeKind.map_raw_kind(layer.type) == NodeKind.Split:
for item in layer.top:
split_op_map[item] = layer.bottom[0]
layers.remove(layer)
for layer in layers[:]:
for item in delete_layer:
if item in layer.bottom:
layers.remove(layer)
break
for key, value in split_op_map.items():
if key in layer.bottom:
layer.bottom.remove(key)
layer.bottom.append(value)
self.model.input.append('data')
self.model.input_dim.extend(self.input_shape)
last_layer = layers[-1]
kind = NodeKind.map_raw_kind(last_layer.type)
if kind in (NodeKind.SoftmaxWithLoss, NodeKind.SigmoidCrossEntropyLoss):
pred = layers.add()
pred.name = 'prob'
pred.top.append('prob')
pred.bottom.append(last_layer.bottom[0])
if kind == NodeKind.SoftmaxWithLoss:
pred.type = NodeKind.Softmax if self.model.layer else 20 # competiable with old version caffe proto
elif kind == NodeKind.SigmoidCrossEntropyLoss:
pred.type = NodeKind.Sigmoid if self.model.layer else 19
layers.remove(last_layer)