コード例 #1
0
def _install_test_layer(op_type, parameters, weights, input_data):
    para_cls_id = 'Cntk' + op_type + 'Parameters'
    para_instance = eval('.'.join(('cntkmodel', para_cls_id)))()
    for key, value in parameters.items():
        setattr(para_instance, key, value)
    layer_def = cntkmodel.CntkLayersDefinition()
    layer_def.parameters = para_instance
    layer_def.op_type = getattr(cntkmodel.CntkLayerType, utils.format.camel_to_snake(op_type))
    layer_def.op_name = '_'.join(('test', op_type))
    layer_def.parameter_tensor = []
    if weights is not None:
        for weight in weights:
            weight_tensor = cntkmodel.CntkTensorDefinition()
            weight_tensor.tensor = np.array(weight).shape
            weight_tensor.data = weight
            layer_def.parameter_tensor.append(weight_tensor)
    inputs_variable = []
    for input_tensor in input_data:
        inputs_variable.append(cntk.input(input_tensor.shape))
    return layer_def, inputs_variable
コード例 #2
0
    def _adapt_parameter_data(self):
        sys.stdout.write('start parameter loading...\n')
        start_time = time.time()
        caffe_impl = caffeimpl.CaffeResolver()
        if caffe_impl.runtime():
            paras = caffe_impl.caffe.Net(self._source_solver.model_path,
                                         self._source_solver.weights_path,
                                         caffe_impl.caffe.TEST).params
            caffe_blobs = [(layer_name, map(lambda blobs: blobs.data,
                                            blob_vec))
                           for layer_name, blob_vec in paras.items()]
        else:
            sys.stdout.write(
                'loading weights via protopb, may take longer time than runtime'
            )
            params = caffe_impl.net()
            params.MergeFromString(
                open(self._source_solver.weights_path, 'rb').read())
            params_layers = params.layer or params.layers
            caffe_blobs = [(layer.name, [blob.data for blob in layer.blobs])
                           for layer in params_layers if layer.blobs]
        sys.stdout.write('finished loading, total time: %d\n' %
                         (time.time() - start_time))

        # mapping the script into layers
        sys.stdout.write('start parameter matching...\n')
        for caffe_blob in caffe_blobs:
            try:
                cntk_layer = self._uni_model.cntk_layers[caffe_blob[0]]
            except KeyError:
                caffe_layers = self._raw_net.layer or self._raw_net.layers
                try:
                    special_layer = [
                        layer for layer in caffe_layers
                        if layer.name == caffe_blob[0]
                    ][0]
                    if special_layer.type == 'Scale':
                        previous_layer = [
                            caffe_layers[i - 1]
                            for i in range(len(caffe_layers))
                            if caffe_layers[i] == special_layer
                        ][0]
                        if previous_layer.type != 'BatchNorm':
                            raise AssertionError(
                                'un-support pure Scale layer without BN in %s'
                                % caffe_layers.name)
                        cntk_layer = self._uni_model.cntk_layers[
                            previous_layer.name]
                    else:
                        raise AssertionError(
                            'un-match layer name %s while matching parameters\n'
                            % caffe_blob.name)
                except IndexError:
                    sys.stderr.write(
                        'ignore weights for %s, since not contained in graph\n'
                        % caffe_blob[0])
            for blob in caffe_blob[1]:
                cntk_parameter_tensor = cntkmodel.CntkTensorDefinition()
                cntk_parameter_tensor.data = blob
                cntk_layer.parameter_tensor.append(cntk_parameter_tensor)
        sys.stdout.write('finished matching.\n')