From 324e007c82dd0655fb7a20e5694330b49243bf28 Mon Sep 17 00:00:00 2001 From: yuvraj333 Date: Tue, 14 Oct 2025 14:31:56 +0545 Subject: [PATCH 1/2] Add GNN code and configurations --- .gitignore | 4 + README.md | 119 +- config/global_cfg.yaml | 13 + config/test_setting1.yaml | 4 + config/test_setting2.yaml | 4 + config/test_setting3.yaml | 4 + config/test_setting4.yaml | 4 + config/train_setting.yaml | 4 + data/Cora/raw/ind.cora.allx | Bin 0 -> 257305 bytes data/Cora/raw/ind.cora.ally | Bin 0 -> 47959 bytes data/Cora/raw/ind.cora.graph | Bin 0 -> 59847 bytes data/Cora/raw/ind.cora.test.index | 1000 +++++++++++++++++ data/Cora/raw/ind.cora.tx | Bin 0 -> 148025 bytes data/Cora/raw/ind.cora.ty | Bin 0 -> 28135 bytes data/Cora/raw/ind.cora.x | Bin 0 -> 22119 bytes data/Cora/raw/ind.cora.y | Bin 0 -> 4054 bytes data/README.md | 0 eval/README.md | 0 eval/eval1.py | 181 +++ eval/evaluate.py | 603 ++++++++++ experiments/__init__.py | 0 experiments/results/README.md | 0 experiments/results/__init__.py | 0 .../results/comparative_performance.png | Bin 0 -> 39036 bytes experiments/results/false_rates.png | Bin 0 -> 26118 bytes experiments/results/results.csv | 19 + .../results/target_accuracy_vs_mask_ratio.png | Bin 0 -> 43605 bytes experiments/results/ver_acc_gat_inductive.png | Bin 0 -> 23242 bytes .../results/ver_acc_gat_transductive.png | Bin 0 -> 23638 bytes experiments/results/ver_acc_gcn_inductive.png | Bin 0 -> 22985 bytes .../results/ver_acc_gcn_transductive.png | Bin 0 -> 23955 bytes .../results/ver_acc_sage_inductive.png | Bin 0 -> 23264 bytes .../results/ver_acc_sage_transductive.png | Bin 0 -> 23856 bytes .../verification_accuracy_by_architecture.png | Bin 0 -> 31124 bytes .../verification_performance_by_setting.png | Bin 0 -> 38498 bytes experiments/scripts/__init__.py | 0 experiments/scripts/run_benign.py | 181 +++ experiments/scripts/run_main.py | 26 + experiments/scripts/run_robustness.py | 304 +++++ requirements.txt | 156 ++- src/src/__init__.py | 0 src/src/datasets/__init__.py | 0 src/src/datasets/datareader.py | 159 +++ src/src/datasets/graph_operator.py | 131 +++ src/src/extraction/__init__.py | 0 src/src/extraction/extraction_runner.py | 404 +++++++ src/src/fingerprinting/__init__.py | 0 src/src/masking/__init__.py | 0 src/src/masking/boundary.py | 191 ++++ src/src/models/__init__.py | 0 src/src/models/extraction.py | 124 ++ src/src/models/gnn.py | 168 +++ src/src/models/gnn2.py | 237 ++++ src/src/models/ownership_classifier.py | 26 + src/src/utils/__init__.py | 0 src/src/utils/config.py | 60 + src/src/verifier/__init__.py | 0 src/src/verifier/verification_cfg.py | 468 ++++++++ src/src/watermarking/__init__.py | 0 59 files changed, 4466 insertions(+), 128 deletions(-) create mode 100644 config/global_cfg.yaml create mode 100644 config/test_setting1.yaml create mode 100644 config/test_setting2.yaml create mode 100644 config/test_setting3.yaml create mode 100644 config/test_setting4.yaml create mode 100644 config/train_setting.yaml create mode 100644 data/Cora/raw/ind.cora.allx create mode 100644 data/Cora/raw/ind.cora.ally create mode 100644 data/Cora/raw/ind.cora.graph create mode 100644 data/Cora/raw/ind.cora.test.index create mode 100644 data/Cora/raw/ind.cora.tx create mode 100644 data/Cora/raw/ind.cora.ty create mode 100644 data/Cora/raw/ind.cora.x create mode 100644 data/Cora/raw/ind.cora.y create mode 100644 data/README.md create mode 100644 eval/README.md create mode 100644 eval/eval1.py create mode 100644 eval/evaluate.py create mode 100644 experiments/__init__.py create mode 100644 experiments/results/README.md create mode 100644 experiments/results/__init__.py create mode 100644 experiments/results/comparative_performance.png create mode 100644 experiments/results/false_rates.png create mode 100644 experiments/results/results.csv create mode 100644 experiments/results/target_accuracy_vs_mask_ratio.png create mode 100644 experiments/results/ver_acc_gat_inductive.png create mode 100644 experiments/results/ver_acc_gat_transductive.png create mode 100644 experiments/results/ver_acc_gcn_inductive.png create mode 100644 experiments/results/ver_acc_gcn_transductive.png create mode 100644 experiments/results/ver_acc_sage_inductive.png create mode 100644 experiments/results/ver_acc_sage_transductive.png create mode 100644 experiments/results/verification_accuracy_by_architecture.png create mode 100644 experiments/results/verification_performance_by_setting.png create mode 100644 experiments/scripts/__init__.py create mode 100644 experiments/scripts/run_benign.py create mode 100644 experiments/scripts/run_main.py create mode 100644 experiments/scripts/run_robustness.py create mode 100644 src/src/__init__.py create mode 100644 src/src/datasets/__init__.py create mode 100644 src/src/datasets/datareader.py create mode 100644 src/src/datasets/graph_operator.py create mode 100644 src/src/extraction/__init__.py create mode 100644 src/src/extraction/extraction_runner.py create mode 100644 src/src/fingerprinting/__init__.py create mode 100644 src/src/masking/__init__.py create mode 100644 src/src/masking/boundary.py create mode 100644 src/src/models/__init__.py create mode 100644 src/src/models/extraction.py create mode 100644 src/src/models/gnn.py create mode 100644 src/src/models/gnn2.py create mode 100644 src/src/models/ownership_classifier.py create mode 100644 src/src/utils/__init__.py create mode 100644 src/src/utils/config.py create mode 100644 src/src/verifier/__init__.py create mode 100644 src/src/verifier/verification_cfg.py create mode 100644 src/src/watermarking/__init__.py diff --git a/.gitignore b/.gitignore index e0afa39..117afbc 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,7 @@ dist/ #virtual environments folder .venv +temp_results/ +robustness_results/ +*.pth +*.pt diff --git a/README.md b/README.md index 2b9fa53..622d1a1 100644 --- a/README.md +++ b/README.md @@ -1,118 +1 @@ -# PyGIP - -[![PyPI - Version](https://img.shields.io/pypi/v/PyGIP)](https://pypi.org/project/PyGIP) -[![Build Status](https://img.shields.io/github/actions/workflow/status/LabRAI/PyGIP/docs.yml)](https://github.com/LabRAI/PyGIP/actions) -[![License](https://img.shields.io/github/license/LabRAI/PyGIP.svg)](https://github.com/LabRAI/PyGIP/blob/main/LICENSE) -[![PyPI - Downloads](https://img.shields.io/pypi/dm/pygip)](https://github.com/LabRAI/PyGIP) -[![Issues](https://img.shields.io/github/issues/LabRAI/PyGIP)](https://github.com/LabRAI/PyGIP) -[![Pull Requests](https://img.shields.io/github/issues-pr/LabRAI/PyGIP)](https://github.com/LabRAI/PyGIP) -[![Stars](https://img.shields.io/github/stars/LabRAI/PyGIP)](https://github.com/LabRAI/PyGIP) -[![GitHub forks](https://img.shields.io/github/forks/LabRAI/PyGIP)](https://github.com/LabRAI/PyGIP) - -PyGIP is a Python library designed for experimenting with graph-based model extraction attacks and defenses. It provides -a modular framework to implement and test attack and defense strategies on graph datasets. - -## How to Cite - -If you find it useful, please considering cite the following work: - -```bibtex -@article{li2025intellectual, - title={Intellectual Property in Graph-Based Machine Learning as a Service: Attacks and Defenses}, - author={Li, Lincan and Shen, Bolin and Zhao, Chenxi and Sun, Yuxiang and Zhao, Kaixiang and Pan, Shirui and Dong, Yushun}, - journal={arXiv preprint arXiv:2508.19641}, - year={2025} -} -``` - - -## Installation - -PyGIP supports both CPU and GPU environments. Make sure you have Python installed (version >= 3.8, <3.13). - -### Base Installation - -First, install the core package: - -```bash -pip install PyGIP -``` - -This will install PyGIP with minimal dependencies. - -### CPU Version - -```bash -pip install "PyGIP[torch,dgl]" \ - --index-url https://download.pytorch.org/whl/cpu \ - --extra-index-url https://pypi.org/simple \ - -f https://data.dgl.ai/wheels/repo.html -``` - -### GPU Version (CUDA 12.1) - -```bash -pip install "PyGIP[torch,dgl]" \ - --index-url https://download.pytorch.org/whl/cu121 \ - --extra-index-url https://pypi.org/simple \ - -f https://data.dgl.ai/wheels/torch-2.3/cu121/repo.html -``` - -## Quick Start - -Here’s a simple example to launch a Model Extraction Attack using PyGIP: - -```python -from datasets import Cora -from models.attack import ModelExtractionAttack0 - -# Load the Cora dataset -dataset = Cora() - -# Initialize the attack with a sampling ratio of 0.25 -mea = ModelExtractionAttack0(dataset, 0.25) - -# Execute the attack -mea.attack() -``` - -This code loads the Cora dataset, initializes a basic model extraction attack (`ModelExtractionAttack0`), and runs the -attack with a specified sampling ratio. - -And a simple example to run a Defense method against Model Extraction Attack: - -```python -from datasets import Cora -from models.defense import RandomWM - -# Load the Cora dataset -dataset = Cora() - -# Initialize the attack with a sampling ratio of 0.25 -med = RandomWM(dataset, 0.25) - -# Execute the defense -med.defend() -``` - -which runs the Random Watermarking Graph to defend against MEA. - -If you want to use cuda, please set environment variable: - -```shell -export PYGIP_DEVICE=cuda:0 -``` - -## Implementation & Contributors Guideline - -Refer to [Implementation Guideline](.github/IMPLEMENTATION.md) - -Refer to [Contributors Guideline](.github/CONTRIBUTING.md) - -## License - -[BSD 2-Clause License](LICENSE) - -## Contact - -For questions or contributions, please contact blshen@fsu.edu. +# gnn-ownership \ No newline at end of file diff --git a/config/global_cfg.yaml b/config/global_cfg.yaml new file mode 100644 index 0000000..cce7809 --- /dev/null +++ b/config/global_cfg.yaml @@ -0,0 +1,13 @@ +target_model: gat +target_hidden_dims: [224, 128] +dataset: Cora +train_setting: "" +test_setting: 1 +embedding_dim: 128 +train_process: "train" +test_process: "test" +n_run: 3 + +train_save_root: ../temp_results/diff/model_states/ +test_save_root: ../temp_results/diff/model_states/ +res_path: ../temp_results/diff/res/ diff --git a/config/test_setting1.yaml b/config/test_setting1.yaml new file mode 100644 index 0000000..6a49358 --- /dev/null +++ b/config/test_setting1.yaml @@ -0,0 +1,4 @@ +model_arches: ["gat", "gcn", "sage"] +layer_dims: [96, 160, 224, 288, 352] +num_hidden_layers: [2] +num_model_per_arch: 10 \ No newline at end of file diff --git a/config/test_setting2.yaml b/config/test_setting2.yaml new file mode 100644 index 0000000..109046f --- /dev/null +++ b/config/test_setting2.yaml @@ -0,0 +1,4 @@ +model_arches: ["gat", "gcn", "sage"] +layer_dims: [128, 192, 256, 320, 384] +num_hidden_layers: [1, 3] +num_model_per_arch: 10 \ No newline at end of file diff --git a/config/test_setting3.yaml b/config/test_setting3.yaml new file mode 100644 index 0000000..0c805f6 --- /dev/null +++ b/config/test_setting3.yaml @@ -0,0 +1,4 @@ +model_arches: ["gin", 'sgc'] +layer_dims: [96, 160, 224, 288, 352] +num_hidden_layers: [2] +num_model_per_arch: 15 \ No newline at end of file diff --git a/config/test_setting4.yaml b/config/test_setting4.yaml new file mode 100644 index 0000000..82f0aec --- /dev/null +++ b/config/test_setting4.yaml @@ -0,0 +1,4 @@ +model_arches: ["gin", 'sgc'] +layer_dims: [128, 192, 256, 320, 384] +num_hidden_layers: [1, 3] +num_model_per_arch: 15 \ No newline at end of file diff --git a/config/train_setting.yaml b/config/train_setting.yaml new file mode 100644 index 0000000..1a58b02 --- /dev/null +++ b/config/train_setting.yaml @@ -0,0 +1,4 @@ +model_arches: ["gat", "gcn", "sage"] +layer_dims: [96, 160, 224, 288, 352] +num_hidden_layers: [2] +num_model_per_arch: 20 # per arch \ No newline at end of file diff --git a/data/Cora/raw/ind.cora.allx b/data/Cora/raw/ind.cora.allx new file mode 100644 index 0000000000000000000000000000000000000000..44d53b1fece343538e45592caac521d73c6f98d6 GIT binary patch literal 257305 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 z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF z7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#bKF7#jHhhXxMY_waq6 G`Tqf}DSCbY literal 0 HcmV?d00001 diff --git a/data/Cora/raw/ind.cora.ally b/data/Cora/raw/ind.cora.ally new file mode 100644 index 0000000000000000000000000000000000000000..04fbd0b083d09341fcf16b395c642329637f0542 GIT binary patch literal 47959 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 My~lCyzWDTi0g%o(9smFU literal 0 HcmV?d00001 diff --git a/data/Cora/raw/ind.cora.graph b/data/Cora/raw/ind.cora.graph new file mode 100644 index 0000000000000000000000000000000000000000..4d3bf85dfc8b1c105a2c995597a1b3eed6947925 GIT binary patch literal 59847 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 A!vFvP literal 0 HcmV?d00001 diff --git a/data/Cora/raw/ind.cora.test.index b/data/Cora/raw/ind.cora.test.index new file mode 100644 index 0000000..ded8092 --- /dev/null +++ b/data/Cora/raw/ind.cora.test.index @@ -0,0 +1,1000 @@ +2692 +2532 +2050 +1715 +2362 +2609 +2622 +1975 +2081 +1767 +2263 +1725 +2588 +2259 +2357 +1998 +2574 +2179 +2291 +2382 +1812 +1751 +2422 +1937 +2631 +2510 +2378 +2589 +2345 +1943 +1850 +2298 +1825 +2035 +2507 +2313 +1906 +1797 +2023 +2159 +2495 +1886 +2122 +2369 +2461 +1925 +2565 +1858 +2234 +2000 +1846 +2318 +1723 +2559 +2258 +1763 +1991 +1922 +2003 +2662 +2250 +2064 +2529 +1888 +2499 +2454 +2320 +2287 +2203 +2018 +2002 +2632 +2554 +2314 +2537 +1760 +2088 +2086 +2218 +2605 +1953 +2403 +1920 +2015 +2335 +2535 +1837 +2009 +1905 +2636 +1942 +2193 +2576 +2373 +1873 +2463 +2509 +1954 +2656 +2455 +2494 +2295 +2114 +2561 +2176 +2275 +2635 +2442 +2704 +2127 +2085 +2214 +2487 +1739 +2543 +1783 +2485 +2262 +2472 +2326 +1738 +2170 +2100 +2384 +2152 +2647 +2693 +2376 +1775 +1726 +2476 +2195 +1773 +1793 +2194 +2581 +1854 +2524 +1945 +1781 +1987 +2599 +1744 +2225 +2300 +1928 +2042 +2202 +1958 +1816 +1916 +2679 +2190 +1733 +2034 +2643 +2177 +1883 +1917 +1996 +2491 +2268 +2231 +2471 +1919 +1909 +2012 +2522 +1865 +2466 +2469 +2087 +2584 +2563 +1924 +2143 +1736 +1966 +2533 +2490 +2630 +1973 +2568 +1978 +2664 +2633 +2312 +2178 +1754 +2307 +2480 +1960 +1742 +1962 +2160 +2070 +2553 +2433 +1768 +2659 +2379 +2271 +1776 +2153 +1877 +2027 +2028 +2155 +2196 +2483 +2026 +2158 +2407 +1821 +2131 +2676 +2277 +2489 +2424 +1963 +1808 +1859 +2597 +2548 +2368 +1817 +2405 +2413 +2603 +2350 +2118 +2329 +1969 +2577 +2475 +2467 +2425 +1769 +2092 +2044 +2586 +2608 +1983 +2109 +2649 +1964 +2144 +1902 +2411 +2508 +2360 +1721 +2005 +2014 +2308 +2646 +1949 +1830 +2212 +2596 +1832 +1735 +1866 +2695 +1941 +2546 +2498 +2686 +2665 +1784 +2613 +1970 +2021 +2211 +2516 +2185 +2479 +2699 +2150 +1990 +2063 +2075 +1979 +2094 +1787 +2571 +2690 +1926 +2341 +2566 +1957 +1709 +1955 +2570 +2387 +1811 +2025 +2447 +2696 +2052 +2366 +1857 +2273 +2245 +2672 +2133 +2421 +1929 +2125 +2319 +2641 +2167 +2418 +1765 +1761 +1828 +2188 +1972 +1997 +2419 +2289 +2296 +2587 +2051 +2440 +2053 +2191 +1923 +2164 +1861 +2339 +2333 +2523 +2670 +2121 +1921 +1724 +2253 +2374 +1940 +2545 +2301 +2244 +2156 +1849 +2551 +2011 +2279 +2572 +1757 +2400 +2569 +2072 +2526 +2173 +2069 +2036 +1819 +1734 +1880 +2137 +2408 +2226 +2604 +1771 +2698 +2187 +2060 +1756 +2201 +2066 +2439 +1844 +1772 +2383 +2398 +1708 +1992 +1959 +1794 +2426 +2702 +2444 +1944 +1829 +2660 +2497 +2607 +2343 +1730 +2624 +1790 +1935 +1967 +2401 +2255 +2355 +2348 +1931 +2183 +2161 +2701 +1948 +2501 +2192 +2404 +2209 +2331 +1810 +2363 +2334 +1887 +2393 +2557 +1719 +1732 +1986 +2037 +2056 +1867 +2126 +1932 +2117 +1807 +1801 +1743 +2041 +1843 +2388 +2221 +1833 +2677 +1778 +2661 +2306 +2394 +2106 +2430 +2371 +2606 +2353 +2269 +2317 +2645 +2372 +2550 +2043 +1968 +2165 +2310 +1985 +2446 +1982 +2377 +2207 +1818 +1913 +1766 +1722 +1894 +2020 +1881 +2621 +2409 +2261 +2458 +2096 +1712 +2594 +2293 +2048 +2359 +1839 +2392 +2254 +1911 +2101 +2367 +1889 +1753 +2555 +2246 +2264 +2010 +2336 +2651 +2017 +2140 +1842 +2019 +1890 +2525 +2134 +2492 +2652 +2040 +2145 +2575 +2166 +1999 +2434 +1711 +2276 +2450 +2389 +2669 +2595 +1814 +2039 +2502 +1896 +2168 +2344 +2637 +2031 +1977 +2380 +1936 +2047 +2460 +2102 +1745 +2650 +2046 +2514 +1980 +2352 +2113 +1713 +2058 +2558 +1718 +1864 +1876 +2338 +1879 +1891 +2186 +2451 +2181 +2638 +2644 +2103 +2591 +2266 +2468 +1869 +2582 +2674 +2361 +2462 +1748 +2215 +2615 +2236 +2248 +2493 +2342 +2449 +2274 +1824 +1852 +1870 +2441 +2356 +1835 +2694 +2602 +2685 +1893 +2544 +2536 +1994 +1853 +1838 +1786 +1930 +2539 +1892 +2265 +2618 +2486 +2583 +2061 +1796 +1806 +2084 +1933 +2095 +2136 +2078 +1884 +2438 +2286 +2138 +1750 +2184 +1799 +2278 +2410 +2642 +2435 +1956 +2399 +1774 +2129 +1898 +1823 +1938 +2299 +1862 +2420 +2673 +1984 +2204 +1717 +2074 +2213 +2436 +2297 +2592 +2667 +2703 +2511 +1779 +1782 +2625 +2365 +2315 +2381 +1788 +1714 +2302 +1927 +2325 +2506 +2169 +2328 +2629 +2128 +2655 +2282 +2073 +2395 +2247 +2521 +2260 +1868 +1988 +2324 +2705 +2541 +1731 +2681 +2707 +2465 +1785 +2149 +2045 +2505 +2611 +2217 +2180 +1904 +2453 +2484 +1871 +2309 +2349 +2482 +2004 +1965 +2406 +2162 +1805 +2654 +2007 +1947 +1981 +2112 +2141 +1720 +1758 +2080 +2330 +2030 +2432 +2089 +2547 +1820 +1815 +2675 +1840 +2658 +2370 +2251 +1908 +2029 +2068 +2513 +2549 +2267 +2580 +2327 +2351 +2111 +2022 +2321 +2614 +2252 +2104 +1822 +2552 +2243 +1798 +2396 +2663 +2564 +2148 +2562 +2684 +2001 +2151 +2706 +2240 +2474 +2303 +2634 +2680 +2055 +2090 +2503 +2347 +2402 +2238 +1950 +2054 +2016 +1872 +2233 +1710 +2032 +2540 +2628 +1795 +2616 +1903 +2531 +2567 +1946 +1897 +2222 +2227 +2627 +1856 +2464 +2241 +2481 +2130 +2311 +2083 +2223 +2284 +2235 +2097 +1752 +2515 +2527 +2385 +2189 +2283 +2182 +2079 +2375 +2174 +2437 +1993 +2517 +2443 +2224 +2648 +2171 +2290 +2542 +2038 +1855 +1831 +1759 +1848 +2445 +1827 +2429 +2205 +2598 +2657 +1728 +2065 +1918 +2427 +2573 +2620 +2292 +1777 +2008 +1875 +2288 +2256 +2033 +2470 +2585 +2610 +2082 +2230 +1915 +1847 +2337 +2512 +2386 +2006 +2653 +2346 +1951 +2110 +2639 +2520 +1939 +2683 +2139 +2220 +1910 +2237 +1900 +1836 +2197 +1716 +1860 +2077 +2519 +2538 +2323 +1914 +1971 +1845 +2132 +1802 +1907 +2640 +2496 +2281 +2198 +2416 +2285 +1755 +2431 +2071 +2249 +2123 +1727 +2459 +2304 +2199 +1791 +1809 +1780 +2210 +2417 +1874 +1878 +2116 +1961 +1863 +2579 +2477 +2228 +2332 +2578 +2457 +2024 +1934 +2316 +1841 +1764 +1737 +2322 +2239 +2294 +1729 +2488 +1974 +2473 +2098 +2612 +1834 +2340 +2423 +2175 +2280 +2617 +2208 +2560 +1741 +2600 +2059 +1747 +2242 +2700 +2232 +2057 +2147 +2682 +1792 +1826 +2120 +1895 +2364 +2163 +1851 +2391 +2414 +2452 +1803 +1989 +2623 +2200 +2528 +2415 +1804 +2146 +2619 +2687 +1762 +2172 +2270 +2678 +2593 +2448 +1882 +2257 +2500 +1899 +2478 +2412 +2107 +1746 +2428 +2115 +1800 +1901 +2397 +2530 +1912 +2108 +2206 +2091 +1740 +2219 +1976 +2099 +2142 +2671 +2668 +2216 +2272 +2229 +2666 +2456 +2534 +2697 +2688 +2062 +2691 +2689 +2154 +2590 +2626 +2390 +1813 +2067 +1952 +2518 +2358 +1789 +2076 +2049 +2119 +2013 +2124 +2556 +2105 +2093 +1885 +2305 +2354 +2135 +2601 +1770 +1995 +2504 +1749 +2157 diff --git a/data/Cora/raw/ind.cora.tx b/data/Cora/raw/ind.cora.tx new file mode 100644 index 0000000000000000000000000000000000000000..6e856d777401ee15dc8619db76c97d0a40ba2d60 GIT binary patch literal 148025 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
urx;I2R767BoP$0`a0WSG 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 literal 0 HcmV?d00001 diff --git a/experiments/results/ver_acc_gcn_inductive.png b/experiments/results/ver_acc_gcn_inductive.png new file mode 100644 index 0000000000000000000000000000000000000000..680dbad65797e4d4e037f81cdf24a1164171547e GIT binary patch literal 22985 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 literal 0 HcmV?d00001 diff --git a/experiments/results/ver_acc_gcn_transductive.png b/experiments/results/ver_acc_gcn_transductive.png new file mode 100644 index 0000000000000000000000000000000000000000..542b1fdeb023d421848ee8aa380ba3ccd2385d6d GIT binary patch literal 23955 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 literal 0 HcmV?d00001 diff --git a/experiments/results/ver_acc_sage_inductive.png b/experiments/results/ver_acc_sage_inductive.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9101a8e78d71a4bd60873e205c102071641caa GIT binary patch literal 23264 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 literal 0 HcmV?d00001 diff --git a/experiments/results/ver_acc_sage_transductive.png b/experiments/results/ver_acc_sage_transductive.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1b1aa3276800ae6ff5e1984f8fc968eb01a2a4 GIT binary patch literal 23856 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 literal 0 HcmV?d00001 diff --git a/experiments/results/verification_accuracy_by_architecture.png b/experiments/results/verification_accuracy_by_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa42399ec56f9e9d241de6519c79f3712cfc926 GIT binary patch literal 31124 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 T-w&6V&eqEA>*T+E^TWRYRagbX literal 0 HcmV?d00001 diff --git a/experiments/results/verification_performance_by_setting.png b/experiments/results/verification_performance_by_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..be9b6bc315fc7bbf4beb2aa44719ce7bb7ee084f GIT binary patch literal 38498 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.0.0 -numpy -scipy -networkx -scikit-learn -tqdm -pyyaml -pydantic -torchdata>=0.7.0,<0.8.0 \ No newline at end of file +aiohappyeyeballs==2.6.1 +aiohttp==3.12.15 +aiosignal==1.4.0 +anyio==4.10.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.3.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.3.0 +babel==2.17.0 +beautifulsoup4==4.13.5 +bleach==6.2.0 +certifi==2025.8.3 +cffi==1.17.1 +charset-normalizer==3.4.3 +comm==0.2.3 +contourpy==1.3.3 +cycler==0.12.1 +debugpy==1.8.16 +decorator==5.2.1 +defusedxml==0.7.1 +executing==2.2.1 +fastjsonschema==2.21.2 +filelock==3.19.1 +fonttools==4.59.2 +fqdn==1.5.1 +frozenlist==1.7.0 +fsspec==2025.9.0 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +idna==3.10 +ipykernel==6.30.1 +ipython==9.5.0 +ipython_pygments_lexers==1.1.1 +ipywidgets==8.1.7 +isoduration==20.11.0 +jedi==0.19.2 +Jinja2==3.1.6 +joblib==1.5.2 +json5==0.12.1 +jsonpointer==3.0.0 +jsonschema==4.25.1 +jsonschema-specifications==2025.4.1 +jupyter==1.1.1 +jupyter-console==6.6.3 +jupyter-events==0.12.0 +jupyter-lsp==2.3.0 +jupyter_client==8.6.3 +jupyter_core==5.8.1 +jupyter_server==2.17.0 +jupyter_server_terminals==0.5.3 +jupyterlab==4.4.7 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.27.3 +jupyterlab_widgets==3.0.15 +kiwisolver==1.4.9 +lark==1.2.2 +MarkupSafe==3.0.2 +matplotlib==3.10.6 +matplotlib-inline==0.1.7 +mistune==3.1.4 +mpmath==1.3.0 +multidict==6.6.4 +nbclient==0.10.2 +nbconvert==7.16.6 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.5 +notebook==7.4.5 +notebook_shim==0.2.4 +numpy==2.3.2 +nvidia-cublas-cu12==12.4.5.8 +nvidia-cuda-cupti-cu12==12.4.127 +nvidia-cuda-nvrtc-cu12==12.4.127 +nvidia-cuda-runtime-cu12==12.4.127 +nvidia-cudnn-cu12==9.1.0.70 +nvidia-cufft-cu12==11.2.1.3 +nvidia-cufile-cu12==1.13.1.3 +nvidia-curand-cu12==10.3.5.147 +nvidia-cusolver-cu12==11.6.1.9 +nvidia-cusparse-cu12==12.3.1.170 +nvidia-cusparselt-cu12==0.7.1 +nvidia-nccl-cu12==2.21.5 +nvidia-nvjitlink-cu12==12.4.127 +nvidia-nvtx-cu12==12.4.127 +packaging==25.0 +pandas==2.3.2 +pandocfilters==1.5.1 +parso==0.8.5 +pexpect==4.9.0 +pillow==11.3.0 +platformdirs==4.4.0 +prometheus_client==0.22.1 +prompt_toolkit==3.0.52 +propcache==0.3.2 +psutil==7.0.0 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pycparser==2.22 +Pygments==2.19.2 +pyparsing==3.2.3 +python-dateutil==2.9.0.post0 +python-json-logger==3.3.0 +pytz==2025.2 +PyYAML==6.0.2 +pyzmq==27.0.2 +referencing==0.36.2 +requests==2.32.5 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.27.1 +scikit-learn==1.7.1 +scipy==1.16.1 +seaborn==0.13.2 +Send2Trash==1.8.3 +setuptools==80.9.0 +six==1.17.0 +sniffio==1.3.1 +soupsieve==2.8 +stack-data==0.6.3 +sympy==1.13.1 +terminado==0.18.1 +threadpoolctl==3.6.0 +tinycss2==1.4.0 +torch==2.5.1 +torch-geometric==2.6.1 +torchaudio==2.5.1 +torchvision==0.20.1 +tornado==6.5.2 +tqdm==4.67.1 +traitlets==5.14.3 +triton==3.1.0 +types-python-dateutil==2.9.0.20250822 +typing_extensions==4.15.0 +tzdata==2025.2 +uri-template==1.3.0 +urllib3==2.5.0 +wcwidth==0.2.13 +webcolors==24.11.1 +webencodings==0.5.1 +websocket-client==1.8.0 +widgetsnbextension==4.0.14 +yarl==1.20.1 diff --git a/src/src/__init__.py b/src/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/datasets/__init__.py b/src/src/datasets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/datasets/datareader.py b/src/src/datasets/datareader.py new file mode 100644 index 0000000..c9b7e8d --- /dev/null +++ b/src/src/datasets/datareader.py @@ -0,0 +1,159 @@ +import os +import torch +import torch_geometric.datasets as dt +import random +import math +import copy + +def get_data(args): + if args.dataset == 'Citeseer' or args.dataset == 'DBLP' or args.dataset == 'PubMed': + dataset = dt.CitationFull(args.data_path, args.dataset) + data_path = args.data_path + '/' + (args.dataset).lower() + '/processed/data.pt' + elif args.dataset == 'Coauthor': + dataset = dt.Coauthor(args.data_path, 'Physics') + data_path = args.data_path + '/' + 'Physics' + '/processed/data.pt' + elif args.dataset == 'Amazon': + dataset = dt.Amazon(args.data_path, 'Photo') + data_path = args.data_path + '/' + 'Photo' + '/processed/data.pt' + elif args.dataset == 'Cora': + dataset = dt.Planetoid(args.data_path, args.dataset) + data_path = args.data_path + '/' + args.dataset + '/processed/data.pt' + + data = torch.load(data_path) + + return data + +def load_dataset(dataset_name, data_path='./data'): + """ + Wrapper function for compatibility with evaluate.py + """ + class Args: + def __init__(self, dataset, path): + self.dataset = dataset + self.data_path = path + self.dataset_random_seed = 42 + self.split_dataset_ratio = [0.4, 0.3, 0.2, 0.1] + + args = Args(dataset_name, data_path) + return get_data(args) + + +class GraphData(torch.utils.data.Dataset): + def __init__(self, data, args): + self.features = data[0]['x'] + self.adjacency = data[0]['edge_index'] + self.labels = data[0]['y'] + self.node_num = len(self.labels) + self.feat_dim = len(self.features[0]) + + self.set_adj_mat() + self.get_class_num() + self.split_dataset(args) + + def set_adj_mat(self): + self.adj_matrix = torch.zeros([self.node_num, self.node_num]) + for i in range(self.node_num): + source_node = self.adjacency[0][i] + target_node = self.adjacency[1][i] + self.adj_matrix[source_node, target_node] = 1 + self.adj_matrix[target_node, source_node] = 1 + + def get_class_num(self): + labels = self.labels.tolist() + labels = set(labels) + self.class_num = len(labels) + + def split_dataset(self, args): + all_nodes_index = list(i for i in range(self.node_num)) + self.target_nodes_index, self.shadow_nodes_index, self.attacker_nodes_index, self.test_nodes_index = list(), list(), list(), list() + + each_class_nodes_index = [list() for _ in range(self.class_num)] + for i in range(self.node_num): + each_class_nodes_index[self.labels[i]].append(i) + + node_index = [i for i in range(self.node_num)] + random.seed(args.dataset_random_seed) + random.shuffle(node_index) + target_nodes_size = math.floor(self.node_num * args.split_dataset_ratio[0]) + shadow_nodes_size = math.floor(self.node_num * args.split_dataset_ratio[1]) + attacker_nodes_size = math.floor(self.node_num * args.split_dataset_ratio[2]) + test_nodes_size = self.node_num - target_nodes_size - shadow_nodes_size - attacker_nodes_size + self.target_nodes_index += node_index[:target_nodes_size] + self.shadow_nodes_index += node_index[target_nodes_size:(target_nodes_size + shadow_nodes_size)] + self.attacker_nodes_index += node_index[(target_nodes_size + shadow_nodes_size):(target_nodes_size + shadow_nodes_size + attacker_nodes_size)] + self.test_nodes_index += node_index[(target_nodes_size + shadow_nodes_size + attacker_nodes_size):] + + self.target_nodes_index.sort() + self.shadow_nodes_index.sort() + self.attacker_nodes_index.sort() + self.test_nodes_index.sort() + + def __len__(self): + return self.node_num + + def __getitem__(self, index): + return 0 + + +class VarianceData(torch.utils.data.Dataset): + def __init__(self, label0_data_list, label1_data_list): + self.label0_data_list = copy.deepcopy(label0_data_list) + self.label1_data_list = copy.deepcopy(label1_data_list) + self.concat_data() + label0_data_label = [0 for _ in range(self.label0_data.shape[0])] + label1_data_label = [1 for _ in range(self.label1_data.shape[0])] + self.label = label0_data_label + label1_data_label + self.label = torch.as_tensor(self.label) + + def concat_data(self): + self.label0_data = None + self.label1_data = None + for data_index in range(len(self.label0_data_list)): + if data_index == 0: + self.label0_data = self.label0_data_list[data_index] + self.label1_data = self.label1_data_list[data_index] + else: + self.label0_data = torch.cat((self.label0_data, self.label0_data_list[data_index]), 0) + self.label1_data = torch.cat((self.label1_data, self.label1_data_list[data_index]), 0) + + self.data = torch.cat((self.label0_data, self.label1_data), 0) + + def __len__(self): + return self.data.shape[0] + + def __getitem__(self, index): + return self.data[index, :], self.label[index] + + +class DistanceData(torch.utils.data.Dataset): + def __init__(self, label0_data_list, label1_data_list): + self.label0_data_list = copy.deepcopy(label0_data_list) + self.label1_data_list = copy.deepcopy(label1_data_list) + self.concat_data() + label0_data_label = [0 for _ in range(self.label0_data.shape[0])] + label1_data_label = [1 for _ in range(self.label1_data.shape[0])] + self.label = label0_data_label + label1_data_label + self.label = torch.as_tensor(self.label) + + def concat_data(self): + self.label0_data = None + self.label1_data = None + for data_index in range(len(self.label0_data_list)): + if data_index == 0: + self.label0_data = self.label0_data_list[data_index] + self.label1_data = self.label1_data_list[data_index] + else: + self.label0_data = torch.cat((self.label0_data, self.label0_data_list[data_index]), 0) + self.label1_data = torch.cat((self.label1_data, self.label1_data_list[data_index]), 0) + + self.data = torch.cat((self.label0_data, self.label1_data), 0) + + def __len__(self): + return self.data.shape[0] + + def __getitem__(self, index): + return self.data[index, :], self.label[index] + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/src/datasets/graph_operator.py b/src/src/datasets/graph_operator.py new file mode 100644 index 0000000..6ac209c --- /dev/null +++ b/src/src/datasets/graph_operator.py @@ -0,0 +1,131 @@ +import copy +import torch +import torch.nn.functional as F +import torch.optim.lr_scheduler as lr_scheduler +import src.models.gnn as gnn +from torch_geometric.utils import add_self_loops, subgraph + + +class Graph_self(): + def __init__(self, features, edge_index, labels): + self.features = copy.deepcopy(features) + self.adjacency = copy.deepcopy(edge_index) + self.labels = copy.deepcopy(labels) + self.node_num = len(self.labels) + self.feat_dim = len(self.features[0]) + self.get_class_num() + self.set_adj_mat() + + def get_class_num(self): + labels = self.labels.tolist() + labels = set(labels) + self.class_num = len(labels) + + def set_adj_mat(self): + self.adj_matrix = torch.zeros([self.node_num, self.node_num]) + for i in range(self.node_num): + source_node = self.adjacency[0][i] + target_node = self.adjacency[1][i] + self.adj_matrix[source_node, target_node] = 1 + + def __len__(self): + return self.node_num + + def __getitem__(self, index): + return [self.features[index], self.adj_matrix[index], self.labels[index]] + + +def sort_features(args, feat_num, graph_data, original_model): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + # Get the predictions of nodes from the original model + predict_fn = lambda output: output.max(1, keepdim=True)[1] + loss_fn = F.cross_entropy + + original_model.eval() + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + labels = graph_data.labels.to(device) + _, output = original_model(input_data) + original_predictions = predict_fn(output) + + chosen_feat = list() + candidate_feat = copy.deepcopy(graph_data.features) + + for iter in range(feat_num): + + feat_fidelity = dict() + for feat_index in range(graph_data.feat_dim): + if feat_index in chosen_feat: + continue + print(feat_index) + selection_model = None + if args.benign_model == 'gcn': + selection_model = gnn.GCN(iter+1, graph_data.class_num, hidden_dim=args.benign_hidden_dim) + elif args.benign_model == 'sage': + selection_model = gnn.GraphSAGE(iter+1, graph_data.class_num, hidden_dim=args.benign_hidden_dim) + elif args.benign_model == 'gat': + selection_model = gnn.GAT(iter+1, graph_data.class_num, hidden_dim=args.benign_hidden_dim) + selection_model.to(device) + optimizer = torch.optim.Adam(selection_model.parameters(), lr=args.benign_lr, weight_decay=args.benign_weight_decay, betas=(0.5, 0.999)) + scheduler = lr_scheduler.MultiStepLR(optimizer, args.benign_lr_decay_steps, gamma=0.1) + + this_loop_feat = copy.deepcopy(chosen_feat) + this_loop_feat.append(feat_index) + selected_feat = candidate_feat[:, this_loop_feat] + this_loop_input_data = selected_feat.to(device), graph_data.adjacency.to(device) + this_loop_labels = graph_data.labels.to(device) + selection_model.train() + for epoch in range(args.benign_train_epochs): + optimizer.zero_grad() + _, output = selection_model(this_loop_input_data) + loss = loss_fn(output[graph_data.benign_train_mask], this_loop_labels[graph_data.benign_train_mask]) + loss.backward() + optimizer.step() + scheduler.step() + + selection_model.eval() + _, output = selection_model(this_loop_input_data) + pred = predict_fn(output) + final_pred = pred[graph_data.benign_train_mask] + original_pred = original_predictions[graph_data.benign_train_mask] + correct_num = 0 + for i in range(final_pred.shape[0]): + if final_pred[i, 0] == original_pred[i, 0]: + correct_num += 1 + test_acc = correct_num / final_pred.shape[0] * 100 + feat_fidelity.update({feat_index: test_acc}) + + feat_fidelity = sorted(feat_fidelity.items(), key=lambda x:x[1], reverse=True) + most_important_feat = feat_fidelity[0][0] + chosen_feat.append(most_important_feat) + + print(chosen_feat) + return chosen_feat + + +def split_subgraph(graph): + temp_edge_index = add_self_loops(graph.adjacency)[0] + target_edge_index = subgraph(torch.as_tensor(graph.target_nodes_index), temp_edge_index, relabel_nodes=True)[0] + shadow_edge_index = subgraph(torch.as_tensor(graph.shadow_nodes_index), temp_edge_index, relabel_nodes=True)[0] + attacker_edge_index = subgraph(torch.as_tensor(graph.attacker_nodes_index), temp_edge_index, relabel_nodes=True)[0] + test_edge_index = subgraph(torch.as_tensor(graph.test_nodes_index), temp_edge_index, relabel_nodes=True)[0] + + target_features = graph.features[graph.target_nodes_index] + shadow_features = graph.features[graph.shadow_nodes_index] + attacker_features = graph.features[graph.attacker_nodes_index] + test_features = graph.features[graph.test_nodes_index] + + target_labels = graph.labels[graph.target_nodes_index] + shadow_labels = graph.labels[graph.shadow_nodes_index] + attacker_labels = graph.labels[graph.attacker_nodes_index] + test_labels = graph.labels[graph.test_nodes_index] + + target_subgraph = Graph_self(target_features, target_edge_index, target_labels) + shadow_subgraph = Graph_self(shadow_features, shadow_edge_index, shadow_labels) + attacker_subgraph = Graph_self(attacker_features, attacker_edge_index, attacker_labels) + test_subgraph = Graph_self(test_features, test_edge_index, test_labels) + + return target_subgraph, shadow_subgraph, attacker_subgraph, test_subgraph \ No newline at end of file diff --git a/src/src/extraction/__init__.py b/src/src/extraction/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/extraction/extraction_runner.py b/src/src/extraction/extraction_runner.py new file mode 100644 index 0000000..243d770 --- /dev/null +++ b/src/src/extraction/extraction_runner.py @@ -0,0 +1,404 @@ +import torch +import random +import math +import copy +import torch.nn.functional as F +import torch.optim.lr_scheduler as lr_scheduler +import models.extraction +from tqdm import tqdm +from pathlib import Path + + +class Classification(torch.nn.Module): + + def __init__(self, emb_size, num_classes): + super(Classification, self).__init__() + + self.fc1 = torch.nn.Linear(emb_size, 256) + self.fc2 = torch.nn.Linear(256, num_classes) + + def forward(self, x): + x = F.relu(self.fc1(x)) + return F.log_softmax(self.fc2(x), dim=1) + + +def extract_outputs(graph_data, specific_nodes, independent_model, surrogate_model): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + independent_model.eval() + surrogate_model.eval() + + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + independent_embedding, independent_logits = independent_model(input_data) + surrogate_embedding, surrogate_logits = surrogate_model(input_data) + + softmax = torch.nn.Softmax(dim=1) + independent_prob = softmax(independent_logits) + surrogate_prob = softmax(surrogate_logits) + + if specific_nodes != None: + independent_prob = independent_prob[specific_nodes].cpu() + surrogate_prob = surrogate_prob[specific_nodes].cpu() + independent_embedding = independent_embedding[specific_nodes].cpu() + surrogate_embedding = surrogate_embedding[specific_nodes].cpu() + independent_logits = independent_logits[specific_nodes].cpu() + surrogate_logits = surrogate_logits[specific_nodes].cpu() + + probability = {'independent': independent_prob, 'surrogate': surrogate_prob} + embedding = {'independent': independent_embedding, 'surrogate': surrogate_embedding} + logits = {'independent': independent_logits, 'surrogate': surrogate_logits} + + return probability, logits, embedding + + +def verify(suspicious_logits, verifier_model): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + distance = torch.flatten(suspicious_logits).view(1, -1) + + verifier_model.to(device) + verifier_model.eval() + + outputs = verifier_model(distance.to(device)) + + return outputs + + +def evaluate_target_response(args, graph_data, model, response, process): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + model.eval() + model = model.to(device) + + if args.task_type == 'transductive': + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + embedding, output = model(input_data) + embedding = embedding.detach() + output = output.detach() + + if process == 'train': + search_nodes_index = graph_data.shadow_nodes_index + elif process == 'test': + search_nodes_index = graph_data.attacker_nodes_index + + if response == 'train_embeddings': + target_response = embedding[search_nodes_index] + elif response == 'train_outputs': + target_response = output[search_nodes_index] + elif response == 'test_embeddings': + target_response = embedding[graph_data.test_nodes_index] + elif response == 'test_outputs': + target_response = output[graph_data.test_nodes_index] + elif args.task_type == 'inductive': + if process == 'train': + extraction_input_data = graph_data[1].features.to(device), graph_data[1].adjacency.to(device) + extraction_embedding, extraction_output = model(extraction_input_data) + extraction_embedding = extraction_embedding.detach() + extraction_output = extraction_output.detach() + elif process == 'test': + extraction_input_data = graph_data[2].features.to(device), graph_data[2].adjacency.to(device) + extraction_embedding, extraction_output = model(extraction_input_data) + extraction_embedding = extraction_embedding.detach() + extraction_output = extraction_output.detach() + + test_input_data = graph_data[3].features.to(device), graph_data[3].adjacency.to(device) + test_embedding, test_output = model(test_input_data) + test_embedding = test_embedding.detach() + test_output = test_output.detach() + + if response == 'train_embeddings': + target_response = extraction_embedding + elif response == 'train_outputs': + target_response = extraction_output + elif response == 'test_embeddings': + target_response = test_embedding + elif response == 'test_outputs': + target_response = test_output + + + return target_response + + +def train_extraction_model(args, model_save_path, data, process, classifier): + clf_save_path = model_save_path + '_clf.pt' + graph_data, train_emb, train_outputs, test_outputs = data + softmax = torch.nn.Softmax(dim=1) + train_outputs = softmax(train_outputs) + + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + # prepare model + if args.task_type == 'transductive': + in_dim = graph_data.feat_dim + elif args.task_type == 'inductive': + in_dim = graph_data[1].feat_dim + + if args.extraction_method == 'white_box': + out_dim = train_emb.shape[1] + elif args.extraction_method == 'black_box': + out_dim = train_outputs.shape[1] + + if args.extraction_model == 'gcn': + extraction_model = models.extraction.GcnExtract(in_dim, out_dim, hidden_dim=args.extraction_hidden_dim) + elif args.extraction_model == 'sage': + extraction_model = models.extraction.SageExtract(in_dim, out_dim, hidden_dim=args.extraction_hidden_dim) + elif args.extraction_model == 'gat': + extraction_model = models.extraction.GatExtract(in_dim, out_dim, hidden_dim=args.extraction_hidden_dim) + elif args.extraction_model == 'gin': + extraction_model = models.extraction.GinExtract(in_dim, out_dim, hidden_dim=args.extraction_hidden_dim) + elif args.extraction_model == 'sgc': + extraction_model = models.extraction.SGCExtract(in_dim, out_dim, hidden_dim=args.extraction_hidden_dim) + + extraction_model = extraction_model.to(device) + + loss_fn = torch.nn.CrossEntropyLoss() + + optimizer_medium = torch.optim.Adam(extraction_model.parameters(), lr=args.extraction_lr) + + clf = None + if args.extraction_method == 'white_box': + if args.task_type == "inductive": + clf = Classification(out_dim, graph_data[0].class_num) + else: + clf = Classification(out_dim, graph_data.class_num) + clf = clf.to(device) + optimizer_classification = torch.optim.SGD(clf.parameters(), lr=args.extraction_lr) + elif args.extraction_method == 'black_box': + clf = None + predict_fn = lambda output: output.max(1, keepdim=True)[1] + + # train extraction model + last_train_acc, last_train_fide = 0.0, 0.0 + if args.task_type == 'transductive': + path = Path(model_save_path) + if path.is_file(): + extraction_model = torch.load(model_save_path) + if args.extraction_method == 'white_box': + clf = torch.load(clf_save_path) + else: + if process == 'train': + search_nodes_index = graph_data.shadow_nodes_index + elif process == 'test': + search_nodes_index = graph_data.attacker_nodes_index + + for epoch in range(args.extraction_train_epochs): + extraction_model.train() + if args.extraction_method == 'white_box': + clf.train() + train_emb = train_emb.to(device) + train_outputs = train_outputs.to(device) + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + extraction_embeddings, extraction_outputs = extraction_model(input_data) + part_embeddings = extraction_embeddings[search_nodes_index] + part_outputs = extraction_outputs[search_nodes_index] + + if args.extraction_method == 'white_box': + optimizer_medium.zero_grad() + optimizer_classification.zero_grad() + loss_emb = torch.sqrt(loss_fn(part_embeddings, train_emb)) + loss_emb.backward() + optimizer_medium.step() + + outputs = clf(part_embeddings.detach()) + train_labels = predict_fn(train_outputs) + train_labels = torch.flatten(train_labels) + loss_out = loss_fn(outputs, train_labels) + loss_out.backward() + optimizer_classification.step() + elif args.extraction_method == 'black_box': + optimizer_medium.zero_grad() + loss = loss_fn(part_outputs, train_outputs) + if process == 'test' and classifier != None: + surrogate_outputs, _, _ = extract_outputs(graph_data, graph_data.target_nodes_index, extraction_model, extraction_model) + classify_logits = verify(surrogate_outputs["surrogate"], classifier) + classify_logits = torch.flatten(classify_logits) + evade_loss = loss_fn(classify_logits, torch.tensor(0).to(device)) + loss += 10 * evade_loss + + loss.backward() + optimizer_medium.step() + + if (epoch + 1) % 50 == 0: + extraction_model.eval() + if args.extraction_method == 'white_box': + clf.eval() + + acc_correct = 0 + fide_correct = 0 + + embeddings, outputs = extraction_model(input_data) + if args.extraction_method == 'white_box': + outputs = clf(embeddings.detach()) + pred = predict_fn(outputs) + train_labels = predict_fn(train_outputs) + + for i in range(len(search_nodes_index)): + if pred[search_nodes_index[i]] == graph_data.labels[search_nodes_index[i]]: + acc_correct += 1 + if pred[search_nodes_index[i]] == train_labels[i]: + fide_correct += 1 + + accuracy = acc_correct * 100.0 / len(search_nodes_index) + fidelity = fide_correct * 100.0 / train_outputs.shape[0] + if last_train_acc == 0.0 or last_train_fide == 0.0: + last_train_acc = accuracy + last_train_fide = fidelity + else: + train_acc_diff = (accuracy - last_train_acc) / last_train_acc * 100 + train_fide_diff = (fidelity - last_train_fide) / last_train_fide * 100 + if train_acc_diff <= 0.5 and train_fide_diff <= 0.5: # 0.5% + break + else: + last_train_acc = accuracy + last_train_fide = fidelity + + torch.save(extraction_model, model_save_path) + if args.extraction_method == 'white_box': + torch.save(clf, clf_save_path) + + extraction_model.eval() + if args.extraction_method == 'white_box': + clf.eval() + acc_correct, fide_correct = 0, 0 + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + embeddings, outputs = extraction_model(input_data) + if args.extraction_method == 'white_box': + outputs = clf(embeddings.detach()) + pred = predict_fn(outputs) + test_labels = predict_fn(test_outputs) + for i in range(len(graph_data.test_nodes_index)): + if pred[graph_data.test_nodes_index[i]] == graph_data.labels[graph_data.test_nodes_index[i]]: + acc_correct += 1 + if pred[graph_data.test_nodes_index[i]] == test_labels[i]: + fide_correct += 1 + accuracy = acc_correct * 100.0 / len(graph_data.test_nodes_index) + fidelity = fide_correct * 100.0 / test_outputs.shape[0] + save_acc = round(accuracy, 3) + save_fide = round(fidelity, 3) + elif args.task_type == 'inductive': + path = Path(model_save_path) + if path.is_file(): + extraction_model = torch.load(model_save_path) + if args.extraction_method == 'white_box': + clf = torch.load(clf_save_path) + else: + if process == 'train': + using_graph_data = graph_data[1] + elif process == 'test': + using_graph_data = graph_data[2] + + for epoch in range(args.extraction_train_epochs): + extraction_model.train() + if args.extraction_method == 'white_box': + clf.train() + train_emb = train_emb.to(device) + train_outputs = train_outputs.to(device) + + input_data = using_graph_data.features.to(device), using_graph_data.adjacency.to(device) + extraction_embeddings, extraction_outputs = extraction_model(input_data) + + if args.extraction_method == 'white_box': + optimizer_medium.zero_grad() + optimizer_classification.zero_grad() + loss_emb = torch.sqrt(loss_fn(extraction_embeddings, train_emb)) + loss_emb.backward() + optimizer_medium.step() + + outputs = clf(extraction_embeddings.detach()) + train_labels = predict_fn(train_outputs) + train_labels = torch.flatten(train_labels) + loss_out = loss_fn(outputs, train_labels) + loss_out.backward() + optimizer_classification.step() + elif args.extraction_method == 'black_box': + optimizer_medium.zero_grad() + loss = loss_fn(extraction_outputs, train_outputs) + loss.backward() + optimizer_medium.step() + + if (epoch + 1) % 50 == 0: + extraction_model.eval() + if args.extraction_method == 'white_box': + clf.eval() + + acc_correct = 0 + fide_correct = 0 + + embeddings, outputs = extraction_model(input_data) + if args.extraction_method == 'white_box': + outputs = clf(embeddings.detach()) + pred = predict_fn(outputs) + train_labels = predict_fn(train_outputs) + + for i in range(using_graph_data.node_num): + if pred[i] == using_graph_data.labels[i]: + acc_correct += 1 + if pred[i] == train_labels[i]: + fide_correct += 1 + + accuracy = acc_correct * 100.0 / using_graph_data.node_num + fidelity = fide_correct * 100.0 / train_outputs.shape[0] + if last_train_acc == 0.0 or last_train_fide == 0.0: + last_train_acc = accuracy + last_train_fide = fidelity + else: + train_acc_diff = (accuracy - last_train_acc) / last_train_acc * 100 + train_fide_diff = (fidelity - last_train_fide) / last_train_fide * 100 + if train_acc_diff <= 0.5 and train_fide_diff <= 0.5: # 0.5% + break + else: + last_train_acc = accuracy + last_train_fide = fidelity + + torch.save(extraction_model, model_save_path) + if args.extraction_method == 'white_box': + torch.save(clf, clf_save_path) + + extraction_model.eval() + if args.extraction_method == 'white_box': + clf.eval() + acc_correct, fide_correct = 0, 0 + input_data = graph_data[3].features.to(device), graph_data[3].adjacency.to(device) + embeddings, outputs = extraction_model(input_data) + if args.extraction_method == 'white_box': + outputs = clf(embeddings.detach()) + pred = predict_fn(outputs) + test_labels = predict_fn(test_outputs) + for i in range(graph_data[3].node_num): + if pred[i] == graph_data[3].labels[i]: + acc_correct += 1 + if pred[i] == test_labels[i]: + fide_correct += 1 + accuracy = acc_correct * 100.0 / graph_data[3].node_num + fidelity = fide_correct * 100.0 / test_outputs.shape[0] + save_acc = round(accuracy, 3) + save_fide = round(fidelity, 3) + + return extraction_model, clf, save_acc, save_fide + + +def run(args, model_save_path, graph_data, original_model, process, classifier): + train_emb = evaluate_target_response(args, graph_data, original_model, 'train_embeddings', process) # we do not use this in black-box extraction setting + train_outputs = evaluate_target_response(args, graph_data, original_model, 'train_outputs', process) + test_outputs = evaluate_target_response(args, graph_data, original_model, 'test_outputs', process) + extraction_data = graph_data, train_emb, train_outputs, test_outputs + extraction_model, _, extraction_acc, extraction_fide = train_extraction_model(args, model_save_path, extraction_data, process, classifier) + + return extraction_model, extraction_acc, extraction_fide + + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/src/fingerprinting/__init__.py b/src/src/fingerprinting/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/masking/__init__.py b/src/src/masking/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/masking/boundary.py b/src/src/masking/boundary.py new file mode 100644 index 0000000..b3d5265 --- /dev/null +++ b/src/src/masking/boundary.py @@ -0,0 +1,191 @@ +import os +import src.datasets.graph_operator +import random +import copy +import torch +import torch.nn.functional as F +import torch_geometric.nn as nn +import src.models.gnn as gnn +import torch.optim.lr_scheduler as lr_scheduler +from sklearn.ensemble import RandomForestClassifier +from pathlib import Path +import pickle +import math + + +def mask_graph_data(args, graph_data, model): + mask_nodes = find_mask_nodes(args, graph_data, model) + mask_feat_num = math.floor(graph_data.x.size(1) * args.mask_feat_ratio) # x instead of features + + new_graph_data = copy.deepcopy(graph_data) + if args.mask_node_ratio == 0 or args.mask_feat_ratio == 0: + pass + else: + if args.mask_feat_type == 'random_mask': + mask_features = list(i for i in range(graph_data.x.size(1))) + random.seed(args.feature_random_seed) + random.shuffle(mask_features) + mask_features = mask_features[:mask_feat_num] + elif args.mask_feat_type == 'mask_by_dataset': + mask_features = find_mask_features_overall(args, graph_data, mask_feat_num) + else: + raise ValueError('Invalid mask method') + + for node_class in mask_nodes: + for node_index in node_class: + for i in range(mask_feat_num): + if args.mask_method == "flip": + new_graph_data.x[node_index][mask_features[i]] = ( + new_graph_data.x[node_index][mask_features[i]] + 1 + ) % 2 + elif args.mask_method == "fix": + new_graph_data.x[node_index][mask_features[i]] = 0 + + return new_graph_data, mask_nodes + + +def measure_posteriors(args, graph_data, measure_node_class, measure_model): + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + measure_model.to(device) + measure_model.eval() + + if args.task_type == 'transductive': + input_data = graph_data.x.to(device), graph_data.edge_index.to(device) + elif args.task_type == 'inductive': + input_data = graph_data[0].x.to(device), graph_data[0].edge_index.to(device) + + _, outputs = measure_model(input_data) + + measure_nodes = [] + for node_class in measure_node_class: + measure_nodes += node_class + + node_posteriors = outputs[measure_nodes] + softmax = torch.nn.Softmax(dim=1) + node_posteriors = softmax(node_posteriors).detach() + + posterior_var = torch.var(node_posteriors, dim=1) + var_mean = torch.mean(posterior_var) + print(var_mean) + + +def find_mask_nodes(args, graph_data, model): + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + model.eval() + input_data = graph_data.x.to(device), graph_data.edge_index.to(device) + _, output = model(input_data) + softmax = torch.nn.Softmax(dim=1) + possibility = softmax(output) + + if args.mask_node_type == 'each_class': + node_possibilities = [dict() for _ in range(graph_data.y.max().item() + 1)] + + if args.task_type == 'transductive': + each_class_num = [0 for _ in range(graph_data.y.max().item() + 1)] + for node_index in graph_data.train_mask.nonzero(as_tuple=True)[0]: + each_class_num[graph_data.y[node_index]] += 1 + each_class_mask_node_num = [math.floor(num * args.mask_node_ratio) for num in each_class_num] + + for node_index in graph_data.train_mask.nonzero(as_tuple=True)[0]: + node_poss = possibility[node_index].detach() + sorted_node_poss, _ = torch.sort(node_poss, descending=True) + node_class_distance = sorted_node_poss[0] - sorted_node_poss[1] + node_possibilities[graph_data.y[node_index].item()].update({node_index.item(): node_class_distance.item()}) + + elif args.task_type == 'inductive': + each_class_num = [0 for _ in range(graph_data.y.max().item() + 1)] + for node_index in range(graph_data.num_nodes): + each_class_num[graph_data.y[node_index]] += 1 + each_class_mask_node_num = [math.floor(num * args.mask_node_ratio) for num in each_class_num] + + for node_index in range(graph_data.num_nodes): + node_poss = possibility[node_index].detach() + sorted_node_poss, _ = torch.sort(node_poss, descending=True) + node_class_distance = sorted_node_poss[0] - sorted_node_poss[1] + node_possibilities[graph_data.y[node_index].item()].update({node_index: node_class_distance.item()}) + + new_node_possibilities = [ + dict(sorted(class_node_possibility.items(), key=lambda x: x[1], reverse=False)) + for class_node_possibility in node_possibilities + ] + + topk_nodes = [list(new_node_possibilities[i].keys())[:each_class_mask_node_num[i]] for i in range(len(new_node_possibilities))] + + elif args.mask_node_type == 'overall': + mask_node_num = math.floor(graph_data.num_nodes * args.mask_node_ratio) + + node_possibilities = dict() + if args.task_type == 'transductive': + for node_index in graph_data.train_mask.nonzero(as_tuple=True)[0]: + node_poss = possibility[node_index].detach() + sorted_node_poss, _ = torch.sort(node_poss, descending=True) + node_class_distance = sorted_node_poss[0] - sorted_node_poss[1] + node_possibilities.update({node_index.item(): node_class_distance.item()}) + elif args.task_type == 'inductive': + for node_index in range(graph_data.num_nodes): + node_poss = possibility[node_index].detach() + sorted_node_poss, _ = torch.sort(node_poss, descending=True) + node_class_distance = sorted_node_poss[0] - sorted_node_poss[1] + node_possibilities.update({node_index: node_class_distance.item()}) + + node_possibilities = dict(sorted(node_possibilities.items(), key=lambda x: x[1], reverse=False)) + topk_nodes = [list(node_possibilities.keys())[:mask_node_num]] + + return topk_nodes + + +def find_mask_features_overall(args, graph_data, feat_num): + if args.task_type == 'transductive': + X = graph_data.x[graph_data.train_mask].cpu().numpy() + Y = graph_data.y[graph_data.train_mask].cpu().numpy() + elif args.task_type == 'inductive': + X = graph_data.x.cpu().numpy() + Y = graph_data.y.cpu().numpy() + + dt_model = RandomForestClassifier(random_state=args.feature_random_seed) + dt_model.fit(X, Y) + feat_importance = dt_model.feature_importances_ + + importance_dict = {index: value for index, value in enumerate(feat_importance)} + importance_dict = dict(sorted(importance_dict.items(), key=lambda x: x[1], reverse=True)) + topk_features = list(importance_dict.keys())[:feat_num] + + return topk_features + + +def find_mask_features_individual(args, graph_data, gnn_model): + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + softmax = torch.nn.Softmax(dim=1) + gnn_model.eval() + gnn_model.to(device) + + input_data = graph_data.x.to(device), graph_data.edge_index.to(device) + _, output = gnn_model(input_data) + possibility = softmax(output).detach() + var = torch.var(possibility, axis=1) + + if args.task_type == 'transductive': + search_node_list = graph_data.train_mask.nonzero(as_tuple=True)[0].tolist() + elif args.task_type == 'inductive': + search_node_list = list(range(graph_data.num_nodes)) + + original_variances = {node_index: var[node_index] for node_index in search_node_list} + + node_feat_importance = dict() + for node_index in search_node_list: + feat_var_diff = dict() + for feat_index in range(graph_data.x.size(1)): + temp_features = copy.deepcopy(graph_data.x) + temp_features[node_index, feat_index] = (temp_features[node_index, feat_index] + 1) % 2 + input_data = temp_features.to(device), graph_data.edge_index.to(device) + _, output = gnn_model(input_data) + possibility = softmax(output).detach() + temp_var = torch.var(possibility[node_index]) + var_diff = original_variances[node_index] - temp_var + feat_var_diff.update({feat_index: var_diff}) + feat_var_diff = dict(sorted(feat_var_diff.items(), key=lambda x: x[1], reverse=True)) + node_feat_importance.update({node_index: list(feat_var_diff.keys())}) + return node_feat_importance diff --git a/src/src/models/__init__.py b/src/src/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/models/extraction.py b/src/src/models/extraction.py new file mode 100644 index 0000000..b8fee5c --- /dev/null +++ b/src/src/models/extraction.py @@ -0,0 +1,124 @@ +import torch +import torch_geometric.nn as nn +import torch.nn.functional as F +from torch.nn import Linear, Sequential, ReLU, BatchNorm1d + +class SageExtract(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(SageExtract, self).__init__() + self.layers = torch.nn.ModuleList() + + self.layers.append(nn.SAGEConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(nn.SAGEConv(hidden_dim[i], hidden_dim[i+1])) + + self.fc = nn.Linear(hidden_dim[-1], out_dim) + #self.project_layer = nn.Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = layer(x, edge_index) + x = F.relu(x) + #x = self.project_layer(x) + embedding = x + x = self.fc(x) + + return embedding, x + + +class GcnExtract(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GcnExtract, self).__init__() + self.layers = torch.nn.ModuleList() + + self.layers.append(nn.GCNConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(nn.GCNConv(hidden_dim[i], hidden_dim[i+1])) + + self.fc = nn.Linear(hidden_dim[-1], out_dim) + #self.project_layer = nn.Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = layer(x, edge_index) + x = F.relu(x) + #x = self.project_layer(x) + embedding = x + x = self.fc(x) + + return embedding, x + + +class GatExtract(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GatExtract, self).__init__() + self.layers = torch.nn.ModuleList() + + self.layers.append(nn.GATConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(nn.GATConv(hidden_dim[i], hidden_dim[i+1])) + + self.fc = nn.Linear(hidden_dim[-1], out_dim) + #self.project_layer = nn.Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = layer(x, edge_index) + x = F.relu(x) + #x = self.project_layer(x) + embedding = x + x = self.fc(x) + + return embedding, x + +class GinExtract(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GinExtract, self).__init__() + self.layers = torch.nn.ModuleList() + + self.layers.append(nn.GINConv( + Sequential(Linear(in_dim, in_dim), BatchNorm1d(in_dim), ReLU(), + Linear(in_dim, hidden_dim[0]), ReLU()))) + for i in range(len(hidden_dim) - 1): + self.layers.append(nn.GINConv( + Sequential(Linear(hidden_dim[i], hidden_dim[i]), BatchNorm1d(hidden_dim[i]), ReLU(), + Linear(hidden_dim[i], hidden_dim[i+1]), ReLU()))) + + self.fc = nn.Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = layer(x, edge_index) + + embedding = x + x = self.fc(x) + + return embedding, x + + +class SGCExtract(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(SGCExtract, self).__init__() + self.layers = torch.nn.ModuleList() + + self.layers.append(nn.SGConv(in_dim, hidden_dim[0], K=2)) + for i in range(len(hidden_dim) - 1): + self.layers.append(nn.SGConv(hidden_dim[i], hidden_dim[i+1], K=2)) + + self.fc = nn.Linear(hidden_dim[-1], out_dim) + #self.project_layer = nn.Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = layer(x, edge_index) + x = F.relu(x) + #x = self.project_layer(x) + embedding = x + x = self.fc(x) + + return embedding, x \ No newline at end of file diff --git a/src/src/models/gnn.py b/src/src/models/gnn.py new file mode 100644 index 0000000..4b6c29a --- /dev/null +++ b/src/src/models/gnn.py @@ -0,0 +1,168 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Linear, Sequential, ReLU, BatchNorm1d +from torch_geometric.nn import ( + GCNConv, + GATConv, + SAGEConv, + GINConv, + SGConv +) + + +# ------------------- Base Helper ------------------- +def get_hidden_dims(hidden_dim): + """Ensure hidden_dim is a list.""" + if isinstance(hidden_dim, int): + return [hidden_dim] + elif isinstance(hidden_dim, list): + return hidden_dim + else: + raise ValueError("hidden_dim must be int or list of ints") + + +# ------------------- GCN ------------------- +class GCN(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GCN, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + + self.layers.append(GCNConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(GCNConv(hidden_dim[i], hidden_dim[i + 1])) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for conv in self.layers: + x = F.relu(conv(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GraphSAGE ------------------- +class GraphSage(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GraphSage, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + + self.layers.append(SAGEConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(SAGEConv(hidden_dim[i], hidden_dim[i + 1])) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for conv in self.layers: + x = F.relu(conv(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GAT ------------------- +class GAT(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], heads=8): + super(GAT, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + + self.layers.append(GATConv(in_dim, hidden_dim[0], heads=heads, concat=True)) + for i in range(len(hidden_dim) - 1): + in_channels = hidden_dim[i] * heads if i == 0 else hidden_dim[i] + self.layers.append(GATConv(in_channels, hidden_dim[i + 1], heads=1, concat=False)) + + self.fc = Linear(hidden_dim[-1], out_dim) + self.heads = heads + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = F.relu(conv(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GIN ------------------- +class GIN(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32]): + super(GIN, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + + self.layers.append(GINConv( + Sequential( + Linear(in_dim, in_dim), + BatchNorm1d(in_dim), + ReLU(), + Linear(in_dim, hidden_dim[0]), + ReLU() + ) + )) + + for i in range(len(hidden_dim) - 1): + self.layers.append(GINConv( + Sequential( + Linear(hidden_dim[i], hidden_dim[i]), + BatchNorm1d(hidden_dim[i]), + ReLU(), + Linear(hidden_dim[i], hidden_dim[i + 1]), + ReLU() + ) + )) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for conv in self.layers: + x = conv(x, edge_index) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- SGC ------------------- +class SGC(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], K=2): + super(SGC, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + + self.layers.append(SGConv(in_dim, hidden_dim[0], K=K)) + for i in range(len(hidden_dim) - 1): + self.layers.append(SGConv(hidden_dim[i], hidden_dim[i + 1], K=K)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for conv in self.layers: + x = F.relu(conv(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- Model Factory ------------------- +def get_gnn_model(model_name, in_dim, out_dim, hidden_dim=[64, 32], **kwargs): + model_name = model_name.lower() + if model_name == "gcn": + return GCN(in_dim, out_dim, hidden_dim) + elif model_name == "graphsage": + return GraphSage(in_dim, out_dim, hidden_dim) + elif model_name == "gat": + return GAT(in_dim, out_dim, hidden_dim, **kwargs) + elif model_name == "gin": + return GIN(in_dim, out_dim, hidden_dim) + elif model_name == "sgc": + return SGC(in_dim, out_dim, hidden_dim) + else: + raise ValueError(f"Unknown GNN model: {model_name}") diff --git a/src/src/models/gnn2.py b/src/src/models/gnn2.py new file mode 100644 index 0000000..7141475 --- /dev/null +++ b/src/src/models/gnn2.py @@ -0,0 +1,237 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Linear, Sequential, BatchNorm1d +from torch_geometric.nn import ( + GCNConv, + GATConv, + SAGEConv, + GINConv, + SGConv +) + + +# ------------------- Utility Functions ------------------- +def get_hidden_dims(hidden_dim): + """Ensure hidden_dim is a list.""" + if isinstance(hidden_dim, int): + return [hidden_dim] + elif isinstance(hidden_dim, list): + return hidden_dim + else: + raise ValueError("hidden_dim must be int or list of ints") + + +def get_activation(name="relu"): + """Return the chosen activation function.""" + name = name.lower() + if name == "relu": + return nn.ReLU() + elif name == "leakyrelu": + return nn.LeakyReLU(0.2) + elif name == "elu": + return nn.ELU() + elif name == "gelu": + return nn.GELU() + elif name == "sigmoid": + return nn.Sigmoid() + elif name == "tanh": + return nn.Tanh() + else: + raise ValueError(f"Unsupported activation: {name}") + + +# ------------------- GCN ------------------- +class GCN(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], + dropout=0.5, activation="relu", use_bn=True): + super(GCN, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + self.bns = nn.ModuleList() if use_bn else None + self.act = get_activation(activation) + self.dropout = dropout + self.use_bn = use_bn + + # Build GCN layers + self.layers.append(GCNConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(GCNConv(hidden_dim[i], hidden_dim[i + 1])) + if use_bn: + for h in hidden_dim: + self.bns.append(BatchNorm1d(h)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = conv(x, edge_index) + if self.use_bn: + x = self.bns[i](x) + x = self.act(x) + x = F.dropout(x, p=self.dropout, training=self.training) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GraphSAGE ------------------- +class GraphSage(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], + dropout=0.5, activation="relu", use_bn=True): + super(GraphSage, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + self.bns = nn.ModuleList() if use_bn else None + self.act = get_activation(activation) + self.dropout = dropout + self.use_bn = use_bn + + self.layers.append(SAGEConv(in_dim, hidden_dim[0])) + for i in range(len(hidden_dim) - 1): + self.layers.append(SAGEConv(hidden_dim[i], hidden_dim[i + 1])) + if use_bn: + for h in hidden_dim: + self.bns.append(BatchNorm1d(h)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = conv(x, edge_index) + if self.use_bn: + x = self.bns[i](x) + x = self.act(x) + x = F.dropout(x, p=self.dropout, training=self.training) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GAT ------------------- +class GAT(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], heads=8, + dropout=0.5, activation="relu", use_bn=True): + super(GAT, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + self.bns = nn.ModuleList() if use_bn else None + self.act = get_activation(activation) + self.dropout = dropout + self.use_bn = use_bn + self.heads = heads + + self.layers.append(GATConv(in_dim, hidden_dim[0], heads=heads, concat=True)) + for i in range(len(hidden_dim) - 1): + in_channels = hidden_dim[i] * heads if i == 0 else hidden_dim[i] + self.layers.append(GATConv(in_channels, hidden_dim[i + 1], heads=1, concat=False)) + if use_bn: + for h in hidden_dim: + self.bns.append(BatchNorm1d(h)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = conv(x, edge_index) + if self.use_bn: + x = self.bns[i](x) + x = self.act(x) + x = F.dropout(x, p=self.dropout, training=self.training) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- GIN ------------------- +class GIN(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], + dropout=0.5, activation="relu", use_bn=True): + super(GIN, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + self.bns = nn.ModuleList() if use_bn else None + self.act = get_activation(activation) + self.dropout = dropout + self.use_bn = use_bn + + def mlp(in_dim, out_dim): + layers = [ + Linear(in_dim, out_dim), + self.act + ] + return Sequential(*layers) + + self.layers.append(GINConv(mlp(in_dim, hidden_dim[0]))) + for i in range(len(hidden_dim) - 1): + self.layers.append(GINConv(mlp(hidden_dim[i], hidden_dim[i + 1]))) + if use_bn: + for h in hidden_dim: + self.bns.append(BatchNorm1d(h)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = conv(x, edge_index) + if self.use_bn: + x = self.bns[i](x) + x = F.dropout(x, p=self.dropout, training=self.training) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- SGC ------------------- +class SGC(nn.Module): + def __init__(self, in_dim, out_dim, hidden_dim=[64, 32], K=2, + dropout=0.5, activation="relu", use_bn=True): + super(SGC, self).__init__() + hidden_dim = get_hidden_dims(hidden_dim) + self.layers = nn.ModuleList() + self.bns = nn.ModuleList() if use_bn else None + self.act = get_activation(activation) + self.dropout = dropout + self.use_bn = use_bn + + self.layers.append(SGConv(in_dim, hidden_dim[0], K=K)) + for i in range(len(hidden_dim) - 1): + self.layers.append(SGConv(hidden_dim[i], hidden_dim[i + 1], K=K)) + if use_bn: + for h in hidden_dim: + self.bns.append(BatchNorm1d(h)) + + self.fc = Linear(hidden_dim[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for i, conv in enumerate(self.layers): + x = conv(x, edge_index) + if self.use_bn: + x = self.bns[i](x) + x = self.act(x) + x = F.dropout(x, p=self.dropout, training=self.training) + embedding = x + x = self.fc(x) + return embedding, x + + +# ------------------- Model Factory ------------------- +def get_gnn_model(model_name, in_dim, out_dim, hidden_dim=[64, 32], **kwargs): + model_name = model_name.lower() + if model_name == "gcn": + return GCN(in_dim, out_dim, hidden_dim, **kwargs) + elif model_name == "graphsage": + return GraphSage(in_dim, out_dim, hidden_dim, **kwargs) + elif model_name == "gat": + return GAT(in_dim, out_dim, hidden_dim, **kwargs) + elif model_name == "gin": + return GIN(in_dim, out_dim, hidden_dim, **kwargs) + elif model_name == "sgc": + return SGC(in_dim, out_dim, hidden_dim, **kwargs) + else: + raise ValueError(f"Unknown GNN model: {model_name}") diff --git a/src/src/models/ownership_classifier.py b/src/src/models/ownership_classifier.py new file mode 100644 index 0000000..77e544e --- /dev/null +++ b/src/src/models/ownership_classifier.py @@ -0,0 +1,26 @@ +from torch import nn + +class mlp_nn(nn.Module): + def __init__(self, input_dim, hidden_layers, dropout=0.0): + super().__init__() + layers = list() + hidden_layer_num = len(hidden_layers) + + for i in range(hidden_layer_num): + if i == 0: + layers.append(nn.Linear(input_dim, hidden_layers[i])) + else: + layers.append(nn.Linear(hidden_layers[i-1], hidden_layers[i])) + + layers.append(nn.ReLU()) + + if (i+1) % 2 == 0 and i != (hidden_layer_num - 1) and dropout != 0.0: + layers.append(nn.Dropout(dropout)) + + layers.append(nn.Linear(hidden_layers[-1], 2)) + self.predict_layers = nn.Sequential(*layers) + + + def forward(self, input): + output = self.predict_layers(input) + return output \ No newline at end of file diff --git a/src/src/utils/__init__.py b/src/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/utils/config.py b/src/src/utils/config.py new file mode 100644 index 0000000..60fd789 --- /dev/null +++ b/src/src/utils/config.py @@ -0,0 +1,60 @@ +import argparse + +def add_data_group(group): + group.add_argument('--dataset', type=str, default='Cora', help="used dataset") + group.add_argument('--data_path', type=str, default='../dataset', help="the directory used to save dataset") + group.add_argument('--task_type', type=str, default='transductive') + group.add_argument('--dataset_random_seed', type=int, default=999) + group.add_argument('--feature_random_seed', type=int, default=999) + group.add_argument('--split_dataset_ratio', type=list, default=[0.3, 0.3, 0.3, 0.1]) + group.add_argument('--mask_node_ratio', type=float, default=1.0) + group.add_argument('--mask_feat_ratio', type=float, default=0.0) + group.add_argument('--mask_node_type', type=str, default='overall') + group.add_argument('--mask_feat_type', type=str, default='random_mask') + group.add_argument('--mask_method', type=str, default='flip') + group.add_argument('--prune_weight_ratio', type=float, default=0.1) + +def add_benign_model_group(group): + group.add_argument('--benign_model', type=str, default='gcn', help="used model") + group.add_argument('--benign_hidden_dim', nargs='+', default=[128, 64], type=int, help='hidden layers of the model') + group.add_argument('--benign_train_epochs', type=int, default=1000) + group.add_argument('--benign_lr', type=float, default=0.001) + group.add_argument('--antidistill_train_ratio', type=float, default=0.1) + group.add_argument('--benign_model_situation', type=str, default='load_if_exists') + + +def add_backdoor_model_group(group): + group.add_argument('--backdoor_train_node_ratio', type=float, default=0.15) + group.add_argument('--backdoor_test_node_ratio', type=float, default=0.1) + group.add_argument('--backdoor_feature_num', type=float, default=500) + group.add_argument('--backdoor_target_label', type=int, default=6) + group.add_argument('--backdoor_train_epochs', type=int, default=1000) + group.add_argument('--backdoor_lr', type=float, default=0.001) + group.add_argument('--backdoor_lr_decay_steps', nargs='+', default=[500, 800], type=int) + group.add_argument('--backdoor_weight_decay', type=float, default=5e-4) + + +def add_extraction_model_group(group): + group.add_argument('--extraction_model', type=str, default='gcn', help="used model") + group.add_argument('--extraction_hidden_dim', nargs='+', default=[64, 32], type=int, help='hidden layers of the model') + group.add_argument('--extraction_train_epochs', type=int, default=1000) + group.add_argument('--extraction_lr', type=float, default=0.001) + group.add_argument('--extraction_method', type=str, default='black_box') + group.add_argument('--extraction_ratio', type=float, default=0.5) + group.add_argument('--extraction_model_situation', type=str, default='load_if_exists') + group.add_argument('--double_extraction_model_situation', type=str, default='write_anyway') + + +def parse_args(): + parser = argparse.ArgumentParser() + data_group = parser.add_argument_group(title="Data-related configuration") + benign_model_group = parser.add_argument_group(title="Benign-model-related configuration") + backdoor_model_group = parser.add_argument_group(title="Attack-related configuration") + extraction_model_group = parser.add_argument_group(title="Extraction-model-related configuration") + + add_data_group(data_group) + add_benign_model_group(benign_model_group) + add_backdoor_model_group(backdoor_model_group) + add_extraction_model_group(extraction_model_group) + + return parser.parse_args() \ No newline at end of file diff --git a/src/src/verifier/__init__.py b/src/src/verifier/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/src/verifier/verification_cfg.py b/src/src/verifier/verification_cfg.py new file mode 100644 index 0000000..3f4e90d --- /dev/null +++ b/src/src/verifier/verification_cfg.py @@ -0,0 +1,468 @@ +import json +import torch +import experiments.scripts.run_benign as benign +import extraction +import random +import math +import src.datasets.datareader +from src.extraction import extraction_runner +# import src.models.gnn +# import src.models.extraction +from torch.utils.data import DataLoader +from tqdm import tqdm +from models.ownership_classifier import mlp_nn +import src.masking.boundary as boundary +from statistics import mean +import time +import os +import yaml +import itertools +from datetime import timedelta +import copy + +def extract_outputs(graph_data, specific_nodes, independent_model, surrogate_model): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + independent_model.eval() + surrogate_model.eval() + + input_data = graph_data.features.to(device), graph_data.adjacency.to(device) + independent_embedding, independent_logits = independent_model(input_data) + surrogate_embedding, surrogate_logits = surrogate_model(input_data) + + softmax = torch.nn.Softmax(dim=1) + independent_prob = softmax(independent_logits) + surrogate_prob = softmax(surrogate_logits) + + if specific_nodes != None: + independent_prob = independent_prob[specific_nodes].detach().cpu() + surrogate_prob = surrogate_prob[specific_nodes].detach().cpu() + independent_embedding = independent_embedding[specific_nodes].detach().cpu() + surrogate_embedding = surrogate_embedding[specific_nodes].detach().cpu() + independent_logits = independent_logits[specific_nodes].detach().cpu() + surrogate_logits = surrogate_logits[specific_nodes].detach().cpu() + + probability = {'independent': independent_prob, 'surrogate': surrogate_prob} + embedding = {'independent': independent_embedding, 'surrogate': surrogate_embedding} + logits = {'independent': independent_logits, 'surrogate': surrogate_logits} + + return probability, logits, embedding + + +def preprocess_data_flatten(distance_pairs:list): + total_label0, total_label1 = list(), list() + + for pair_index in range(len(distance_pairs)): + label0_distance = torch.flatten(distance_pairs[pair_index]['independent']).view(1, -1) + label1_distance = torch.flatten(distance_pairs[pair_index]['surrogate']).view(1, -1) + + total_label0.append(label0_distance) + total_label1.append(label1_distance) + + processed_data = {'independent': total_label0, 'surrogate': total_label1} + + return processed_data + + +def pair_to_dataloader(distance_pairs, batch_size=5): + processed_data = preprocess_data_flatten(distance_pairs) + dataset = src.datasets.datareader.VarianceData(processed_data['independent'], processed_data['surrogate']) + dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) + return dataloader + + +def train_original_classifier(distance_pairs: list): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + processed_data = preprocess_data_flatten(distance_pairs) + dataset = src.datasets.datareader.VarianceData(processed_data['independent'], processed_data['surrogate']) + + hidden_layers = [128, 64] + model = mlp_nn(dataset.data.shape[1], hidden_layers) + loss_fn = torch.nn.CrossEntropyLoss() + optimizer = torch.optim.Adam(model.parameters(), lr=0.001) + epoch_num = 1000 + + best_model, best_acc = None, 0 + for i in range(10): + dataloader = DataLoader(dataset, batch_size=10, shuffle=True) + + model.to(device) + acc = 0 + for epoch_index in range(epoch_num): + model.train() + for _, (inputs, labels) in enumerate(dataloader): + optimizer.zero_grad() + inputs = inputs.to(device) + labels = labels.to(device) + outputs = model(inputs) + loss = loss_fn(outputs, labels) + loss.backward() + optimizer.step() + + if (epoch_index + 1) % 100 == 0: + model.eval() + correct = 0 + for _, (inputs, labels) in enumerate(dataloader): + inputs = inputs.to(device) + labels = labels.to(device) + outputs = model(inputs) + _, predictions = torch.max(outputs.data, 1) + correct += (predictions == labels).sum().item() + + acc = correct / len(dataset) * 100 + + + if acc == 100: + break + + + if acc > best_acc: + best_model = model + best_acc = acc + + if best_acc == 100: + break + print("best acc:{}".format(best_acc)) + return best_model + + +def owner_verify(suspicious_logits, verifier_model): + if torch.cuda.is_available(): + device = torch.device('cuda') + else: + device = torch.device('cpu') + + distance = torch.flatten(suspicious_logits).view(1, -1) + + verifier_model.to(device) + verifier_model.eval() + + outputs = verifier_model(distance.to(device)) + _, predictions = torch.max(outputs.data, 1) + + return predictions + + +def join_path(*save_path): + original_model_save_root = os.path.join(*save_path) + if not os.path.exists(original_model_save_root): + os.makedirs(original_model_save_root) + return original_model_save_root + + +def join_name(hidden_dims): + str_dims = [str(n) for n in hidden_dims] + return "_".join(str_dims) + + +def random_generate_arch(layer_dims, num_hidden_layers, seed): + + # first generate all possible arches, then shuffle, sample + def _generate_combinations(layer_dims, num_hidden_layer): + combinations = list(itertools.product(layer_dims, repeat=num_hidden_layer)) + return [sorted(list(combination), reverse=True) for combination in combinations] + + all_hidden_dims = [] + for num_hidden_layer in num_hidden_layers: + + _hidden_dims = _generate_combinations(layer_dims, num_hidden_layer) + random.seed(seed) + random.shuffle(_hidden_dims) + all_hidden_dims.append(_hidden_dims) + + # TODO not deduplicate + res = [] + + for i in range(len(all_hidden_dims[-1])): + for j in range(len(num_hidden_layers)): + if i < len(all_hidden_dims[j]): + res.append(all_hidden_dims[j][i]) + return res + + +class GNNVerification(): + def __init__(self, args, global_cfg, train_setting_cfg, test_setting_cfg): + self.global_cfg = global_cfg + + self.test_setting_cfg = test_setting_cfg + self.train_setting_cfg = train_setting_cfg + self.args = args + self.train_save_root = os.path.join(global_cfg["train_save_root"], args.dataset, args.task_type) + self.test_save_root = os.path.join(global_cfg["test_save_root"], args.dataset, args.task_type) + # one experimental setting + + self.mask_model_save_name = "{}_{}".format(self.global_cfg["target_model"], join_name(self.global_cfg["target_hidden_dims"])) + + def train_original_model(self): + # save original model + original_model_save_root = join_path(self.train_save_root, 'original_models') + original_model_save_path = os.path.join(original_model_save_root, + "{}_{}.pt".format(self.args.benign_model, join_name(self.args.benign_hidden_dim))) + return benign.run(self.args, original_model_save_path) + + def geneate_mask_model(self): + + if self.args.task_type == "inductive": + extract_logits_data = self.original_graph_data[0] + else: + extract_logits_data = self.original_graph_data + + # generate mask model + mask_graph_data, mask_nodes = boundary.mask_graph_data(self.args, extract_logits_data, self.original_model) + mask_model_save_root = join_path(self.train_save_root, "mask_models", self.args.mask_feat_type, + "{}_{}".format(self.args.mask_node_ratio, self.args.mask_feat_ratio)) + + mask_model_save_path = os.path.join(mask_model_save_root, "{}.pt".format(self.mask_model_save_name)) + + if self.args.task_type == "inductive": + mask_graph_data = [mask_graph_data, self.original_graph_data[1], self.original_graph_data[2], self.original_graph_data[3]] + + if self.args.mask_feat_ratio == 0.0: + mask_model = copy.deepcopy(self.original_model) + torch.save(mask_model, mask_model_save_path) + mask_model_acc = self.original_model_acc + else: + _, mask_model, mask_model_acc = benign.run(self.args, mask_model_save_path, mask_graph_data) + + measure_nodes = [] + for each_class_nodes in mask_nodes: + measure_nodes += each_class_nodes + + return mask_model, mask_model_acc, measure_nodes + + # all model generate by this function will automaticly add a final layer for grove + def train_models_by_arch(self, setting_cfg, model_arch, model_save_root, seed, + mask_model_save_name=None, mask_model=None, stage="train", process="train", classifier=None): + + hidden_dims_generator = random_generate_arch(setting_cfg["layer_dims"], setting_cfg["num_hidden_layers"], + seed=seed) + + if len(hidden_dims_generator) < setting_cfg["num_model_per_arch"]: + raise Exception("Can not generate enough unique model hidden dims, please reduce num_model_per_arch") + + model_list, acc_list, fidelity_list = [], [], [] + # generate num_model_per_arch models + for hidden_dims, _ in zip(hidden_dims_generator, list(range(setting_cfg["num_model_per_arch"]))): + + # Important! add a fixed layer + hidden_dims.append(self.global_cfg["embedding_dim"]) + if mask_model is None: + # layer_dim, num_hidden_layers + self.args.benign_hidden_dim = hidden_dims + self.args.benign_model = model_arch + # train independent model + independent_model_save_root = join_path(model_save_root, 'independent_models') + independent_model_save_path = os.path.join(independent_model_save_root, + "{}_{}_{}.pt".format(stage, self.args.benign_model, + join_name(hidden_dims))) + _, model, model_acc = benign.run(self.args, independent_model_save_path, self.original_graph_data, process) + + else: + self.args.extraction_hidden_dim = hidden_dims + self.args.extraction_model = model_arch + extraction_model_save_root = join_path(model_save_root, 'extraction_models', self.args.mask_feat_type, + mask_model_save_name, + "{}_{}".format(self.args.mask_node_ratio, self.args.mask_feat_ratio)) + extraction_model_save_path = os.path.join(extraction_model_save_root, + "{}_{}_{}.pt".format(stage, self.args.extraction_model, + join_name(hidden_dims))) + model, model_acc, fidelity = extraction_runner.run(self.args, extraction_model_save_path, + self.original_graph_data, mask_model, process, classifier) + fidelity_list.append(fidelity) + + model_list.append(model) + acc_list.append(model_acc) + + return model_list, acc_list, fidelity_list + # This function train all models accroding to setting config + def train_models_by_setting(self, setting_cfg, model_save_root, mask_model_save_name=None, mask_model=None, stage="train", process="train", classifier=None): + all_model_list, all_acc_list, all_fidelity_list = [], [], [] + for seed, model_arch in enumerate(setting_cfg["model_arches"]): + model_list, acc_list, fidelity_list = self.train_models_by_arch(setting_cfg, model_arch, model_save_root, seed, mask_model_save_name, + mask_model=mask_model, stage=stage, process=process, classifier=classifier) + all_model_list += model_list + all_acc_list.append(acc_list) + + if mask_model is not None: + all_fidelity_list.append(fidelity_list) + + return all_model_list, all_acc_list, all_fidelity_list + + + def run_single_experiment(self, n_run): + save_json = {} + + start = time.time() + # train original model + self.original_graph_data, self.original_model, self.original_model_acc = self.train_original_model() + if self.args.task_type == "inductive": + extract_logits_data = self.original_graph_data[0] + else: + extract_logits_data = self.original_graph_data + + # generate mask model + mask_start = time.time() + self.mask_model, self.mask_model_acc, self.measure_nodes = self.geneate_mask_model() + mask_run_time = time.time() - mask_start + + mask_outputs, mask_logits, mask_embedding = extract_outputs(extract_logits_data, self.measure_nodes, self.mask_model, self.mask_model) + + # train independent model + train_inde_model_list, train_inde_acc_list, _ = self.train_models_by_setting(self.train_setting_cfg, self.train_save_root, + mask_model=None, stage="train", process='train') + # train surrogate model + train_surr_model_list, train_surr_acc_list, train_surr_fidelity_list = self.train_models_by_setting(self.train_setting_cfg, + self.train_save_root, self.mask_model_save_name, + self.mask_model, stage="train", process=self.global_cfg["train_process"]) + + # TODO + train_prob_list, train_logits_list, train_embedding_list = [], [],[] + for independent_model, extraction_model in zip(train_inde_model_list, train_surr_model_list): + outputs, logits, embedding = extract_outputs(extract_logits_data, self.measure_nodes, independent_model, extraction_model) + train_prob_list.append(outputs) + train_logits_list.append([mask_logits["independent"], logits["independent"], logits["surrogate"]]) + train_embedding_list.append([mask_embedding["independent"], embedding["independent"], embedding["surrogate"]]) + train_clf_start = time.time() + classifier_model = train_original_classifier(train_prob_list) + # classifier_model = train_k_fold(pair_list) + train_clf_time = time.time()-train_clf_start + + # train independent model + test_inde_model_list, test_inde_acc_list, _ = self.train_models_by_setting(self.test_setting_cfg, self.train_save_root, + mask_model=None, stage="test", process='train') + # train surrogate model + test_surr_model_list, test_surr_acc_list, test_surr_fidelity_list = self.train_models_by_setting( + self.test_setting_cfg, self.test_save_root, + self.mask_model_save_name, self.mask_model, stage="test", process=self.global_cfg["test_process"]) # classifier=classifier_model + test_logits_list, test_embedding_list = [], [] + TN, FP, FN, TP = 0, 0, 0, 0 + for test_independent_model, test_extraction_model in zip(test_inde_model_list, test_surr_model_list): + independent__outputs, test_inde_logits, test_inde_embedding = extract_outputs(extract_logits_data, self.measure_nodes, test_independent_model, test_independent_model) + surrogate_outputs, test_surr_logits, test_surr_embedding = extract_outputs(extract_logits_data, self.measure_nodes, test_extraction_model, test_extraction_model) + + ind_pred = owner_verify(independent__outputs["independent"], classifier_model) + ext_pred = owner_verify(surrogate_outputs["surrogate"], classifier_model) + + test_embedding_list.append([mask_embedding["independent"], test_inde_embedding["independent"], test_surr_embedding["surrogate"]]) + test_logits_list.append([mask_logits["independent"], test_inde_logits["independent"], test_surr_logits["surrogate"]]) + + if ind_pred == 0: + TN += 1 + else: + FP += 1 + + if ext_pred == 0: + FN += 1 + else: + TP += 1 + + + FPR = FP / (FP + TN) + FNR = FN / (FN + TP) + Accuracy = (TP + TN) / (TN + FP + TP + FN) + + # save to a + save_json["TN"], save_json["TP"] = TN, TP + save_json["FN"], save_json["FP"] = FN, FP + save_json["FPR"], save_json["FNR"] = FPR, FNR + + save_json["Accuracy"] = Accuracy + save_json["original_model_acc"] = self.original_model_acc + save_json["mask_model_acc"] = self.mask_model_acc + save_json["train_inde_acc_list"] = train_inde_acc_list + save_json["train_surr_acc_list"] = train_surr_acc_list + save_json["train_surr_fidelity_list"] = train_surr_fidelity_list + + save_json["test_inde_acc_list"] = test_inde_acc_list + save_json["test_surr_acc_list"] = test_surr_acc_list + save_json["test_surr_fidelity_list"] = test_surr_fidelity_list + + save_json["total_time"] = time.time()-start + save_json["mask_run_time"] = mask_run_time + + json_save_root = join_path(self.global_cfg["res_path"], self.args.dataset, self.args.task_type, self.args.mask_feat_type, + "{}_{}".format(self.args.mask_node_ratio, self.args.mask_feat_ratio)) + json_save_root = join_path(json_save_root,"train_setting{}".format(self.global_cfg["train_setting"]), "test_setting{}".format(self.global_cfg["test_setting"])) + + with open("{}/{}_{}.json".format(json_save_root, self.mask_model_save_name, n_run), "w") as f: + f.write(json.dumps(save_json)) + + with open("{}/train_setting.yaml".format(json_save_root), "w") as f: + yaml.dump(self.train_setting_cfg, f, default_flow_style=False) + with open("{}/test_setting.yaml".format(json_save_root), "w") as f: + yaml.dump(self.test_setting_cfg, f, default_flow_style=False) + + # if n_run == 0: + # torch.save(train_embedding_list, + # os.path.join(json_save_root, "{}_train_embedding.pkl".format(self.mask_model_save_name))) + # torch.save(test_embedding_list, + # os.path.join(json_save_root, "{}_test_embedding.pkl".format(self.mask_model_save_name))) + + # torch.save(train_logits_list, + # os.path.join(json_save_root, "{}_train_logits.pkl".format(self.mask_model_save_name))) + # torch.save(test_logits_list, + # os.path.join(json_save_root, "{}_test_logits.pkl".format(self.mask_model_save_name))) + + # print("Total Time:{}",save_json["total_time"]) + # print("Train classifier time:{}, Total time:{}, ratio:{}".format(train_clf_time, save_json["total_time"], train_clf_time/save_json["total_time"])) + + return TP, FN, TN, FP + + +def multiple_experiments(args, global_cfg, config_path=None): + if config_path is None: + config_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../config")) + target_arch_list = ["gat", "gcn", "sage"] + # target_arch_list = ["gat"] + target_hidden_dim_list = [[352, 128],[288, 128],[224, 128]] + # target_hidden_dim_list = [[224, 128]] + attack_setting_list = [1, 2, 3, 4] + + # load setting + with open(os.path.join(config_path,'train_setting{}.yaml'.format(global_cfg["train_setting"])), 'r') as file: + train_setting_cfg = yaml.safe_load(file) + + # obtain experimental parameters + grid_params = [] + for dataset in [global_cfg["dataset"]]: + for test_setting in attack_setting_list: + for target_arch in target_arch_list: + for target_hidden_dims in target_hidden_dim_list: + grid_params.append([dataset, test_setting, target_arch, target_hidden_dims]) + + + for dataset, test_setting, target_arch, target_hidden_dims in grid_params: + + # load test setting + with open(os.path.join(config_path, 'test_setting{}.yaml'.format(test_setting)), 'r') as file: + test_setting_cfg = yaml.safe_load(file) + for n_run in range(global_cfg["n_run"]): + args.dataset = dataset + args.benign_hidden_dim = target_hidden_dims + args.benign_model = target_arch + global_cfg['test_setting'] = test_setting + global_cfg['target_model'] = target_arch + global_cfg['target_hidden_dims'] = target_hidden_dims + + gnn_verification = GNNVerification(args, global_cfg, train_setting_cfg, test_setting_cfg) + gnn_verification.run_single_experiment(n_run) + + +if __name__ == '__main__': + from utils.config import parse_args + # from verification_cfg import multiple_experiments + + args = parse_args() + # ownver(args) + + with open(os.path.join("../config", "global_cfg.yaml"), 'r') as file: + global_cfg = yaml.safe_load(file) + + multiple_experiments(args, global_cfg) \ No newline at end of file diff --git a/src/src/watermarking/__init__.py b/src/src/watermarking/__init__.py new file mode 100644 index 0000000..e69de29 From 5833a5437fcfca9396cbc80ad20216d6ea6ec925 Mon Sep 17 00:00:00 2001 From: Yuvraj Kumar Mahato <70275777+yuvraj333@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:10:01 +0545 Subject: [PATCH 2/2] Update README.md --- README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 622d1a1..41a87fc 100644 --- a/README.md +++ b/README.md @@ -1 +1,18 @@ -# gnn-ownership \ No newline at end of file +# PyGIP - GNN Ownership Verification Module + +This repository contains the integration of **Graph Neural Network (GNN) ownership verification** experiments into the PyGIP framework. It provides modular and extensible implementations for attacks and defenses on GNNs, following the guidelines of the PyGIP framework. + +--- + +## 📋 Overview + +This module allows users to: + +- Evaluate ownership verification on GNN models (GCN, GAT, GraphSAGE). +- Run experiments under **inductive** and **transductive** settings. +- Easily extend the framework with new datasets, attacks, or defenses. + +> **Note:** Large model weights (`benign_model.pth`) and result folders (`temp_results/`, `robustness_results/`) are excluded to keep the repository clean. + +--- +

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 literal 0 HcmV?d00001 diff --git a/data/Cora/raw/ind.cora.x b/data/Cora/raw/ind.cora.x new file mode 100644 index 0000000000000000000000000000000000000000..c4a91d008245403e7f26aa616b437191509793c0 GIT binary patch literal 22119 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 0.5).float() + acc = accuracy_score(y.cpu(), pred.cpu()) + # False positive and false negative rates + fp = ((pred == 1) & (y == 0)).sum().float() / max((y == 0).sum().float(), 1) + fn = ((pred == 0) & (y == 1)).sum().float() / max((y == 1).sum().float(), 1) + return acc, fp.item(), fn.item() + +# ----------------------------- +# Main Evaluation +# ----------------------------- +def main(): + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + print(f"Using device: {device}") + + # Load config + cfg = load_config() + dataset_name = cfg['dataset']['name'] + architectures = cfg['model']['architectures'] + mask_ratios = { + 'inductive': cfg['training']['mask_ratio_inductive'], + 'transductive': cfg['training']['mask_ratio_transductive'] + } + + # Load dataset + dataset = Planetoid(root='./data', name=dataset_name) + data = dataset[0].to(device) + num_classes = dataset.num_classes + num_features = dataset.num_features + + results = [] + + for mode in ['inductive', 'transductive']: + mask_ratio = mask_ratios[mode] + masks = create_splits(data, mode=mode) + masked_x = apply_masking(data.x, mask_ratio=mask_ratio).to(device) + + for arch in architectures: + model_class = {'gcn': GCN, 'gat': GAT, 'sage': GraphSAGE}[arch] + + for setting in ['I', 'II', 'III', 'IV']: + target_path = f"temp_results/diff/model_states/{dataset_name}/{mode}/mask_models/random_mask/1.0_{mask_ratio}/{arch}_224_128.pt" + if not os.path.exists(target_path): + print(f"Skipping {arch} {mode} Setting {setting}: Target model not found") + continue + + # Load target model + target_model = model_class(num_features, 224, num_classes).to(device) + target_model.load_state_dict(torch.load(target_path, map_location=device)) + target_acc = evaluate_gnn(target_model, masked_x, data.edge_index, masks['test'], data) + + # Collect posteriors + posteriors = [] + labels = [] + + # Independent models + ind_dir = f"temp_results/diff/model_states/{dataset_name}/{mode}/independent_models" + if os.path.exists(ind_dir): + for f in os.listdir(ind_dir): + if arch in f and f.endswith('.pt'): + model = model_class(num_features, 224, num_classes).to(device) + model.load_state_dict(torch.load(os.path.join(ind_dir, f), map_location=device)) + post = get_posteriors(model, masked_x, data.edge_index, masks['train']) + posteriors.append(post) + labels.append(0) + + # Surrogate models + surr_dir = f"temp_results/diff/model_states/{dataset_name}/{mode}/extraction_models/random_mask/{arch}_224_128/1.0_{mask_ratio}" + if os.path.exists(surr_dir): + for f in os.listdir(surr_dir): + if arch in f and f.endswith('.pt'): + model = model_class(num_features, 224, num_classes).to(device) + model.load_state_dict(torch.load(os.path.join(surr_dir, f), map_location=device)) + post = get_posteriors(model, masked_x, data.edge_index, masks['train']) + posteriors.append(post) + labels.append(1) + + if len(posteriors) < 2: + print(f"Skipping {arch} {mode} Setting {setting}: Insufficient models") + continue + + # Train and evaluate classifier + X = torch.stack(posteriors).to(device) + y = torch.tensor(labels, dtype=torch.float32).to(device) + classifier = train_classifier(X, y, X.shape[1], device=device) + ver_acc, fpr, fnr = evaluate_classifier(classifier, X, y, device=device) + + results.append({ + 'dataset': dataset_name, + 'mode': mode, + 'model': arch, + 'setting': setting, + 'target_acc': target_acc, + 'ver_acc': ver_acc, + 'fpr': fpr, + 'fnr': fnr + }) + + # Save results + os.makedirs('experiments/results', exist_ok=True) + df = pd.DataFrame(results) + df.to_csv('experiments/results/results.csv', index=False) + print("Results saved to experiments/results/results.csv") + +if __name__ == "__main__": + main() diff --git a/eval/evaluate.py b/eval/evaluate.py new file mode 100644 index 0000000..5130808 --- /dev/null +++ b/eval/evaluate.py @@ -0,0 +1,603 @@ +import os +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch_geometric.datasets import Planetoid +from torch_geometric.nn import GCNConv, GATConv, SAGEConv +from torch.nn import Linear +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns +from sklearn.metrics import accuracy_score +import yaml +import copy +import sys +from matplotlib.ticker import PercentFormatter + +# Ensure project root is in sys.path +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Set seed for reproducibility +torch.manual_seed(42) +np.random.seed(42) + +def load_config(config_path): + with open(config_path, 'r') as f: + return yaml.safe_load(f) + +def parse_dims_from_filename(filename): + """ + Parse hidden dimensions from filenames like 'gcn_224_128.pt' + Returns list of dimensions + """ + numbers = re.findall(r'\d+', filename) + return [int(num) for num in numbers] if numbers else [128, 128] + +def parse_architecture_from_filename(filename): + """Parse architecture from filename""" + if 'gcn' in filename: + return 'gcn' + elif 'gat' in filename: + return 'gat' + elif 'sage' in filename: + return 'sage' + return 'gcn' # default + +# ------------------- Flexible Model Definitions ------------------- +class FlexibleGCN(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dims): + super(FlexibleGCN, self).__init__() + if isinstance(hidden_dims, int): + hidden_dims = [hidden_dims] + + self.layers = torch.nn.ModuleList() + dims = [in_dim] + hidden_dims + + for i in range(len(dims) - 1): + self.layers.append(GCNConv(dims[i], dims[i + 1])) + + self.fc = Linear(dims[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = F.relu(layer(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + +class FlexibleGAT(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dims, heads=8): + super(FlexibleGAT, self).__init__() + if isinstance(hidden_dims, int): + hidden_dims = [hidden_dims] + + self.layers = torch.nn.ModuleList() + dims = [in_dim] + hidden_dims + + for i in range(len(dims) - 1): + if i == 0: + # First layer + self.layers.append(GATConv(dims[i], dims[i + 1] // heads, heads=heads, concat=True)) + elif i == len(dims) - 2: + # Last layer + self.layers.append(GATConv(dims[i], dims[i + 1], heads=1, concat=False)) + else: + # Middle layers + self.layers.append(GATConv(dims[i], dims[i + 1] // heads, heads=heads, concat=True)) + + self.fc = Linear(dims[-1], out_dim) + self.heads = heads + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = F.relu(layer(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + +class FlexibleGraphSage(torch.nn.Module): + def __init__(self, in_dim, out_dim, hidden_dims): + super(FlexibleGraphSage, self).__init__() + if isinstance(hidden_dims, int): + hidden_dims = [hidden_dims] + + self.layers = torch.nn.ModuleList() + dims = [in_dim] + hidden_dims + + for i in range(len(dims) - 1): + self.layers.append(SAGEConv(dims[i], dims[i + 1])) + + self.fc = Linear(dims[-1], out_dim) + + def forward(self, data): + x, edge_index = data + for layer in self.layers: + x = F.relu(layer(x, edge_index)) + embedding = x + x = self.fc(x) + return embedding, x + +def create_flexible_model(arch, in_dim, out_dim, filename): + """ + Create a model with flexible architecture based on filename + """ + dims = parse_dims_from_filename(filename) + hidden_dims = dims[:-1] if len(dims) > 1 else dims + final_dim = dims[-1] if dims else out_dim + + print(f"Creating {arch} model with hidden_dims={hidden_dims}, final_dim={final_dim}") + + if arch == 'gcn': + return FlexibleGCN(in_dim, out_dim, hidden_dims) + elif arch == 'gat': + return FlexibleGAT(in_dim, out_dim, hidden_dims, heads=8) + elif arch == 'sage': + return FlexibleGraphSage(in_dim, out_dim, hidden_dims) + +def evaluate_gnn(model, x, edge_index, test_mask, data): + model.eval() + with torch.no_grad(): + _, out = model((x, edge_index)) + pred = out.argmax(dim=1) + return accuracy_score(data.y[test_mask].cpu(), pred[test_mask].cpu()) + +def get_posteriors(model, x, edge_index, mask): + model.eval() + with torch.no_grad(): + _, out = model((x, edge_index)) + selected = out[mask] + return selected.detach().cpu() + +def train_classifier(X, y, input_dim, hidden_layers=None, epochs=100, lr=0.01): + if hidden_layers is None: + hidden_layers = [64] + + class MLPClassifier(nn.Module): + def __init__(self, input_dim, hidden_layers): + super(MLPClassifier, self).__init__() + layers = [] + prev_dim = input_dim + for hidden_dim in hidden_layers: + layers.append(nn.Linear(prev_dim, hidden_dim)) + layers.append(nn.ReLU()) + layers.append(nn.Dropout(0.1)) + prev_dim = hidden_dim + layers.append(nn.Linear(prev_dim, 2)) + self.network = nn.Sequential(*layers) + + def forward(self, x): + return self.network(x) + + classifier = MLPClassifier(input_dim, hidden_layers) + optimizer = torch.optim.Adam(classifier.parameters(), lr=lr, weight_decay=1e-4) + loss_fn = torch.nn.CrossEntropyLoss() + X = X.float() + y = y.long() + + for epoch in range(epochs): + classifier.train() + optimizer.zero_grad() + logits = classifier(X) + loss = loss_fn(logits, y) + loss.backward() + optimizer.step() + + return classifier + +def evaluate_classifier(classifier, X, y): + classifier.eval() + with torch.no_grad(): + logits = classifier(X.float()) + preds = logits.argmax(dim=1) + y_long = y.long() + acc = accuracy_score(y_long.cpu(), preds.cpu()) + neg_mask = (y_long == 0) + pos_mask = (y_long == 1) + fp = ((preds == 1) & neg_mask).sum().float() / neg_mask.sum().float() if neg_mask.sum().item() > 0 else torch.tensor(0.0) + fn = ((preds == 0) & pos_mask).sum().float() / pos_mask.sum().float() if pos_mask.sum().item() > 0 else torch.tensor(0.0) + return float(acc), float(fp), float(fn) + +def safe_load_state(model, path): + """ + Load state_dict safely, handling pickle issues + """ + if not os.path.exists(path): + print(f"File not found: {path}") + return False + + try: + # Try to load with weights_only first (safer) + try: + state = torch.load(path, map_location='cpu', weights_only=True) + except: + # Fallback to non-weights_only + state = torch.load(path, map_location='cpu', weights_only=False) + + # Handle different checkpoint formats + if isinstance(state, torch.nn.Module): + state = state.state_dict() + elif isinstance(state, dict): + for key in ['state_dict', 'model_state', 'model']: + if key in state: + state = state[key] + break + + # Load compatible parameters + model_state = model.state_dict() + filtered_state = {} + + for key, value in state.items(): + if key in model_state and value.shape == model_state[key].shape: + filtered_state[key] = value + else: + # Try to find matching parameter by pattern + for model_key in model_state.keys(): + if (key.endswith('.weight') and model_key.endswith('.weight') and + value.shape == model_state[model_key].shape): + filtered_state[model_key] = value + break + elif (key.endswith('.bias') and model_key.endswith('.bias') and + value.shape == model_state[model_key].shape): + filtered_state[model_key] = value + break + + model.load_state_dict(filtered_state, strict=False) + print(f"Loaded {len(filtered_state)}/{len(state)} parameters from {path}") + return True + + except Exception as e: + print(f"Failed to load {path}: {str(e)}") + return False + +def simple_mask_graph_data(args, data): + """ + Simple masking function for evaluation + """ + masked_data = copy.deepcopy(data) + if args.mask_feat_ratio > 0: + mask = torch.rand_like(masked_data.x) < args.mask_feat_ratio + masked_data.x[mask] = 0 + return masked_data + +def pad_posteriors(posteriors, target_size): + """Pad or truncate posteriors to target size""" + padded = [] + for p in posteriors: + if p.numel() < target_size: + # Pad with zeros + pad_size = target_size - p.numel() + padded.append(torch.cat([p, torch.zeros(pad_size)])) + elif p.numel() > target_size: + # Truncate + padded.append(p[:target_size]) + else: + padded.append(p) + return torch.stack(padded) + +# ------------------- Plotting Functions ------------------- +def plot_verification_accuracy_by_architecture(df, dataset_name): + """Plot verification accuracy by architecture type""" + plt.figure(figsize=(10, 6)) + + # Group by architecture and calculate mean verification accuracy + arch_results = df.groupby(['model', 'mode'])['ver_acc'].mean().reset_index() + + # Create bar plot + ax = sns.barplot(x='model', y='ver_acc', hue='mode', data=arch_results) + + plt.title(f'Verification Accuracy by Architecture on {dataset_name}') + plt.xlabel('Model Architecture') + plt.ylabel('Verification Accuracy') + plt.ylim(0, 1) + + # Format y-axis as percentage + plt.gca().yaxis.set_major_formatter(PercentFormatter(1.0)) + + # Add value labels on bars + for p in ax.patches: + ax.annotate(f'{p.get_height():.1%}', + (p.get_x() + p.get_width() / 2., p.get_height()), + ha='center', va='center', xytext=(0, 10), + textcoords='offset points') + + plt.legend(title='Mode') + plt.tight_layout() + plt.savefig(f'experiments/results/verification_accuracy_by_architecture.png') + plt.close() + print("Plot saved: verification_accuracy_by_architecture.png") + +def plot_target_accuracy_vs_mask_ratio(df, dataset_name): + """Plot target accuracy vs mask ratio""" + plt.figure(figsize=(10, 6)) + + # Extract mask ratio from setting and add to dataframe + df['mask_ratio'] = df['mode'].map({'inductive': 0.05, 'transductive': 0.1}) + + # Group by architecture and mask ratio + accuracy_results = df.groupby(['model', 'mask_ratio'])['target_acc'].mean().reset_index() + + # Create line plot + sns.lineplot(x='mask_ratio', y='target_acc', hue='model', + style='model', markers=True, data=accuracy_results) + + plt.title(f'Target Accuracy vs Mask Ratio on {dataset_name}') + plt.xlabel('Mask Ratio') + plt.ylabel('Target Accuracy') + plt.ylim(0, 1) + plt.grid(True, alpha=0.3) + + # Format y-axis as percentage + plt.gca().yaxis.set_major_formatter(PercentFormatter(1.0)) + + plt.legend(title='Architecture') + plt.tight_layout() + plt.savefig(f'experiments/results/target_accuracy_vs_mask_ratio.png') + plt.close() + print("Plot saved: target_accuracy_vs_mask_ratio.png") + +def plot_verification_performance_by_setting(df, dataset_name): + """Plot verification performance across different settings""" + plt.figure(figsize=(12, 7)) + + # Extract configuration from filename + df['config'] = df['setting'].str.extract(r'(\d+_\d+)') + + # Group by architecture and configuration + config_results = df.groupby(['model', 'config'])['ver_acc'].mean().reset_index() + + # Create grouped bar chart + ax = sns.barplot(x='config', y='ver_acc', hue='model', data=config_results) + + plt.title(f'Verification Performance by Model Configuration on {dataset_name}') + plt.xlabel('Model Configuration (Hidden_Output dimensions)') + plt.ylabel('Verification Accuracy') + plt.ylim(0, 1) + + # Format y-axis as percentage + plt.gca().yaxis.set_major_formatter(PercentFormatter(1.0)) + + # Rotate x-axis labels for better readability + plt.xticks(rotation=45) + + plt.legend(title='Architecture') + plt.tight_layout() + plt.savefig(f'experiments/results/verification_performance_by_setting.png') + plt.close() + print("Plot saved: verification_performance_by_setting.png") + +def plot_false_rates(df, dataset_name): + """Plot false positive and false negative rates""" + plt.figure(figsize=(10, 6)) + + # Calculate mean false rates by architecture + false_rates = df.groupby('model')[['fpr', 'fnr']].mean().reset_index() + + # Convert to long format for plotting + false_rates_long = false_rates.melt(id_vars='model', + value_vars=['fpr', 'fnr'], + var_name='rate_type', + value_name='rate') + + # Create stacked bar chart + ax = sns.barplot(x='model', y='rate', hue='rate_type', data=false_rates_long) + + plt.title(f'False Positive/Negative Rates by Architecture on {dataset_name}') + plt.xlabel('Model Architecture') + plt.ylabel('Rate') + plt.ylim(0, 0.5) # Assuming rates are between 0-0.5 + + # Format y-axis as percentage + plt.gca().yaxis.set_major_formatter(PercentFormatter(1.0)) + + # Add value labels on bars + for p in ax.patches: + ax.annotate(f'{p.get_height():.1%}', + (p.get_x() + p.get_width() / 2., p.get_height() / 2), + ha='center', va='center', xytext=(0, 0), + textcoords='offset points', color='white', weight='bold') + + plt.legend(title='Rate Type') + plt.tight_layout() + plt.savefig(f'experiments/results/false_rates.png') + plt.close() + print("Plot saved: false_rates.png") + +def plot_comparative_performance(df, dataset_name): + """Plot comparative performance: original vs verification accuracy""" + plt.figure(figsize=(12, 6)) + + # Calculate mean accuracy by architecture + performance = df.groupby('model')[['target_acc', 'ver_acc']].mean().reset_index() + + # Create dual-axis plot + fig, ax1 = plt.subplots(figsize=(12, 6)) + + # Bar width + x = np.arange(len(performance['model'])) + width = 0.35 + + # Plot target accuracy + bars1 = ax1.bar(x - width/2, performance['target_acc'], width, + label='Target Accuracy', alpha=0.7, color='skyblue') + ax1.set_xlabel('Model Architecture') + ax1.set_ylabel('Target Accuracy', color='skyblue') + ax1.tick_params(axis='y', labelcolor='skyblue') + ax1.set_ylim(0, 1) + ax1.yaxis.set_major_formatter(PercentFormatter(1.0)) + + # Create second y-axis + ax2 = ax1.twinx() + bars2 = ax2.bar(x + width/2, performance['ver_acc'], width, + label='Verification Accuracy', alpha=0.7, color='salmon') + ax2.set_ylabel('Verification Accuracy', color='salmon') + ax2.tick_params(axis='y', labelcolor='salmon') + ax2.set_ylim(0, 1) + ax2.yaxis.set_major_formatter(PercentFormatter(1.0)) + + # Set x-axis labels + ax1.set_xticks(x) + ax1.set_xticklabels(performance['model']) + + # Add legend + lines1, labels1 = ax1.get_legend_handles_labels() + lines2, labels2 = ax2.get_legend_handles_labels() + ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left') + + plt.title(f'Comparative Performance: Target vs Verification Accuracy on {dataset_name}') + plt.tight_layout() + plt.savefig(f'experiments/results/comparative_performance.png') + plt.close() + print("Plot saved: comparative_performance.png") + +def plot_all_results(df, dataset_name): + """Generate all plots""" + if df.empty: + print("No data to plot") + return + + print("\nGenerating all plots...") + + # Create all plots + plot_verification_accuracy_by_architecture(df, dataset_name) + plot_target_accuracy_vs_mask_ratio(df, dataset_name) + plot_verification_performance_by_setting(df, dataset_name) + plot_false_rates(df, dataset_name) + plot_comparative_performance(df, dataset_name) + + print("All plots generated successfully!") + +def main(): + global_cfg = load_config('config/global_cfg.yaml') + dataset_name = global_cfg['dataset'] + architectures = ['gcn', 'gat', 'sage'] + mask_ratios = {'inductive': 0.05, 'transductive': 0.1} + + dataset = Planetoid(root='./data', name=dataset_name) + data = dataset[0] + num_classes = dataset.num_classes + num_features = dataset.num_features + + results = [] + + for mode in ['inductive', 'transductive']: + mask_ratio = mask_ratios[mode] + masks = {'train': data.train_mask, 'val': data.val_mask, 'test': data.test_mask} + + class MaskArgs: + mask_node_ratio = 0 + mask_feat_ratio = mask_ratio + mask_feat_type = 'random_mask' + mask_method = 'fix' + mask_node_type = 'overall' + feature_random_seed = 42 + task_type = mode + + for arch in architectures: + # Get all target model files for the current architecture + target_dir = f"temp_results/diff/model_states/{dataset_name}/{mode}/mask_models/random_mask/1.0_{mask_ratio}" + if not os.path.exists(target_dir): + print(f"Directory not found: {target_dir}") + continue + + target_files = [f for f in os.listdir(target_dir) if f.startswith(arch) and f.endswith('.pt')] + + for target_file in target_files: + target_path = os.path.join(target_dir, target_file) + print(f"\nProcessing: {target_path}") + + # Create flexible model + target_model = create_flexible_model(arch, num_features, num_classes, target_file) + + if not safe_load_state(target_model, target_path): + print(f"Skipping {arch} {mode} {target_file}: Failed to load") + continue + + # Use simple masking + masked_data = simple_mask_graph_data(MaskArgs(), data) + masked_x = masked_data.x + + target_acc = evaluate_gnn(target_model, masked_x, data.edge_index, masks['test'], data) + print(f"Target accuracy: {target_acc:.4f}") + + posteriors = [] + labels = [] + + # Independent models + ind_dir = f"temp_results/diff/model_states/{dataset_name}/{mode}/independent_models" + if os.path.exists(ind_dir): + for fname in os.listdir(ind_dir): + if arch in fname and fname.endswith('.pt'): + file_arch = parse_architecture_from_filename(fname) + ind_model = create_flexible_model(file_arch, num_features, num_classes, fname) + if safe_load_state(ind_model, os.path.join(ind_dir, fname)): + post = get_posteriors(ind_model, masked_x, data.edge_index, masks['train']) + if post.numel() > 0: + posteriors.append(post.flatten()) + labels.append(0) + print(f"Loaded independent model: {fname}") + + # Surrogate models - skip for now due to import issues + # hidden_dims = parse_dims_from_filename(target_file) + # if len(hidden_dims) >= 2: + # surr_dir = f"temp_results/diff/model_states/{dataset_name}/{mode}/extraction_models/random_mask/{arch}_{hidden_dims[0]}_{hidden_dims[-1]}/1.0_{mask_ratio}" + # if os.path.exists(surr_dir): + # for fname in os.listdir(surr_dir): + # if fname.endswith('.pt'): + # file_arch = parse_architecture_from_filename(fname) + # surr_model = create_flexible_model(file_arch, num_features, num_classes, fname) + # if safe_load_state(surr_model, os.path.join(surr_dir, fname)): + # post = get_posteriors(surr_model, masked_x, data.edge_index, masks['train']) + # if post.numel() > 0: + # posteriors.append(post.flatten()) + # labels.append(1) + # print(f"Loaded surrogate model: {fname}") + + if len(posteriors) < 2: + print(f"Skipping {arch} {mode} {target_file}: Insufficient models ({len(posteriors)})") + continue + + # Find minimum size and pad all posteriors + min_size = min(p.numel() for p in posteriors) + X = pad_posteriors(posteriors, min_size) + y = torch.tensor(labels, dtype=torch.long) + + if X.shape[0] != y.shape[0]: + print(f"Shape mismatch: X={X.shape}, y={y.shape}") + continue + + try: + classifier = train_classifier(X, y, X.shape[1], hidden_layers=[64], epochs=100, lr=0.01) + ver_acc, fpr, fnr = evaluate_classifier(classifier, X, y) + + results.append({ + 'dataset': dataset_name, + 'mode': mode, + 'model': arch, + 'setting': target_file, + 'target_acc': target_acc, + 'ver_acc': ver_acc, + 'fpr': fpr, + 'fnr': fnr + }) + print(f"Result: {arch}, {mode}, {target_file}, Target Acc: {target_acc:.4f}, Ver Acc: {ver_acc:.4f}") + except Exception as e: + print(f"Error training classifier: {e}") + + # Save results and generate plots + if results: + df = pd.DataFrame(results) + os.makedirs('experiments/results', exist_ok=True) + df.to_csv('experiments/results/results.csv', index=False) + print(f"Results saved to experiments/results/results.csv") + + # Generate all comprehensive plots + plot_all_results(df, dataset_name) + else: + print("No results to save or plot") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/experiments/__init__.py b/experiments/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/experiments/results/README.md b/experiments/results/README.md new file mode 100644 index 0000000..e69de29 diff --git a/experiments/results/__init__.py b/experiments/results/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/experiments/results/comparative_performance.png b/experiments/results/comparative_performance.png new file mode 100644 index 0000000000000000000000000000000000000000..b96ae603a75a16a9f4ed48311f95c89c35e99e54 GIT binary patch literal 39036 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 G`TqmRNp({I literal 0 HcmV?d00001 diff --git a/experiments/results/ver_acc_gat_inductive.png b/experiments/results/ver_acc_gat_inductive.png new file mode 100644 index 0000000000000000000000000000000000000000..09fee4aee8b72a47ec49be26533509abac24cb4b GIT binary patch literal 23242 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