def parse_param_file(param_file, return_shape=True): from paddle.fluid.proto.framework_pb2 import VarType f = open(param_file, 'rb') version = np.fromstring(f.read(4), dtype='int32') lod_level = np.fromstring(f.read(8), dtype='int64') for i in range(int(lod_level)): _size = np.fromstring(f.read(8), dtype='int64') _ = f.read(_size) version = np.fromstring(f.read(4), dtype='int32') tensor_desc = VarType.TensorDesc() tensor_desc_size = np.fromstring(f.read(4), dtype='int32') tensor_desc.ParseFromString(f.read(int(tensor_desc_size))) tensor_shape = tuple(tensor_desc.dims) if return_shape: f.close() return tuple(tensor_desc.dims) if tensor_desc.data_type != 5: raise Exception( "Unexpected data type while parse {}".format(param_file)) data_size = 4 for i in range(len(tensor_shape)): data_size *= tensor_shape[i] weight = np.fromstring(f.read(data_size), dtype='float32') f.close() return np.reshape(weight, tensor_shape)
def parse_shape_from_file(filename): with open(filename, "rb") as file: version = file.read(4) lod_level = to_int(file.read(8), dest="Q") for i in range(lod_level): _size = to_int(file.read(8), dest="Q") _ = file.read(_size) version = file.read(4) tensor_desc_size = to_int(file.read(4)) tensor_desc = VarType.TensorDesc() tensor_desc.ParseFromString(file.read(tensor_desc_size)) return tuple(tensor_desc.dims)