| | |
| | """ |
| | PyTorch ์ฒดํฌํฌ์ธํธ์์ ๊ฐ์ค์น๋ฅผ ์ถ์ถํ์ฌ binary ํ์์ผ๋ก ์ ์ฅ |
| | """ |
| | import torch |
| | import numpy as np |
| | import struct |
| | import sys |
| | from pathlib import Path |
| |
|
| | def extract_weights(checkpoint_path, output_path): |
| | """์ฒดํฌํฌ์ธํธ์์ ๊ฐ์ค์น ์ถ์ถ""" |
| | print(f"Loading checkpoint: {checkpoint_path}") |
| | checkpoint = torch.load(checkpoint_path, map_location='cpu') |
| | |
| | |
| | if 'model_state_dict' in checkpoint: |
| | state_dict = checkpoint['model_state_dict'] |
| | elif 'state_dict' in checkpoint: |
| | state_dict = checkpoint['state_dict'] |
| | else: |
| | state_dict = checkpoint |
| | |
| | print(f"Found {len(state_dict)} parameters") |
| | |
| | |
| | with open(output_path, 'wb') as f: |
| | |
| | f.write(b'LCNN') |
| | f.write(struct.pack('I', 1)) |
| | |
| | |
| | f.write(struct.pack('I', len(state_dict))) |
| | |
| | for name, param in state_dict.items(): |
| | print(f" {name}: {param.shape}") |
| | |
| | |
| | name_bytes = name.encode('utf-8')[:256] |
| | f.write(struct.pack('I', len(name_bytes))) |
| | f.write(name_bytes) |
| | |
| | |
| | data = param.cpu().numpy().astype(np.float32) |
| | |
| | |
| | ndim = len(data.shape) |
| | f.write(struct.pack('I', ndim)) |
| | for dim in data.shape: |
| | f.write(struct.pack('I', dim)) |
| | |
| | |
| | data_flat = data.flatten('C') |
| | f.write(struct.pack(f'{len(data_flat)}f', *data_flat)) |
| | |
| | print(f"\nWeights saved to: {output_path}") |
| | print(f"File size: {Path(output_path).stat().st_size / 1024 / 1024:.2f} MB") |
| |
|
| | if __name__ == '__main__': |
| | checkpoint_path = sys.argv[1] if len(sys.argv) > 1 else '~/mycnn/checkpoints/LiteCNNPro_best.pth' |
| | output_path = sys.argv[2] if len(sys.argv) > 2 else './model_weights.bin' |
| | |
| | checkpoint_path = Path(checkpoint_path).expanduser() |
| | extract_weights(checkpoint_path, output_path) |
| |
|