Upload folder using huggingface_hub
Browse files- best_model/get_dna_protein_dict.ipynb +797 -0
- best_model/gpt2_gene_en_ft_dna_protein_pair_test_others.ipynb +1111 -0
- best_model/gpt2_gene_multiv1_ft_en_test_others_best.ipynb +771 -0
- best_model/gpt2_gene_multiv2_ft_en_test_others_best.ipynb +771 -0
- best_model/vect_sim_gpt2_gene_en_ft_dna_protein_pair_test_others.ipynb +468 -0
- best_model/vect_sim_protein_rand_test.ipynb +423 -0
- best_model/vect_sim_protein_test.ipynb +423 -0
- finetune/2-gpt2-gene-multi-v2-instruction-ft.ipynb +0 -0
- finetune/get_acc_stat_multiv1.ipynb +232 -0
- finetune/get_acc_stat_multiv1_2.ipynb +319 -0
- finetune/get_acc_stat_multiv1_3.ipynb +128 -0
- finetune/get_acc_stat_multiv2.ipynb +291 -0
- finetune/get_acc_stat_multiv2_2.ipynb +212 -0
- finetune/get_acc_stat_multiv2_3.ipynb +108 -0
- finetune/gpt2_gene_multiv1_ft_en.jsonl +0 -0
- finetune/gpt2_gene_multiv1_ft_en2.jsonl +108 -0
- finetune/gpt2_gene_multiv1_ft_en3.jsonl +72 -0
- finetune/gpt2_gene_multiv1_ft_en_test_others.py +342 -0
- finetune/gpt2_gene_multiv1_ft_en_test_others2.py +233 -0
- finetune/gpt2_gene_multiv1_ft_en_test_others3.py +344 -0
- finetune/gpt2_gene_multiv2_ft_en.jsonl +78 -0
- finetune/gpt2_gene_multiv2_ft_en2.jsonl +124 -0
- finetune/gpt2_gene_multiv2_ft_en3.jsonl +0 -0
- finetune/gpt2_gene_multiv2_ft_en_test_others.py +344 -0
- finetune/gpt2_gene_multiv2_ft_en_test_others2.py +233 -0
- finetune/run_ft_all_2.sh +10 -0
- pretrain/gpt2_gene_multi_v1/ds_zero2_no_offload.json +27 -0
- pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/special_tokens_map-checkpoint.json +5 -0
- pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/tokenizer_config-checkpoint.json +34 -0
- pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/special_tokens_map.json +5 -0
- pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/tokenizer.json +0 -0
- pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/tokenizer_config.json +34 -0
- pretrain/gpt2_gene_multi_v1/run_clm_pt.py +646 -0
- pretrain/gpt2_gene_multi_v1/run_pt_gpt2.sh +49 -0
- pretrain/gpt2_gene_multi_v2/ds_zero2_no_offload.json +27 -0
- pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/special_tokens_map-checkpoint.json +5 -0
- pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/tokenizer_config-checkpoint.json +34 -0
- pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/special_tokens_map.json +5 -0
- pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/tokenizer.json +0 -0
- pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/tokenizer_config.json +34 -0
- pretrain/gpt2_gene_multi_v2/run_clm_formal.py +657 -0
- pretrain/gpt2_gene_multi_v2/run_pt_gpt2_formal.sh +43 -0
best_model/get_dna_protein_dict.ipynb
ADDED
|
@@ -0,0 +1,797 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "e5dcfe41-d48d-4e5a-929d-76446da83b14",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import subprocess\n",
|
| 11 |
+
"import os\n",
|
| 12 |
+
"import json\n",
|
| 13 |
+
"\n",
|
| 14 |
+
"result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 15 |
+
"output = result.stdout\n",
|
| 16 |
+
"for line in output.splitlines():\n",
|
| 17 |
+
" if '=' in line:\n",
|
| 18 |
+
" var, value = line.split('=', 1)\n",
|
| 19 |
+
" os.environ[var] = value"
|
| 20 |
+
]
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"cell_type": "code",
|
| 24 |
+
"execution_count": 2,
|
| 25 |
+
"id": "7bbac3ce-9b63-4129-a8f4-d2a445868d6b",
|
| 26 |
+
"metadata": {},
|
| 27 |
+
"outputs": [
|
| 28 |
+
{
|
| 29 |
+
"name": "stderr",
|
| 30 |
+
"output_type": "stream",
|
| 31 |
+
"text": [
|
| 32 |
+
"2025-02-01 09:48:43.582404: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 33 |
+
"2025-02-01 09:48:43.595793: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 34 |
+
"2025-02-01 09:48:43.611116: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 35 |
+
"2025-02-01 09:48:43.615723: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 36 |
+
"2025-02-01 09:48:43.627763: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 37 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 38 |
+
"2025-02-01 09:48:44.582401: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 39 |
+
]
|
| 40 |
+
}
|
| 41 |
+
],
|
| 42 |
+
"source": [
|
| 43 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 44 |
+
"\n",
|
| 45 |
+
"#分词器\n",
|
| 46 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"dnagpt/gene_eng_gpt2_v1_ft\")"
|
| 47 |
+
]
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
"cell_type": "code",
|
| 51 |
+
"execution_count": 3,
|
| 52 |
+
"id": "74b6bfd2-be51-4fb1-a81e-dccd1f354194",
|
| 53 |
+
"metadata": {},
|
| 54 |
+
"outputs": [
|
| 55 |
+
{
|
| 56 |
+
"data": {
|
| 57 |
+
"text/plain": [
|
| 58 |
+
"100000"
|
| 59 |
+
]
|
| 60 |
+
},
|
| 61 |
+
"execution_count": 3,
|
| 62 |
+
"metadata": {},
|
| 63 |
+
"output_type": "execute_result"
|
| 64 |
+
}
|
| 65 |
+
],
|
| 66 |
+
"source": [
|
| 67 |
+
"word_dict = tokenizer.get_vocab()\n",
|
| 68 |
+
"len(word_dict)"
|
| 69 |
+
]
|
| 70 |
+
},
|
| 71 |
+
{
|
| 72 |
+
"cell_type": "code",
|
| 73 |
+
"execution_count": 4,
|
| 74 |
+
"id": "c4bea266-644a-478b-bf83-6f34079c8366",
|
| 75 |
+
"metadata": {},
|
| 76 |
+
"outputs": [],
|
| 77 |
+
"source": [
|
| 78 |
+
"from transformers import GPT2Tokenizer, GPT2Model,AutoModel\n",
|
| 79 |
+
"import torch\n",
|
| 80 |
+
"model_name=\"dnagpt/gene_eng_gpt2_v1_ft\"\n",
|
| 81 |
+
"device=\"cuda\"\n",
|
| 82 |
+
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 83 |
+
"model = AutoModel.from_pretrained(model_name)\n",
|
| 84 |
+
"model.to(device)\n",
|
| 85 |
+
"\n",
|
| 86 |
+
"def get_text_embedding(text):\n",
|
| 87 |
+
" \"\"\"\n",
|
| 88 |
+
" 使用 GPT-2 模型获取文本的向量表示。\n",
|
| 89 |
+
" \n",
|
| 90 |
+
" 参数:\n",
|
| 91 |
+
" text (str): 输入文本。\n",
|
| 92 |
+
" model_name (str): 预训练 GPT-2 模型名称,默认为 \"gpt2\"。\n",
|
| 93 |
+
" device (str): 设备名称(\"cpu\" 或 \"cuda\")。\n",
|
| 94 |
+
" \n",
|
| 95 |
+
" 返回:\n",
|
| 96 |
+
" torch.Tensor: 文本的向量表示,维度为 [hidden_size]。\n",
|
| 97 |
+
" \"\"\"\n",
|
| 98 |
+
"\n",
|
| 99 |
+
" # 将文本编码为输入 ID 并添加批量维度\n",
|
| 100 |
+
" inputs = tokenizer(text, return_tensors=\"pt\", truncation=True, max_length=512)\n",
|
| 101 |
+
" input_ids = inputs[\"input_ids\"].to(device)\n",
|
| 102 |
+
" attention_mask = inputs[\"attention_mask\"].to(device)\n",
|
| 103 |
+
" \n",
|
| 104 |
+
" # 获取模型的隐藏层输出\n",
|
| 105 |
+
" with torch.no_grad():\n",
|
| 106 |
+
" outputs = model(input_ids, attention_mask=attention_mask)\n",
|
| 107 |
+
" hidden_states = outputs.last_hidden_state # [batch_size, seq_length, hidden_size]\n",
|
| 108 |
+
" \n",
|
| 109 |
+
" # 平均池化:获取序列中所有词向量的平均值\n",
|
| 110 |
+
" embeddings = hidden_states.mean(dim=1).squeeze() # [hidden_size]\n",
|
| 111 |
+
" \n",
|
| 112 |
+
" return embeddings"
|
| 113 |
+
]
|
| 114 |
+
},
|
| 115 |
+
{
|
| 116 |
+
"cell_type": "code",
|
| 117 |
+
"execution_count": 16,
|
| 118 |
+
"id": "3c38a694-078c-44f3-99cd-07af734a951a",
|
| 119 |
+
"metadata": {},
|
| 120 |
+
"outputs": [
|
| 121 |
+
{
|
| 122 |
+
"name": "stdout",
|
| 123 |
+
"output_type": "stream",
|
| 124 |
+
"text": [
|
| 125 |
+
"'AGCT' is classified as: DNA\n",
|
| 126 |
+
"'MVLFRSSGYV' is classified as: Protein\n",
|
| 127 |
+
"'HELLO WORLD' is classified as: English\n",
|
| 128 |
+
"'AGCZ' is classified as: English\n",
|
| 129 |
+
"'XYZ' is classified as: English\n",
|
| 130 |
+
"'A T G C' is classified as: English\n",
|
| 131 |
+
"'HELLO, WORLD!' is classified as: English\n",
|
| 132 |
+
"'M' is classified as: Protein\n"
|
| 133 |
+
]
|
| 134 |
+
}
|
| 135 |
+
],
|
| 136 |
+
"source": [
|
| 137 |
+
"def classify_sequence(sequence):\n",
|
| 138 |
+
" # 定义字符集(所有字符都假设为大写)\n",
|
| 139 |
+
" dna_chars = set('ACGT')\n",
|
| 140 |
+
" protein_chars = set('ACDEFGHIKLMNPQRSTVWY')\n",
|
| 141 |
+
" english_chars = set('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,.!?:;-\"\\'()')\n",
|
| 142 |
+
"\n",
|
| 143 |
+
" # 去除空格并检查长度\n",
|
| 144 |
+
" sequence = sequence.strip() # \n",
|
| 145 |
+
" \n",
|
| 146 |
+
" # 检查是否为DNA序列\n",
|
| 147 |
+
" if all(c in dna_chars for c in sequence):\n",
|
| 148 |
+
" return \"DNA\"\n",
|
| 149 |
+
" \n",
|
| 150 |
+
" # 检查是否为蛋白质序列\n",
|
| 151 |
+
" if all(c in protein_chars for c in sequence):\n",
|
| 152 |
+
" return \"Protein\"\n",
|
| 153 |
+
" \n",
|
| 154 |
+
" # 检查是否为英文文本(允许大小写字母、数字及常见标点符号)\n",
|
| 155 |
+
" if all(c in english_chars for c in sequence):\n",
|
| 156 |
+
" return \"English\"\n",
|
| 157 |
+
" \n",
|
| 158 |
+
" # 如果不符合上述任何条件,则无法明确分类\n",
|
| 159 |
+
" return \"Unknown\"\n",
|
| 160 |
+
"\n",
|
| 161 |
+
"# 示例用法\n",
|
| 162 |
+
"sequences = [\"AGCT\", \"MVLFRSSGYV\", \"HELLO WORLD\", \"AGCZ\", \"XYZ\", \"A T G C\", \"HELLO, WORLD!\", \"M\"]\n",
|
| 163 |
+
"for seq in sequences:\n",
|
| 164 |
+
" print(f\"'{seq}' is classified as: {classify_sequence(seq)}\")"
|
| 165 |
+
]
|
| 166 |
+
},
|
| 167 |
+
{
|
| 168 |
+
"cell_type": "code",
|
| 169 |
+
"execution_count": 17,
|
| 170 |
+
"id": "18f451d4-d79a-45f1-a76e-90da7b160d2d",
|
| 171 |
+
"metadata": {},
|
| 172 |
+
"outputs": [
|
| 173 |
+
{
|
| 174 |
+
"name": "stdout",
|
| 175 |
+
"output_type": "stream",
|
| 176 |
+
"text": [
|
| 177 |
+
"19413 24246 40140\n"
|
| 178 |
+
]
|
| 179 |
+
}
|
| 180 |
+
],
|
| 181 |
+
"source": [
|
| 182 |
+
"#获得DNA和英文词表 只要长度2个及以上的词\n",
|
| 183 |
+
"dna_word_list = []\n",
|
| 184 |
+
"eng_word_list = []\n",
|
| 185 |
+
"protein_word_list = []\n",
|
| 186 |
+
"\n",
|
| 187 |
+
"for word in word_dict:\n",
|
| 188 |
+
" if len(word)>=0:\n",
|
| 189 |
+
" word_type = classify_sequence(word)\n",
|
| 190 |
+
" if \"DNA\"==word_type:\n",
|
| 191 |
+
" dna_word_list.append(word)\n",
|
| 192 |
+
"\n",
|
| 193 |
+
" if \"Protein\"==word_type:\n",
|
| 194 |
+
" protein_word_list.append(word)\n",
|
| 195 |
+
"\n",
|
| 196 |
+
" if \"English\"==word_type:\n",
|
| 197 |
+
" eng_word_list.append(word)\n",
|
| 198 |
+
"\n",
|
| 199 |
+
" \n",
|
| 200 |
+
"\n",
|
| 201 |
+
"print(len(dna_word_list), len(eng_word_list), len(protein_word_list))"
|
| 202 |
+
]
|
| 203 |
+
},
|
| 204 |
+
{
|
| 205 |
+
"cell_type": "code",
|
| 206 |
+
"execution_count": 18,
|
| 207 |
+
"id": "33d38d0b-b0b5-45fb-b923-09d848d3af0a",
|
| 208 |
+
"metadata": {},
|
| 209 |
+
"outputs": [],
|
| 210 |
+
"source": [
|
| 211 |
+
"dna_word_vect_dict = {}\n",
|
| 212 |
+
"for word in dna_word_list:\n",
|
| 213 |
+
" word_vect = get_text_embedding(word)\n",
|
| 214 |
+
" dna_word_vect_dict[word] = word_vect"
|
| 215 |
+
]
|
| 216 |
+
},
|
| 217 |
+
{
|
| 218 |
+
"cell_type": "code",
|
| 219 |
+
"execution_count": 19,
|
| 220 |
+
"id": "e404735d-777c-4cdb-a3c3-55651e940920",
|
| 221 |
+
"metadata": {},
|
| 222 |
+
"outputs": [],
|
| 223 |
+
"source": [
|
| 224 |
+
"protein_word_vect_dict = {}\n",
|
| 225 |
+
"\n",
|
| 226 |
+
"for word in protein_word_list:\n",
|
| 227 |
+
" word_vect = get_text_embedding(word)\n",
|
| 228 |
+
" protein_word_vect_dict[word] = word_vect"
|
| 229 |
+
]
|
| 230 |
+
},
|
| 231 |
+
{
|
| 232 |
+
"cell_type": "code",
|
| 233 |
+
"execution_count": 21,
|
| 234 |
+
"id": "d92f9503-7110-43d8-a56e-03d70ac8c121",
|
| 235 |
+
"metadata": {},
|
| 236 |
+
"outputs": [],
|
| 237 |
+
"source": [
|
| 238 |
+
"protein_letter_vect_dict = {}\n",
|
| 239 |
+
"for word in protein_word_vect_dict:\n",
|
| 240 |
+
" if 1==len(word):\n",
|
| 241 |
+
" protein_letter_vect_dict[word] = protein_word_vect_dict[word]\n",
|
| 242 |
+
"\n",
|
| 243 |
+
"#protein_letter_vect_dict"
|
| 244 |
+
]
|
| 245 |
+
},
|
| 246 |
+
{
|
| 247 |
+
"cell_type": "code",
|
| 248 |
+
"execution_count": 22,
|
| 249 |
+
"id": "e3f5fed8-dd22-4991-932a-8868e24dc00c",
|
| 250 |
+
"metadata": {},
|
| 251 |
+
"outputs": [],
|
| 252 |
+
"source": [
|
| 253 |
+
"from sklearn.neighbors import NearestNeighbors\n",
|
| 254 |
+
"import numpy as np\n",
|
| 255 |
+
"\n",
|
| 256 |
+
"def find_most_similar_optimized(dna_word_vect_dict, eng_word_vect_dict):\n",
|
| 257 |
+
" \"\"\"\n",
|
| 258 |
+
" 使用 KD-Tree 加速 DNA 单词到英文单词的匹配。\n",
|
| 259 |
+
" \n",
|
| 260 |
+
" 参数:\n",
|
| 261 |
+
" dna_word_vect_dict (dict): DNA 单词与其向量的字典 {dna_word: dna_vector}.\n",
|
| 262 |
+
" eng_word_vect_dict (dict): 英文单词与其向量的字典 {eng_word: eng_vector}.\n",
|
| 263 |
+
" \n",
|
| 264 |
+
" 返回:\n",
|
| 265 |
+
" dict: DNA 单词到英文单词的映射词典 {dna_word: most_similar_eng_word}.\n",
|
| 266 |
+
" \"\"\"\n",
|
| 267 |
+
" # 构建英文单词向量矩阵和对应单词列表\n",
|
| 268 |
+
" eng_words = list(eng_word_vect_dict.keys())\n",
|
| 269 |
+
" \n",
|
| 270 |
+
" # 确保向量在 CPU 上并转换为 NumPy 数组\n",
|
| 271 |
+
" eng_vectors = np.array([v.cpu().numpy() if isinstance(v, torch.Tensor) else v for v in eng_word_vect_dict.values()])\n",
|
| 272 |
+
" \n",
|
| 273 |
+
" # 初始化最近邻搜索模型\n",
|
| 274 |
+
" nn_model = NearestNeighbors(metric=\"cosine\").fit(eng_vectors)\n",
|
| 275 |
+
" \n",
|
| 276 |
+
" dna_eng_dict = {}\n",
|
| 277 |
+
" \n",
|
| 278 |
+
" for dna_word, dna_vector in dna_word_vect_dict.items():\n",
|
| 279 |
+
" # 将 DNA 向量确保在 CPU 并转换为 NumPy 数组\n",
|
| 280 |
+
" if isinstance(dna_vector, torch.Tensor):\n",
|
| 281 |
+
" dna_vector = dna_vector.cpu().numpy()\n",
|
| 282 |
+
" \n",
|
| 283 |
+
" # 查找最近的英文单词\n",
|
| 284 |
+
" distances, indices = nn_model.kneighbors([dna_vector], n_neighbors=1)\n",
|
| 285 |
+
" most_similar_eng_word = eng_words[indices[0][0]]\n",
|
| 286 |
+
" \n",
|
| 287 |
+
" # 记录匹配结果\n",
|
| 288 |
+
" dna_eng_dict[dna_word] = most_similar_eng_word\n",
|
| 289 |
+
" \n",
|
| 290 |
+
" return dna_eng_dict\n",
|
| 291 |
+
"\n",
|
| 292 |
+
"# 示例调用\n",
|
| 293 |
+
"#dna_protein_dict_optimized = find_most_similar_optimized(dna_word_vect_dict, protein_word_vect_dict)"
|
| 294 |
+
]
|
| 295 |
+
},
|
| 296 |
+
{
|
| 297 |
+
"cell_type": "code",
|
| 298 |
+
"execution_count": 23,
|
| 299 |
+
"id": "f2d99bd3-7649-408c-be2d-6d8dfe44492b",
|
| 300 |
+
"metadata": {},
|
| 301 |
+
"outputs": [],
|
| 302 |
+
"source": [
|
| 303 |
+
"dna_protein_letter_dict = find_most_similar_optimized(dna_word_vect_dict, protein_letter_vect_dict)"
|
| 304 |
+
]
|
| 305 |
+
},
|
| 306 |
+
{
|
| 307 |
+
"cell_type": "code",
|
| 308 |
+
"execution_count": 26,
|
| 309 |
+
"id": "38ace06a-d14a-440a-be5d-1738b48eb0ef",
|
| 310 |
+
"metadata": {},
|
| 311 |
+
"outputs": [
|
| 312 |
+
{
|
| 313 |
+
"name": "stdout",
|
| 314 |
+
"output_type": "stream",
|
| 315 |
+
"text": [
|
| 316 |
+
"TTT Q\n",
|
| 317 |
+
"TGC L\n",
|
| 318 |
+
"TTA Q\n",
|
| 319 |
+
"GGC L\n",
|
| 320 |
+
"ACA Q\n",
|
| 321 |
+
"ACC L\n",
|
| 322 |
+
"AAG L\n",
|
| 323 |
+
"AAC L\n",
|
| 324 |
+
"CCC H\n",
|
| 325 |
+
"ATT L\n",
|
| 326 |
+
"ATG L\n",
|
| 327 |
+
"CAA L\n",
|
| 328 |
+
"AGT Q\n",
|
| 329 |
+
"AAA Q\n",
|
| 330 |
+
"ACT Q\n",
|
| 331 |
+
"TGA Q\n",
|
| 332 |
+
"GGG L\n",
|
| 333 |
+
"TAG L\n",
|
| 334 |
+
"TAT R\n",
|
| 335 |
+
"CAG Q\n",
|
| 336 |
+
"TCG L\n",
|
| 337 |
+
"ATC L\n",
|
| 338 |
+
"GTA L\n",
|
| 339 |
+
"CGG L\n",
|
| 340 |
+
"CGC L\n",
|
| 341 |
+
"TGT R\n",
|
| 342 |
+
"AAT Q\n",
|
| 343 |
+
"GAG L\n",
|
| 344 |
+
"TGG L\n",
|
| 345 |
+
"GTG L\n",
|
| 346 |
+
"ATA L\n",
|
| 347 |
+
"TCA Q\n",
|
| 348 |
+
"AGG L\n",
|
| 349 |
+
"GCC L\n",
|
| 350 |
+
"GCG L\n",
|
| 351 |
+
"ACG L\n",
|
| 352 |
+
"TCC L\n",
|
| 353 |
+
"TAC L\n",
|
| 354 |
+
"TCT Q\n",
|
| 355 |
+
"CCG L\n",
|
| 356 |
+
"AGC L\n",
|
| 357 |
+
"TTG L\n",
|
| 358 |
+
"TTC L\n",
|
| 359 |
+
"AGA Q\n",
|
| 360 |
+
"GAA L\n",
|
| 361 |
+
"TAA L\n"
|
| 362 |
+
]
|
| 363 |
+
}
|
| 364 |
+
],
|
| 365 |
+
"source": [
|
| 366 |
+
"for word in dna_protein_letter_dict:\n",
|
| 367 |
+
" if 3==len(word):\n",
|
| 368 |
+
" print(word,dna_protein_letter_dict[word])"
|
| 369 |
+
]
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"cell_type": "code",
|
| 373 |
+
"execution_count": 14,
|
| 374 |
+
"id": "92fb0b32-1b6a-4f6b-9130-073a3a7a515a",
|
| 375 |
+
"metadata": {},
|
| 376 |
+
"outputs": [
|
| 377 |
+
{
|
| 378 |
+
"name": "stdout",
|
| 379 |
+
"output_type": "stream",
|
| 380 |
+
"text": [
|
| 381 |
+
"DNA-English dictionary has been saved to dna_eng_dict_optimized.json.\n"
|
| 382 |
+
]
|
| 383 |
+
}
|
| 384 |
+
],
|
| 385 |
+
"source": [
|
| 386 |
+
"import json\n",
|
| 387 |
+
"\n",
|
| 388 |
+
"# 将 dna_eng_dict_optimized 保存到 JSON 文件中\n",
|
| 389 |
+
"def save_dict_to_json(data_dict, file_path):\n",
|
| 390 |
+
" \"\"\"\n",
|
| 391 |
+
" 将字典保存为 JSON 文件。\n",
|
| 392 |
+
" \n",
|
| 393 |
+
" 参数:\n",
|
| 394 |
+
" data_dict (dict): 要保存的字典。\n",
|
| 395 |
+
" file_path (str): 保存 JSON 文件的路径。\n",
|
| 396 |
+
" \"\"\"\n",
|
| 397 |
+
" with open(file_path, 'w', encoding='utf-8') as json_file:\n",
|
| 398 |
+
" json.dump(data_dict, json_file, ensure_ascii=False, indent=4)\n",
|
| 399 |
+
"\n",
|
| 400 |
+
"# 示例调用\n",
|
| 401 |
+
"save_dict_to_json(dna_eng_dict_optimized, \"dna_eng_dict_optimized.json\")\n",
|
| 402 |
+
"print(\"DNA-English dictionary has been saved to dna_eng_dict_optimized.json.\")"
|
| 403 |
+
]
|
| 404 |
+
},
|
| 405 |
+
{
|
| 406 |
+
"cell_type": "code",
|
| 407 |
+
"execution_count": 15,
|
| 408 |
+
"id": "831dd86e-2765-4db2-9fa8-396cc9ad1f72",
|
| 409 |
+
"metadata": {},
|
| 410 |
+
"outputs": [
|
| 411 |
+
{
|
| 412 |
+
"data": {
|
| 413 |
+
"text/plain": [
|
| 414 |
+
"{'olia': 5117,\n",
|
| 415 |
+
" 'umbai': 2040,\n",
|
| 416 |
+
" 'stic': 27,\n",
|
| 417 |
+
" 'peninsula': 2966,\n",
|
| 418 |
+
" 'iciency': 22,\n",
|
| 419 |
+
" 'eleph': 73,\n",
|
| 420 |
+
" 'pson': 446,\n",
|
| 421 |
+
" 'ala': 589,\n",
|
| 422 |
+
" 'politan': 2219,\n",
|
| 423 |
+
" 'https': 2,\n",
|
| 424 |
+
" 'transported': 1883,\n",
|
| 425 |
+
" 'icking': 1249,\n",
|
| 426 |
+
" 'displaystyle': 53,\n",
|
| 427 |
+
" 'cemet': 10,\n",
|
| 428 |
+
" 'icipal': 1138,\n",
|
| 429 |
+
" 'coln': 54,\n",
|
| 430 |
+
" 'idence': 108,\n",
|
| 431 |
+
" 'atherine': 47,\n",
|
| 432 |
+
" 'olph': 108,\n",
|
| 433 |
+
" 'beha': 39,\n",
|
| 434 |
+
" 'desirable': 121,\n",
|
| 435 |
+
" 'atting': 26,\n",
|
| 436 |
+
" 'inflamm': 14,\n",
|
| 437 |
+
" 'surroundings': 85,\n",
|
| 438 |
+
" 'mamm': 221,\n",
|
| 439 |
+
" 'demean': 5,\n",
|
| 440 |
+
" 'hower': 52,\n",
|
| 441 |
+
" 'annah': 19,\n",
|
| 442 |
+
" 'ushima': 54,\n",
|
| 443 |
+
" 'oples': 3,\n",
|
| 444 |
+
" 'enty': 30,\n",
|
| 445 |
+
" 'directions': 1,\n",
|
| 446 |
+
" 'apore': 21,\n",
|
| 447 |
+
" 'duc': 31,\n",
|
| 448 |
+
" 'XXXXXXXX': 2,\n",
|
| 449 |
+
" 'unsupported': 1,\n",
|
| 450 |
+
" 'electro': 21,\n",
|
| 451 |
+
" 'ashed': 46,\n",
|
| 452 |
+
" 'T1': 4,\n",
|
| 453 |
+
" 'ometimes': 54,\n",
|
| 454 |
+
" 'ancing': 1,\n",
|
| 455 |
+
" 'mechanic': 5,\n",
|
| 456 |
+
" 'atican': 16,\n",
|
| 457 |
+
" 'entirety': 6,\n",
|
| 458 |
+
" 'archite': 2,\n",
|
| 459 |
+
" 'employs': 12,\n",
|
| 460 |
+
" 'Resour': 1,\n",
|
| 461 |
+
" 'enjoyable': 2,\n",
|
| 462 |
+
" 'ving': 3,\n",
|
| 463 |
+
" 'rance': 11,\n",
|
| 464 |
+
" 'northwest': 8,\n",
|
| 465 |
+
" 'ampions': 13,\n",
|
| 466 |
+
" 'XXXXXXXXXXXX': 5,\n",
|
| 467 |
+
" 'Weap': 5,\n",
|
| 468 |
+
" 'XT': 7,\n",
|
| 469 |
+
" 'amen': 21,\n",
|
| 470 |
+
" 'Duter': 4,\n",
|
| 471 |
+
" 'ampion': 1,\n",
|
| 472 |
+
" 'agonal': 1,\n",
|
| 473 |
+
" 'involve': 4,\n",
|
| 474 |
+
" 'underneath': 2,\n",
|
| 475 |
+
" 'rought': 19,\n",
|
| 476 |
+
" 'Carneg': 11,\n",
|
| 477 |
+
" 'antibi': 4,\n",
|
| 478 |
+
" 'inery': 13,\n",
|
| 479 |
+
" 'tural': 7,\n",
|
| 480 |
+
" 'perspect': 1,\n",
|
| 481 |
+
" 'grey': 7,\n",
|
| 482 |
+
" 'necessarily': 8,\n",
|
| 483 |
+
" 'iencies': 1,\n",
|
| 484 |
+
" 'Cinc': 3,\n",
|
| 485 |
+
" 'amy': 1,\n",
|
| 486 |
+
" 'Performan': 1,\n",
|
| 487 |
+
" 'itic': 2,\n",
|
| 488 |
+
" '003': 2,\n",
|
| 489 |
+
" 'pecu': 1,\n",
|
| 490 |
+
" 'ambers': 1,\n",
|
| 491 |
+
" 'berra': 8,\n",
|
| 492 |
+
" 'incar': 1,\n",
|
| 493 |
+
" 'itchen': 3,\n",
|
| 494 |
+
" 'BS': 2,\n",
|
| 495 |
+
" 'passeng': 2,\n",
|
| 496 |
+
" 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX': 2,\n",
|
| 497 |
+
" 'phosp': 4,\n",
|
| 498 |
+
" 'ernand': 3,\n",
|
| 499 |
+
" 'territ': 2,\n",
|
| 500 |
+
" 'inity': 7,\n",
|
| 501 |
+
" 'promin': 2,\n",
|
| 502 |
+
" 'Sul': 1,\n",
|
| 503 |
+
" 'minster': 1,\n",
|
| 504 |
+
" 'ctica': 1,\n",
|
| 505 |
+
" 'thern': 3,\n",
|
| 506 |
+
" 'minerals': 1,\n",
|
| 507 |
+
" 'solely': 1,\n",
|
| 508 |
+
" 'hydr': 1,\n",
|
| 509 |
+
" 'ribut': 2,\n",
|
| 510 |
+
" 'knocked': 5,\n",
|
| 511 |
+
" 'auded': 1,\n",
|
| 512 |
+
" 'illi': 2,\n",
|
| 513 |
+
" 'ichever': 2,\n",
|
| 514 |
+
" 'performan': 6,\n",
|
| 515 |
+
" 'A1': 2,\n",
|
| 516 |
+
" 'iance': 1,\n",
|
| 517 |
+
" 'Milwau': 2,\n",
|
| 518 |
+
" 'Feat': 1,\n",
|
| 519 |
+
" 'accompan': 1,\n",
|
| 520 |
+
" 'atche': 3,\n",
|
| 521 |
+
" 'href': 1,\n",
|
| 522 |
+
" 'Ole': 2,\n",
|
| 523 |
+
" 'gomery': 6,\n",
|
| 524 |
+
" 'rhyth': 2,\n",
|
| 525 |
+
" 'mouth': 3,\n",
|
| 526 |
+
" 'nomine': 4,\n",
|
| 527 |
+
" 'Jup': 1,\n",
|
| 528 |
+
" 'mouths': 1,\n",
|
| 529 |
+
" 'Mediter': 1,\n",
|
| 530 |
+
" 'etsk': 1,\n",
|
| 531 |
+
" 'icular': 3,\n",
|
| 532 |
+
" 'gur': 1,\n",
|
| 533 |
+
" 'dale': 1,\n",
|
| 534 |
+
" 'XG': 1,\n",
|
| 535 |
+
" 'BLO': 1,\n",
|
| 536 |
+
" 'Dire': 1,\n",
|
| 537 |
+
" 'predecess': 1,\n",
|
| 538 |
+
" 'reliant': 3,\n",
|
| 539 |
+
" 'izoph': 1,\n",
|
| 540 |
+
" 'hefty': 3,\n",
|
| 541 |
+
" 'reper': 3,\n",
|
| 542 |
+
" 'coron': 1,\n",
|
| 543 |
+
" 'occas': 1,\n",
|
| 544 |
+
" 'itating': 1,\n",
|
| 545 |
+
" 'vertisement': 1,\n",
|
| 546 |
+
" 'depos': 1,\n",
|
| 547 |
+
" 'oldown': 1,\n",
|
| 548 |
+
" 'otro': 1,\n",
|
| 549 |
+
" 'Pere': 2,\n",
|
| 550 |
+
" 'Chi': 1,\n",
|
| 551 |
+
" 'portray': 1,\n",
|
| 552 |
+
" 'Damasc': 2,\n",
|
| 553 |
+
" 'portrayed': 1,\n",
|
| 554 |
+
" 'neurological': 1,\n",
|
| 555 |
+
" 'Shakespe': 1,\n",
|
| 556 |
+
" 'vironments': 1,\n",
|
| 557 |
+
" 'IoT': 1,\n",
|
| 558 |
+
" 'solute': 1,\n",
|
| 559 |
+
" 'prefers': 1,\n",
|
| 560 |
+
" 'dinosa': 1,\n",
|
| 561 |
+
" 'thanol': 1,\n",
|
| 562 |
+
" 'respon': 1,\n",
|
| 563 |
+
" 'RX': 1,\n",
|
| 564 |
+
" 'adays': 4,\n",
|
| 565 |
+
" 'Inspe': 2,\n",
|
| 566 |
+
" 'manner': 1,\n",
|
| 567 |
+
" 'subjected': 4,\n",
|
| 568 |
+
" 'cription': 1,\n",
|
| 569 |
+
" 'inosa': 3,\n",
|
| 570 |
+
" 'whereas': 1,\n",
|
| 571 |
+
" 'Myan': 1,\n",
|
| 572 |
+
" 'headaches': 1,\n",
|
| 573 |
+
" 'admire': 1,\n",
|
| 574 |
+
" 'landsc': 2,\n",
|
| 575 |
+
" 'icul': 1,\n",
|
| 576 |
+
" 'membr': 1,\n",
|
| 577 |
+
" 'entrepre': 1,\n",
|
| 578 |
+
" 'contracep': 1,\n",
|
| 579 |
+
" 'OE': 1,\n",
|
| 580 |
+
" 'responsib': 1,\n",
|
| 581 |
+
" 'XXXXXXXXXXXXXXXX': 1,\n",
|
| 582 |
+
" 'certific': 1,\n",
|
| 583 |
+
" 'ception': 1,\n",
|
| 584 |
+
" 'inflammatory': 1,\n",
|
| 585 |
+
" 'inh': 1,\n",
|
| 586 |
+
" 'reactive': 1,\n",
|
| 587 |
+
" 'arring': 1,\n",
|
| 588 |
+
" 'ral': 1,\n",
|
| 589 |
+
" 'enormous': 1,\n",
|
| 590 |
+
" 'behavi': 1,\n",
|
| 591 |
+
" 'frontal': 2,\n",
|
| 592 |
+
" 'impe': 3,\n",
|
| 593 |
+
" 'oliber': 1,\n",
|
| 594 |
+
" 'charac': 1,\n",
|
| 595 |
+
" 'helicop': 1,\n",
|
| 596 |
+
" 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX': 1,\n",
|
| 597 |
+
" 'malink': 1,\n",
|
| 598 |
+
" 'thumb': 1,\n",
|
| 599 |
+
" 'igue': 1,\n",
|
| 600 |
+
" 'influencing': 1,\n",
|
| 601 |
+
" 'enna': 1,\n",
|
| 602 |
+
" 'discre': 1,\n",
|
| 603 |
+
" 'Pover': 1,\n",
|
| 604 |
+
" 'teous': 1,\n",
|
| 605 |
+
" 'toos': 1,\n",
|
| 606 |
+
" 'URE': 1,\n",
|
| 607 |
+
" 'DX': 1,\n",
|
| 608 |
+
" 'trig': 1}"
|
| 609 |
+
]
|
| 610 |
+
},
|
| 611 |
+
"execution_count": 15,
|
| 612 |
+
"metadata": {},
|
| 613 |
+
"output_type": "execute_result"
|
| 614 |
+
}
|
| 615 |
+
],
|
| 616 |
+
"source": [
|
| 617 |
+
"en_word_dict = {}\n",
|
| 618 |
+
"for dna_word in dna_eng_dict_optimized:\n",
|
| 619 |
+
" en_word = dna_eng_dict_optimized[dna_word]\n",
|
| 620 |
+
" en_word_dict.setdefault(en_word,0)\n",
|
| 621 |
+
" en_word_dict[en_word] = en_word_dict[en_word] + 1\n",
|
| 622 |
+
"\n",
|
| 623 |
+
"en_word_dict"
|
| 624 |
+
]
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"cell_type": "code",
|
| 628 |
+
"execution_count": 25,
|
| 629 |
+
"id": "c36edad3-e33e-4fd7-a461-84c7c995c779",
|
| 630 |
+
"metadata": {},
|
| 631 |
+
"outputs": [],
|
| 632 |
+
"source": [
|
| 633 |
+
"import random\n",
|
| 634 |
+
"from sklearn.neighbors import NearestNeighbors\n",
|
| 635 |
+
"import numpy as np\n",
|
| 636 |
+
"import torch\n",
|
| 637 |
+
"\n",
|
| 638 |
+
"def find_most_similar_with_randomization(dna_word_vect_dict, eng_word_vect_dict, top_k=500):\n",
|
| 639 |
+
" \"\"\"\n",
|
| 640 |
+
" 使用 KD-Tree 加速 DNA 单词到英文单词的匹配,并随机选择最近的 top_k 单词中的一个作为映射。\n",
|
| 641 |
+
"\n",
|
| 642 |
+
" 参数:\n",
|
| 643 |
+
" dna_word_vect_dict (dict): DNA 单词与其向量的字典 {dna_word: dna_vector}.\n",
|
| 644 |
+
" eng_word_vect_dict (dict): 英文单词与其向量的字典 {eng_word: eng_vector}.\n",
|
| 645 |
+
" top_k (int): 随机选择时从最近的 top_k 单词中选取。\n",
|
| 646 |
+
"\n",
|
| 647 |
+
" 返回:\n",
|
| 648 |
+
" dict: DNA 单词到英文单词的映射词典 {dna_word: random_eng_word_from_top_k}.\n",
|
| 649 |
+
" \"\"\"\n",
|
| 650 |
+
" # 构建英文单词向量矩阵和对应单词列表\n",
|
| 651 |
+
" eng_words = list(eng_word_vect_dict.keys())\n",
|
| 652 |
+
" \n",
|
| 653 |
+
" # 确保向量在 CPU 上并转换为 NumPy 数组\n",
|
| 654 |
+
" eng_vectors = np.array([v.cpu().numpy() if isinstance(v, torch.Tensor) else v for v in eng_word_vect_dict.values()])\n",
|
| 655 |
+
"\n",
|
| 656 |
+
" # 初始化最近邻搜索模型\n",
|
| 657 |
+
" nn_model = NearestNeighbors(metric=\"cosine\").fit(eng_vectors)\n",
|
| 658 |
+
"\n",
|
| 659 |
+
" dna_eng_dict = {}\n",
|
| 660 |
+
"\n",
|
| 661 |
+
" for dna_word, dna_vector in dna_word_vect_dict.items():\n",
|
| 662 |
+
" # 将 DNA 向量确保在 CPU 并转换为 NumPy 数组\n",
|
| 663 |
+
" if isinstance(dna_vector, torch.Tensor):\n",
|
| 664 |
+
" dna_vector = dna_vector.cpu().numpy()\n",
|
| 665 |
+
"\n",
|
| 666 |
+
" # 查找最近的 top_k 英文单词\n",
|
| 667 |
+
" distances, indices = nn_model.kneighbors([dna_vector], n_neighbors=top_k)\n",
|
| 668 |
+
" top_k_eng_words = [eng_words[idx] for idx in indices[0]]\n",
|
| 669 |
+
"\n",
|
| 670 |
+
" # 随机选择一个单词\n",
|
| 671 |
+
" random_eng_word = random.choice(top_k_eng_words)\n",
|
| 672 |
+
"\n",
|
| 673 |
+
" # 记录匹配结果\n",
|
| 674 |
+
" dna_eng_dict[dna_word] = random_eng_word\n",
|
| 675 |
+
"\n",
|
| 676 |
+
" return dna_eng_dict\n",
|
| 677 |
+
"\n",
|
| 678 |
+
"# 示例调用\n",
|
| 679 |
+
"dna_eng_dict_randomized = find_most_similar_with_randomization(dna_word_vect_dict, eng_word_vect_dict, top_k=100)"
|
| 680 |
+
]
|
| 681 |
+
},
|
| 682 |
+
{
|
| 683 |
+
"cell_type": "code",
|
| 684 |
+
"execution_count": 32,
|
| 685 |
+
"id": "8e68e6e6-3c91-402e-8cac-04d595e64c0c",
|
| 686 |
+
"metadata": {},
|
| 687 |
+
"outputs": [
|
| 688 |
+
{
|
| 689 |
+
"data": {
|
| 690 |
+
"text/plain": [
|
| 691 |
+
"618"
|
| 692 |
+
]
|
| 693 |
+
},
|
| 694 |
+
"execution_count": 32,
|
| 695 |
+
"metadata": {},
|
| 696 |
+
"output_type": "execute_result"
|
| 697 |
+
}
|
| 698 |
+
],
|
| 699 |
+
"source": [
|
| 700 |
+
"en_word_dict = {}\n",
|
| 701 |
+
"for dna_word in dna_eng_dict_randomized:\n",
|
| 702 |
+
" en_word = dna_eng_dict_randomized[dna_word]\n",
|
| 703 |
+
" en_word_dict.setdefault(en_word,0)\n",
|
| 704 |
+
" en_word_dict[en_word] = en_word_dict[en_word] + 1\n",
|
| 705 |
+
"\n",
|
| 706 |
+
"len(en_word_dict)"
|
| 707 |
+
]
|
| 708 |
+
},
|
| 709 |
+
{
|
| 710 |
+
"cell_type": "code",
|
| 711 |
+
"execution_count": 33,
|
| 712 |
+
"id": "490818e7-f635-4897-94ab-511dfd9ea78e",
|
| 713 |
+
"metadata": {},
|
| 714 |
+
"outputs": [],
|
| 715 |
+
"source": [
|
| 716 |
+
"def add_unique_suffix_to_dict(dna_eng_dict):\n",
|
| 717 |
+
" \"\"\"\n",
|
| 718 |
+
" 为 DNA 到英文单词的映射词典添加唯一后缀,防止多个 DNA 单词对应同一个英文单词。\n",
|
| 719 |
+
"\n",
|
| 720 |
+
" 参数:\n",
|
| 721 |
+
" dna_eng_dict (dict): {dna_word: eng_word} 形式的映射词典。\n",
|
| 722 |
+
"\n",
|
| 723 |
+
" 返回:\n",
|
| 724 |
+
" dict: 添加后缀后的映射词典。\n",
|
| 725 |
+
" \"\"\"\n",
|
| 726 |
+
" # 统计每个英文单词的映射次数\n",
|
| 727 |
+
" eng_word_count = {}\n",
|
| 728 |
+
" for dna_word, eng_word in dna_eng_dict.items():\n",
|
| 729 |
+
" if eng_word not in eng_word_count:\n",
|
| 730 |
+
" eng_word_count[eng_word] = 0\n",
|
| 731 |
+
" eng_word_count[eng_word] += 1\n",
|
| 732 |
+
"\n",
|
| 733 |
+
" # 为映射次数超过 1 的英文单词添加后缀\n",
|
| 734 |
+
" eng_word_suffix_count = {key: 1 for key in eng_word_count.keys()}\n",
|
| 735 |
+
" updated_dict = {}\n",
|
| 736 |
+
" for dna_word, eng_word in dna_eng_dict.items():\n",
|
| 737 |
+
" if eng_word_count[eng_word] > 1:\n",
|
| 738 |
+
" # 添加后缀\n",
|
| 739 |
+
" unique_eng_word = f\"{eng_word}{eng_word_suffix_count[eng_word]}\"\n",
|
| 740 |
+
" eng_word_suffix_count[eng_word] += 1\n",
|
| 741 |
+
" else:\n",
|
| 742 |
+
" unique_eng_word = eng_word\n",
|
| 743 |
+
" updated_dict[dna_word] = unique_eng_word\n",
|
| 744 |
+
"\n",
|
| 745 |
+
" return updated_dict\n",
|
| 746 |
+
"\n",
|
| 747 |
+
"# 示例调用\n",
|
| 748 |
+
"dna_eng_dict_unique = add_unique_suffix_to_dict(dna_eng_dict_randomized)"
|
| 749 |
+
]
|
| 750 |
+
},
|
| 751 |
+
{
|
| 752 |
+
"cell_type": "code",
|
| 753 |
+
"execution_count": 35,
|
| 754 |
+
"id": "be92a8a7-37c8-4b03-b400-026308d20a36",
|
| 755 |
+
"metadata": {},
|
| 756 |
+
"outputs": [],
|
| 757 |
+
"source": [
|
| 758 |
+
"import json\n",
|
| 759 |
+
"\n",
|
| 760 |
+
"# 保存 dna_eng_dict_unique 到 JSON 文件\n",
|
| 761 |
+
"output_file = \"dna_eng_dict_unique.json\"\n",
|
| 762 |
+
"\n",
|
| 763 |
+
"with open(output_file, \"w\") as f:\n",
|
| 764 |
+
" json.dump(dna_eng_dict_unique, f, indent=4)"
|
| 765 |
+
]
|
| 766 |
+
},
|
| 767 |
+
{
|
| 768 |
+
"cell_type": "code",
|
| 769 |
+
"execution_count": null,
|
| 770 |
+
"id": "afa3987d-8c1f-46cd-b954-e3ec0ada5faa",
|
| 771 |
+
"metadata": {},
|
| 772 |
+
"outputs": [],
|
| 773 |
+
"source": []
|
| 774 |
+
}
|
| 775 |
+
],
|
| 776 |
+
"metadata": {
|
| 777 |
+
"kernelspec": {
|
| 778 |
+
"display_name": "Python 3 (ipykernel)",
|
| 779 |
+
"language": "python",
|
| 780 |
+
"name": "python3"
|
| 781 |
+
},
|
| 782 |
+
"language_info": {
|
| 783 |
+
"codemirror_mode": {
|
| 784 |
+
"name": "ipython",
|
| 785 |
+
"version": 3
|
| 786 |
+
},
|
| 787 |
+
"file_extension": ".py",
|
| 788 |
+
"mimetype": "text/x-python",
|
| 789 |
+
"name": "python",
|
| 790 |
+
"nbconvert_exporter": "python",
|
| 791 |
+
"pygments_lexer": "ipython3",
|
| 792 |
+
"version": "3.12.3"
|
| 793 |
+
}
|
| 794 |
+
},
|
| 795 |
+
"nbformat": 4,
|
| 796 |
+
"nbformat_minor": 5
|
| 797 |
+
}
|
best_model/gpt2_gene_en_ft_dna_protein_pair_test_others.ipynb
ADDED
|
@@ -0,0 +1,1111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "1ff351d4-ec43-4337-b526-86e641611680",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"data": {
|
| 11 |
+
"text/plain": [
|
| 12 |
+
"\"\\nimport os\\n\\n# 设置环境变量\\nos.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\\n\\n# 打印环境变量以确认设置成功\\nprint(os.environ.get('HF_ENDPOINT')\\n\""
|
| 13 |
+
]
|
| 14 |
+
},
|
| 15 |
+
"execution_count": 1,
|
| 16 |
+
"metadata": {},
|
| 17 |
+
"output_type": "execute_result"
|
| 18 |
+
}
|
| 19 |
+
],
|
| 20 |
+
"source": [
|
| 21 |
+
"import subprocess\n",
|
| 22 |
+
"import os\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 25 |
+
"output = result.stdout\n",
|
| 26 |
+
"for line in output.splitlines():\n",
|
| 27 |
+
" if '=' in line:\n",
|
| 28 |
+
" var, value = line.split('=', 1)\n",
|
| 29 |
+
" os.environ[var] = value\n",
|
| 30 |
+
"\n",
|
| 31 |
+
"'''\n",
|
| 32 |
+
"import os\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"# 设置环境变量\n",
|
| 35 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 36 |
+
"\n",
|
| 37 |
+
"# 打印环境变量以确认设置成功\n",
|
| 38 |
+
"print(os.environ.get('HF_ENDPOINT')\n",
|
| 39 |
+
"'''"
|
| 40 |
+
]
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"cell_type": "code",
|
| 44 |
+
"execution_count": 2,
|
| 45 |
+
"id": "0b92a446-c25a-4ae4-b32b-8ff9e1b8f320",
|
| 46 |
+
"metadata": {},
|
| 47 |
+
"outputs": [
|
| 48 |
+
{
|
| 49 |
+
"name": "stderr",
|
| 50 |
+
"output_type": "stream",
|
| 51 |
+
"text": [
|
| 52 |
+
"2025-02-10 00:25:00.462309: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 53 |
+
"2025-02-10 00:25:00.476690: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 54 |
+
"2025-02-10 00:25:00.492214: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 55 |
+
"2025-02-10 00:25:00.496840: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 56 |
+
"2025-02-10 00:25:00.508480: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 57 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 58 |
+
"2025-02-10 00:25:01.341392: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n",
|
| 59 |
+
"Using the latest cached version of the dataset since dnagpt/gene_lan_transfer couldn't be found on the Hugging Face Hub\n",
|
| 60 |
+
"Found the latest cached dataset configuration 'dna_protein_pair_rand' at /root/.cache/huggingface/datasets/dnagpt___gene_lan_transfer/dna_protein_pair_rand/0.0.0/fc103580e7cda0d9bc41947f4058887fdc81188c (last modified on Mon Feb 10 00:16:09 2025).\n"
|
| 61 |
+
]
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"data": {
|
| 65 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 66 |
+
"model_id": "37c331e8249b49058653c8524ab4267c",
|
| 67 |
+
"version_major": 2,
|
| 68 |
+
"version_minor": 0
|
| 69 |
+
},
|
| 70 |
+
"text/plain": [
|
| 71 |
+
"Map: 0%| | 0/14400 [00:00<?, ? examples/s]"
|
| 72 |
+
]
|
| 73 |
+
},
|
| 74 |
+
"metadata": {},
|
| 75 |
+
"output_type": "display_data"
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"data": {
|
| 79 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 80 |
+
"model_id": "648bdf2ad1a043a3949cb629aab056dd",
|
| 81 |
+
"version_major": 2,
|
| 82 |
+
"version_minor": 0
|
| 83 |
+
},
|
| 84 |
+
"text/plain": [
|
| 85 |
+
"Map: 0%| | 0/1600 [00:00<?, ? examples/s]"
|
| 86 |
+
]
|
| 87 |
+
},
|
| 88 |
+
"metadata": {},
|
| 89 |
+
"output_type": "display_data"
|
| 90 |
+
}
|
| 91 |
+
],
|
| 92 |
+
"source": [
|
| 93 |
+
"from datasets import load_dataset\n",
|
| 94 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 95 |
+
"from transformers import Trainer\n",
|
| 96 |
+
"import evaluate\n",
|
| 97 |
+
"import numpy as np\n",
|
| 98 |
+
"from transformers import TrainingArguments\n",
|
| 99 |
+
"from transformers import AutoModelForSequenceClassification\n",
|
| 100 |
+
"\n",
|
| 101 |
+
"\n",
|
| 102 |
+
"# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象\n",
|
| 103 |
+
"#raw_datasets = load_dataset('paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x\n",
|
| 104 |
+
"#raw_datasets = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_150bp')['train'].train_test_split(test_size=0.1)\n",
|
| 105 |
+
"raw_datasets = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 106 |
+
"\n",
|
| 107 |
+
"\n",
|
| 108 |
+
"#分词器\n",
|
| 109 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"dnagpt/gene_eng_gpt2_v1\")\n",
|
| 110 |
+
"tokenizer.pad_token = tokenizer.eos_token\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"# 修改分词器的填充方向为左侧,默认有右侧,分类问题建议左侧\n",
|
| 113 |
+
"#tokenizer.padding_side = \"left\"\n",
|
| 114 |
+
"\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"#分词函数\n",
|
| 117 |
+
"def tokenize_function(example):\n",
|
| 118 |
+
" return tokenizer(example[\"sentence1\"], example[\"sentence2\"], truncation=True,max_length=256, padding=\"max_length\")\n",
|
| 119 |
+
" #return tokenizer(example[\"sentence1\"], example[\"sentence2\"], truncation=True,max_length=1024) #padding=\"max_length\")\n",
|
| 120 |
+
"\n",
|
| 121 |
+
"#构建分词后的数据集\n",
|
| 122 |
+
"tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)\n",
|
| 123 |
+
"\n",
|
| 124 |
+
"#训练数据构建\n",
|
| 125 |
+
"data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
|
| 126 |
+
]
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"cell_type": "code",
|
| 130 |
+
"execution_count": 3,
|
| 131 |
+
"id": "ba1a32f9-d548-4fae-ae66-f2961fadfc1c",
|
| 132 |
+
"metadata": {},
|
| 133 |
+
"outputs": [
|
| 134 |
+
{
|
| 135 |
+
"data": {
|
| 136 |
+
"text/plain": [
|
| 137 |
+
"{'sentence1': 'TTGAGTACCTTGAGTACCAAGGAACCCCTGGCGGCTATTGTCGGCCCCACGGCTACCGGTAAATCGACCATTGCCCTCAAGGTTGCCGCCCGGCTGGGGGCGGAGATAATCTCTGTGGATTCCGCCCAGGTTTACCGCGGTATGGATATTGGTACAGCAAAACTGCTCCCGGAGGAAAGGGTGGGGCCCGACGGCCGACCCATCCCCCACCACCTGATAGATATCGTCGATCCCGACGAGCCTTTCAGTGTAGCCGATTACCAGAAACTAGCCCGACAAACGATAACAGCCATCATCAGGAGGGGTCACCTGCCCCTTCTGGTCGGCGGTACAGGCCTGTATTATCAAGCGGTAGTCGATCCCTACCGCTTCACCCCGGAGGGGGGGGATCCCCGGGTCCGGCAGGAGCTCGAGGAGCTGGCGGCCAAGTTTGGTGACGCATATCTCCATGAACAATTGAAAAGGGTCGACCCGGAAGCGGCCAAACGGATACATCCCCATGACCGGCGCCGCCTGGTAAGGGCCCTGGAGGTTTTTAAAACAACCGGGCAACCCATATCGGCTGCCCTGGCCTGGCGCCGGCAACAGGAATCGCCCTATCATCTGGCGGCAGTAGCTCTCAGCATGCCCCGACCCCTCCTTTACCGACGCATCGAAGCCCGGGTCGATGCCATGATCGCAGCGGGCCTCATTGAAGAAGTTTCCCGCCTGCTGGCCCGGTACGATTACCGCCTACCGGCCCTCCAGGCCCTGGGTTATAAAGAAATCGGCGCTTATTTGCGTAAAGAAATAGAACTGGAGGAAGCAATAGCCATTTTAAAACGCAATACCAGACGTCTAGCTAAAAGGCAATTAACATGGTTCCGGCGCGACCGTCGCCTGCACTGGTGGGAAGTAGATCCGGATAAAATTGAGGAAATTTCAGCCGCTATTGCCGATTTTATTAGCAGGACAATTGATATTAATGTAGAATAG',\n",
|
| 138 |
+
" 'sentence2': 'MSTLSTKEPLAAIVGPTATGKSTIALKVAARLGAEIISVDSAQVYRGMDIGTAKLLPEERVGPDGRPIPHHLIDIVDPDEPFSVADYQKLARQTITAIIRRGHLPLLVGGTGLYYQAVVDPYRFTPEGGDPRVRQELEELAAKFGDAYLHEQLKRVDPEAAKRIHPHDRRRLVRALEVFKTTGQPISAALAWRRQQESPYHLAAVALSMPRPLLYRRIEARVDAMIAAGLIEEVSRLLARYDYRLPALQALGYKEIGAYLRKEIELEEAIAILKRNTRRLAKRQLTWFRRDRRLHWWEVDPDKIEEISAAIADFISRTIDINVE',\n",
|
| 139 |
+
" 'label': 1}"
|
| 140 |
+
]
|
| 141 |
+
},
|
| 142 |
+
"execution_count": 3,
|
| 143 |
+
"metadata": {},
|
| 144 |
+
"output_type": "execute_result"
|
| 145 |
+
}
|
| 146 |
+
],
|
| 147 |
+
"source": [
|
| 148 |
+
"raw_datasets[\"train\"][0]"
|
| 149 |
+
]
|
| 150 |
+
},
|
| 151 |
+
{
|
| 152 |
+
"cell_type": "code",
|
| 153 |
+
"execution_count": 4,
|
| 154 |
+
"id": "1209977a-00b4-471d-abdf-9b0264ce8cdf",
|
| 155 |
+
"metadata": {},
|
| 156 |
+
"outputs": [],
|
| 157 |
+
"source": [
|
| 158 |
+
"#指标函数定义\n",
|
| 159 |
+
"def compute_metrics(eval_pred):\n",
|
| 160 |
+
" predictions, labels = eval_pred\n",
|
| 161 |
+
" predictions = np.argmax(predictions, axis=1)\n",
|
| 162 |
+
" return {'accuracy': (predictions==labels).sum() / len(labels)}"
|
| 163 |
+
]
|
| 164 |
+
},
|
| 165 |
+
{
|
| 166 |
+
"cell_type": "code",
|
| 167 |
+
"execution_count": 5,
|
| 168 |
+
"id": "2c996c5b-0e8c-4956-a3a3-86cda2177f85",
|
| 169 |
+
"metadata": {},
|
| 170 |
+
"outputs": [
|
| 171 |
+
{
|
| 172 |
+
"name": "stderr",
|
| 173 |
+
"output_type": "stream",
|
| 174 |
+
"text": [
|
| 175 |
+
"/root/miniconda3/lib/python3.12/site-packages/transformers/training_args.py:1545: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
|
| 176 |
+
" warnings.warn(\n",
|
| 177 |
+
"Some weights of GPT2ForSequenceClassification were not initialized from the model checkpoint at dnagpt/gene_eng_gpt2_v1 and are newly initialized: ['score.weight']\n",
|
| 178 |
+
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
| 179 |
+
]
|
| 180 |
+
}
|
| 181 |
+
],
|
| 182 |
+
"source": [
|
| 183 |
+
"training_args = TrainingArguments(\n",
|
| 184 |
+
" output_dir=\"ds_job_dna_2222\",\n",
|
| 185 |
+
" learning_rate=1e-5,\n",
|
| 186 |
+
" lr_scheduler_type=\"constant_with_warmup\",\n",
|
| 187 |
+
" warmup_ratio=0.1,\n",
|
| 188 |
+
" optim='adamw_torch',\n",
|
| 189 |
+
" weight_decay=0.0,\n",
|
| 190 |
+
" per_device_train_batch_size=20,\n",
|
| 191 |
+
" per_device_eval_batch_size=20,\n",
|
| 192 |
+
" num_train_epochs=5, #训练多少轮\n",
|
| 193 |
+
" evaluation_strategy=\"epoch\",\n",
|
| 194 |
+
" save_strategy=\"epoch\",\n",
|
| 195 |
+
" logging_strategy=\"epoch\",\n",
|
| 196 |
+
" load_best_model_at_end=True\n",
|
| 197 |
+
")\n",
|
| 198 |
+
"\n",
|
| 199 |
+
"#模型定义,文本分类模型\n",
|
| 200 |
+
"model = AutoModelForSequenceClassification.from_pretrained(\"dnagpt/gene_eng_gpt2_v1\", num_labels=2)\n",
|
| 201 |
+
"model.config.pad_token_id = model.config.eos_token_id\n",
|
| 202 |
+
"\n",
|
| 203 |
+
"trainer = Trainer(\n",
|
| 204 |
+
" model,\n",
|
| 205 |
+
" training_args,\n",
|
| 206 |
+
" train_dataset=tokenized_datasets[\"train\"],\n",
|
| 207 |
+
" eval_dataset=tokenized_datasets[\"test\"],\n",
|
| 208 |
+
" data_collator=data_collator,\n",
|
| 209 |
+
" tokenizer=tokenizer,\n",
|
| 210 |
+
" compute_metrics=compute_metrics,\n",
|
| 211 |
+
")"
|
| 212 |
+
]
|
| 213 |
+
},
|
| 214 |
+
{
|
| 215 |
+
"cell_type": "code",
|
| 216 |
+
"execution_count": 6,
|
| 217 |
+
"id": "0964a53d-a60d-4364-99ca-0f04461b615b",
|
| 218 |
+
"metadata": {},
|
| 219 |
+
"outputs": [
|
| 220 |
+
{
|
| 221 |
+
"name": "stdout",
|
| 222 |
+
"output_type": "stream",
|
| 223 |
+
"text": [
|
| 224 |
+
"[2025-02-10 00:26:53,442] [INFO] [real_accelerator.py:219:get_accelerator] Setting ds_accelerator to cuda (auto detect)\n"
|
| 225 |
+
]
|
| 226 |
+
},
|
| 227 |
+
{
|
| 228 |
+
"name": "stderr",
|
| 229 |
+
"output_type": "stream",
|
| 230 |
+
"text": [
|
| 231 |
+
"/root/miniconda3/compiler_compat/ld: cannot find -laio: No such file or directory\n",
|
| 232 |
+
"collect2: error: ld returned 1 exit status\n",
|
| 233 |
+
"/root/miniconda3/compiler_compat/ld: warning: libpthread.so.0, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 234 |
+
"/root/miniconda3/compiler_compat/ld: warning: libstdc++.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 235 |
+
"/root/miniconda3/compiler_compat/ld: warning: libm.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 236 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::runtime_error::~runtime_error()@GLIBCXX_3.4'\n",
|
| 237 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__gxx_personality_v0@CXXABI_1.3'\n",
|
| 238 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::tellp()@GLIBCXX_3.4'\n",
|
| 239 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::steady_clock::now()@GLIBCXX_3.4.19'\n",
|
| 240 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_replace_aux(unsigned long, unsigned long, unsigned long, char)@GLIBCXX_3.4'\n",
|
| 241 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for bool@CXXABI_1.3'\n",
|
| 242 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_logic_error(char const*)@GLIBCXX_3.4'\n",
|
| 243 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 244 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::logic_error@GLIBCXX_3.4'\n",
|
| 245 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::~locale()@GLIBCXX_3.4'\n",
|
| 246 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 247 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_end_catch@CXXABI_1.3'\n",
|
| 248 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 249 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::logic_error::~logic_error()@GLIBCXX_3.4'\n",
|
| 250 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info@CXXABI_1.3'\n",
|
| 251 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 252 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 253 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new[](unsigned long)@GLIBCXX_3.4'\n",
|
| 254 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak_hard()@GLIBCXX_3.4'\n",
|
| 255 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 256 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::basic_streambuf(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 257 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 258 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)@GLIBCXX_3.4'\n",
|
| 259 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned short@CXXABI_1.3'\n",
|
| 260 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::resize(unsigned long, char)@GLIBCXX_3.4'\n",
|
| 261 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char const*@CXXABI_1.3'\n",
|
| 262 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'\n",
|
| 263 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_invalid_argument(char const*)@GLIBCXX_3.4'\n",
|
| 264 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::operator=(std::locale const&)@GLIBCXX_3.4'\n",
|
| 265 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 266 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 267 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_free_exception@CXXABI_1.3'\n",
|
| 268 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::notify_one()@GLIBCXX_3.4.11'\n",
|
| 269 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::~Init()@GLIBCXX_3.4'\n",
|
| 270 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@GLIBCXX_3.4'\n",
|
| 271 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_pure_virtual@CXXABI_1.3'\n",
|
| 272 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::flush()@GLIBCXX_3.4'\n",
|
| 273 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__class_type_info@CXXABI_1.3'\n",
|
| 274 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_rethrow@CXXABI_1.3'\n",
|
| 275 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 276 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_fstream<char, std::char_traits<char> >::~basic_fstream()@GLIBCXX_3.4'\n",
|
| 277 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::compare(char const*) const@GLIBCXX_3.4'\n",
|
| 278 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 279 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale()@GLIBCXX_3.4'\n",
|
| 280 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::system_clock::now()@GLIBCXX_3.4.19'\n",
|
| 281 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 282 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Hash_bytes(void const*, unsigned long, unsigned long)@CXXABI_1.3.5'\n",
|
| 283 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long long>(long long)@GLIBCXX_3.4.9'\n",
|
| 284 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char*@CXXABI_1.3'\n",
|
| 285 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const@GLIBCXX_3.4.18'\n",
|
| 286 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::out_of_range@GLIBCXX_3.4'\n",
|
| 287 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)@GLIBCXX_3.4.9'\n",
|
| 288 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 289 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::~ios_base()@GLIBCXX_3.4'\n",
|
| 290 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::range_error::~range_error()@GLIBCXX_3.4'\n",
|
| 291 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::~__basic_file()@GLIBCXX_3.4'\n",
|
| 292 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_acquire@CXXABI_1.3'\n",
|
| 293 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<bool>(bool)@GLIBCXX_3.4.9'\n",
|
| 294 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::overflow_error@GLIBCXX_3.4'\n",
|
| 295 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 296 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::range_error@GLIBCXX_3.4'\n",
|
| 297 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 298 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_filebuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 299 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete[](void*)@GLIBCXX_3.4'\n",
|
| 300 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 301 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(unsigned long, char, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 302 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 303 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::replace(unsigned long, unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 304 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::exception@GLIBCXX_3.4'\n",
|
| 305 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_destroy(std::allocator<wchar_t> const&)@GLIBCXX_3.4'\n",
|
| 306 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream& std::istream::_M_extract<double>(double&)@GLIBCXX_3.4.9'\n",
|
| 307 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 308 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 309 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 310 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(std::string const&)@GLIBCXX_3.4'\n",
|
| 311 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new(unsigned long)@GLIBCXX_3.4'\n",
|
| 312 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 313 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned int@CXXABI_1.3'\n",
|
| 314 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*)@GLIBCXX_3.4'\n",
|
| 315 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::domain_error@GLIBCXX_3.4'\n",
|
| 316 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char, unsigned long) const@GLIBCXX_3.4'\n",
|
| 317 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::put(char)@GLIBCXX_3.4'\n",
|
| 318 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int@CXXABI_1.3'\n",
|
| 319 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_alloc()@GLIBCXX_3.4'\n",
|
| 320 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_thread_atexit@CXXABI_1.3.7'\n",
|
| 321 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 322 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()@GLIBCXX_3.4'\n",
|
| 323 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::Init()@GLIBCXX_3.4'\n",
|
| 324 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::condition_variable()@GLIBCXX_3.4.11'\n",
|
| 325 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf()@GLIBCXX_3.4'\n",
|
| 326 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 327 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::domain_error::~domain_error()@GLIBCXX_3.4'\n",
|
| 328 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cerr@GLIBCXX_3.4'\n",
|
| 329 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char const*, unsigned long, unsigned long) const@GLIBCXX_3.4'\n",
|
| 330 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 331 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 332 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@GLIBCXX_3.4'\n",
|
| 333 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::invalid_argument@GLIBCXX_3.4'\n",
|
| 334 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void*@CXXABI_1.3'\n",
|
| 335 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(std::string const&)@GLIBCXX_3.4'\n",
|
| 336 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()@GLIBCXX_3.4'\n",
|
| 337 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 338 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long@CXXABI_1.3'\n",
|
| 339 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 340 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_unhook()@GLIBCXX_3.4.15'\n",
|
| 341 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 342 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(char*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 343 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<char, std::char_traits<char> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 344 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 345 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 346 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `log2f@GLIBC_2.2.5'\n",
|
| 347 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 348 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 349 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::exception::~exception()@GLIBCXX_3.4'\n",
|
| 350 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 351 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::is_open() const@GLIBCXX_3.4'\n",
|
| 352 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_istringstream()@GLIBCXX_3.4'\n",
|
| 353 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::swap(std::string&)@GLIBCXX_3.4'\n",
|
| 354 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long*@CXXABI_1.3'\n",
|
| 355 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 356 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::basic_streambuf(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 357 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 358 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_cast()@GLIBCXX_3.4'\n",
|
| 359 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)@GLIBCXX_3.4'\n",
|
| 360 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::operator=(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 361 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete(void*)@GLIBCXX_3.4'\n",
|
| 362 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(int)@GLIBCXX_3.4'\n",
|
| 363 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 364 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_M_destroy(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 365 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<wchar_t, std::char_traits<wchar_t> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 366 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::runtime_error@GLIBCXX_3.4'\n",
|
| 367 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 368 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 369 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()@GLIBCXX_3.4'\n",
|
| 370 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 371 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long>(long)@GLIBCXX_3.4.9'\n",
|
| 372 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::get()@GLIBCXX_3.4'\n",
|
| 373 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long long@CXXABI_1.3'\n",
|
| 374 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@GLIBCXX_3.4'\n",
|
| 375 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::out_of_range::~out_of_range()@GLIBCXX_3.4'\n",
|
| 376 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::length_error::~length_error()@GLIBCXX_3.4'\n",
|
| 377 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)@GLIBCXX_3.4.9'\n",
|
| 378 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::invalid_argument::~invalid_argument()@GLIBCXX_3.4'\n",
|
| 379 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::swap(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)@GLIBCXX_3.4'\n",
|
| 380 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cout@GLIBCXX_3.4'\n",
|
| 381 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long long>(unsigned long long)@GLIBCXX_3.4.9'\n",
|
| 382 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int*@CXXABI_1.3'\n",
|
| 383 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<void const*>(void const*)@GLIBCXX_3.4.9'\n",
|
| 384 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::underflow_error@GLIBCXX_3.4'\n",
|
| 385 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 386 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::out_of_range@GLIBCXX_3.4'\n",
|
| 387 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_allocate_exception@CXXABI_1.3'\n",
|
| 388 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 389 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void const*@CXXABI_1.3'\n",
|
| 390 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::init(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >*)@GLIBCXX_3.4'\n",
|
| 391 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::reserve(unsigned long)@GLIBCXX_3.4'\n",
|
| 392 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_begin_catch@CXXABI_1.3'\n",
|
| 393 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long@CXXABI_1.3'\n",
|
| 394 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 395 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak()@GLIBCXX_3.4'\n",
|
| 396 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 397 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_sync(wchar_t*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 398 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::getline(char*, long, char)@GLIBCXX_3.4'\n",
|
| 399 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char)@GLIBCXX_3.4'\n",
|
| 400 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 401 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::~condition_variable()@GLIBCXX_3.4.11'\n",
|
| 402 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 403 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::insert(unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 404 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 405 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned char@CXXABI_1.3'\n",
|
| 406 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::ios_base()@GLIBCXX_3.4'\n",
|
| 407 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_out_of_range(char const*)@GLIBCXX_3.4'\n",
|
| 408 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::overflow_error::~overflow_error()@GLIBCXX_3.4'\n",
|
| 409 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_length_error(char const*)@GLIBCXX_3.4'\n",
|
| 410 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_system_error(int)@GLIBCXX_3.4.11'\n",
|
| 411 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 412 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<double>(double)@GLIBCXX_3.4.9'\n",
|
| 413 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::operator=(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 414 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long long@CXXABI_1.3'\n",
|
| 415 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 416 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 417 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_release@CXXABI_1.3'\n",
|
| 418 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_throw@CXXABI_1.3'\n",
|
| 419 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::underflow_error::~underflow_error()@GLIBCXX_3.4'\n",
|
| 420 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 421 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::length_error@GLIBCXX_3.4'\n",
|
| 422 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf()@GLIBCXX_3.4'\n",
|
| 423 |
+
"collect2: error: ld returned 1 exit status\n"
|
| 424 |
+
]
|
| 425 |
+
},
|
| 426 |
+
{
|
| 427 |
+
"data": {
|
| 428 |
+
"text/html": [
|
| 429 |
+
"\n",
|
| 430 |
+
" <div>\n",
|
| 431 |
+
" \n",
|
| 432 |
+
" <progress value='3600' max='3600' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
| 433 |
+
" [3600/3600 09:30, Epoch 5/5]\n",
|
| 434 |
+
" </div>\n",
|
| 435 |
+
" <table border=\"1\" class=\"dataframe\">\n",
|
| 436 |
+
" <thead>\n",
|
| 437 |
+
" <tr style=\"text-align: left;\">\n",
|
| 438 |
+
" <th>Epoch</th>\n",
|
| 439 |
+
" <th>Training Loss</th>\n",
|
| 440 |
+
" <th>Validation Loss</th>\n",
|
| 441 |
+
" <th>Accuracy</th>\n",
|
| 442 |
+
" </tr>\n",
|
| 443 |
+
" </thead>\n",
|
| 444 |
+
" <tbody>\n",
|
| 445 |
+
" <tr>\n",
|
| 446 |
+
" <td>1</td>\n",
|
| 447 |
+
" <td>0.118400</td>\n",
|
| 448 |
+
" <td>0.017560</td>\n",
|
| 449 |
+
" <td>0.997500</td>\n",
|
| 450 |
+
" </tr>\n",
|
| 451 |
+
" <tr>\n",
|
| 452 |
+
" <td>2</td>\n",
|
| 453 |
+
" <td>0.021100</td>\n",
|
| 454 |
+
" <td>0.012475</td>\n",
|
| 455 |
+
" <td>0.997500</td>\n",
|
| 456 |
+
" </tr>\n",
|
| 457 |
+
" <tr>\n",
|
| 458 |
+
" <td>3</td>\n",
|
| 459 |
+
" <td>0.015300</td>\n",
|
| 460 |
+
" <td>0.008951</td>\n",
|
| 461 |
+
" <td>0.998125</td>\n",
|
| 462 |
+
" </tr>\n",
|
| 463 |
+
" <tr>\n",
|
| 464 |
+
" <td>4</td>\n",
|
| 465 |
+
" <td>0.007200</td>\n",
|
| 466 |
+
" <td>0.038701</td>\n",
|
| 467 |
+
" <td>0.994375</td>\n",
|
| 468 |
+
" </tr>\n",
|
| 469 |
+
" <tr>\n",
|
| 470 |
+
" <td>5</td>\n",
|
| 471 |
+
" <td>0.010600</td>\n",
|
| 472 |
+
" <td>0.021079</td>\n",
|
| 473 |
+
" <td>0.996875</td>\n",
|
| 474 |
+
" </tr>\n",
|
| 475 |
+
" </tbody>\n",
|
| 476 |
+
"</table><p>"
|
| 477 |
+
],
|
| 478 |
+
"text/plain": [
|
| 479 |
+
"<IPython.core.display.HTML object>"
|
| 480 |
+
]
|
| 481 |
+
},
|
| 482 |
+
"metadata": {},
|
| 483 |
+
"output_type": "display_data"
|
| 484 |
+
},
|
| 485 |
+
{
|
| 486 |
+
"data": {
|
| 487 |
+
"text/plain": [
|
| 488 |
+
"TrainOutput(global_step=3600, training_loss=0.03451399882634481, metrics={'train_runtime': 571.3197, 'train_samples_per_second': 126.024, 'train_steps_per_second': 6.301, 'total_flos': 9406683021312000.0, 'train_loss': 0.03451399882634481, 'epoch': 5.0})"
|
| 489 |
+
]
|
| 490 |
+
},
|
| 491 |
+
"execution_count": 6,
|
| 492 |
+
"metadata": {},
|
| 493 |
+
"output_type": "execute_result"
|
| 494 |
+
}
|
| 495 |
+
],
|
| 496 |
+
"source": [
|
| 497 |
+
"trainer.train() #模型训练"
|
| 498 |
+
]
|
| 499 |
+
},
|
| 500 |
+
{
|
| 501 |
+
"cell_type": "code",
|
| 502 |
+
"execution_count": 7,
|
| 503 |
+
"id": "59f75608-0756-4783-b8e0-96d0286c9502",
|
| 504 |
+
"metadata": {},
|
| 505 |
+
"outputs": [],
|
| 506 |
+
"source": [
|
| 507 |
+
"model.save_pretrained(\"gpt2_dna_ft_5\")"
|
| 508 |
+
]
|
| 509 |
+
},
|
| 510 |
+
{
|
| 511 |
+
"cell_type": "code",
|
| 512 |
+
"execution_count": 8,
|
| 513 |
+
"id": "2a621183-2fe9-404c-9680-2872713155a0",
|
| 514 |
+
"metadata": {},
|
| 515 |
+
"outputs": [
|
| 516 |
+
{
|
| 517 |
+
"data": {
|
| 518 |
+
"text/html": [],
|
| 519 |
+
"text/plain": [
|
| 520 |
+
"<IPython.core.display.HTML object>"
|
| 521 |
+
]
|
| 522 |
+
},
|
| 523 |
+
"metadata": {},
|
| 524 |
+
"output_type": "display_data"
|
| 525 |
+
},
|
| 526 |
+
{
|
| 527 |
+
"name": "stderr",
|
| 528 |
+
"output_type": "stream",
|
| 529 |
+
"text": [
|
| 530 |
+
"Using the latest cached version of the module from /root/.cache/huggingface/modules/evaluate_modules/metrics/evaluate-metric--glue/05234ba7acc44554edcca0978db5fa3bc600eeee66229abe79ff9887eacaf3ed (last modified on Sat Feb 1 18:33:18 2025) since it couldn't be found locally at evaluate-metric--glue, or remotely on the Hugging Face Hub.\n"
|
| 531 |
+
]
|
| 532 |
+
},
|
| 533 |
+
{
|
| 534 |
+
"name": "stdout",
|
| 535 |
+
"output_type": "stream",
|
| 536 |
+
"text": [
|
| 537 |
+
"{'accuracy': 0.998125, 'f1': 0.998104864181933}\n"
|
| 538 |
+
]
|
| 539 |
+
}
|
| 540 |
+
],
|
| 541 |
+
"source": [
|
| 542 |
+
"#模型测试,英文数据集\n",
|
| 543 |
+
"result = {}\n",
|
| 544 |
+
"predictions = trainer.predict(tokenized_datasets[\"test\"])\n",
|
| 545 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 546 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 547 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 548 |
+
"print(ret)\n",
|
| 549 |
+
"result[\"en\"] = ret"
|
| 550 |
+
]
|
| 551 |
+
},
|
| 552 |
+
{
|
| 553 |
+
"cell_type": "markdown",
|
| 554 |
+
"id": "7c0d2d33-1eca-44df-9bee-a4a9ba60ce1b",
|
| 555 |
+
"metadata": {},
|
| 556 |
+
"source": [
|
| 557 |
+
"## 其他自然语言测试"
|
| 558 |
+
]
|
| 559 |
+
},
|
| 560 |
+
{
|
| 561 |
+
"cell_type": "code",
|
| 562 |
+
"execution_count": 9,
|
| 563 |
+
"id": "c149b679-1347-4c97-a726-28469b38e629",
|
| 564 |
+
"metadata": {},
|
| 565 |
+
"outputs": [
|
| 566 |
+
{
|
| 567 |
+
"name": "stderr",
|
| 568 |
+
"output_type": "stream",
|
| 569 |
+
"text": [
|
| 570 |
+
"Using the latest cached version of the dataset since paws-x couldn't be found on the Hugging Face Hub\n",
|
| 571 |
+
"Found the latest cached dataset configuration 'fr' at /root/.cache/huggingface/datasets/paws-x/fr/0.0.0/4cd8187c404bda33cb1f62b49b001115862acf37 (last modified on Sat Feb 8 09:41:42 2025).\n"
|
| 572 |
+
]
|
| 573 |
+
},
|
| 574 |
+
{
|
| 575 |
+
"data": {
|
| 576 |
+
"text/html": [],
|
| 577 |
+
"text/plain": [
|
| 578 |
+
"<IPython.core.display.HTML object>"
|
| 579 |
+
]
|
| 580 |
+
},
|
| 581 |
+
"metadata": {},
|
| 582 |
+
"output_type": "display_data"
|
| 583 |
+
},
|
| 584 |
+
{
|
| 585 |
+
"name": "stderr",
|
| 586 |
+
"output_type": "stream",
|
| 587 |
+
"text": [
|
| 588 |
+
"Using the latest cached version of the module from /root/.cache/huggingface/modules/evaluate_modules/metrics/evaluate-metric--glue/05234ba7acc44554edcca0978db5fa3bc600eeee66229abe79ff9887eacaf3ed (last modified on Sat Feb 1 18:33:18 2025) since it couldn't be found locally at evaluate-metric--glue, or remotely on the Hugging Face Hub.\n"
|
| 589 |
+
]
|
| 590 |
+
},
|
| 591 |
+
{
|
| 592 |
+
"name": "stdout",
|
| 593 |
+
"output_type": "stream",
|
| 594 |
+
"text": [
|
| 595 |
+
"{'accuracy': 0.535, 'f1': 0.3857331571994716}\n"
|
| 596 |
+
]
|
| 597 |
+
}
|
| 598 |
+
],
|
| 599 |
+
"source": [
|
| 600 |
+
"#模型测试,法文数据集\n",
|
| 601 |
+
"raw_datasets_fr = load_dataset('paws-x', 'fr') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x\n",
|
| 602 |
+
"tokenized_datasets_fr = raw_datasets_fr.map(tokenize_function, batched=True)\n",
|
| 603 |
+
"\n",
|
| 604 |
+
"predictions = trainer.predict(tokenized_datasets_fr[\"test\"])\n",
|
| 605 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 606 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 607 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 608 |
+
"print(ret)\n",
|
| 609 |
+
"result[\"fr\"] = ret"
|
| 610 |
+
]
|
| 611 |
+
},
|
| 612 |
+
{
|
| 613 |
+
"cell_type": "code",
|
| 614 |
+
"execution_count": 10,
|
| 615 |
+
"id": "158fe03f-4cf1-456a-b5b3-cf46e3ca47eb",
|
| 616 |
+
"metadata": {},
|
| 617 |
+
"outputs": [
|
| 618 |
+
{
|
| 619 |
+
"name": "stderr",
|
| 620 |
+
"output_type": "stream",
|
| 621 |
+
"text": [
|
| 622 |
+
"Using the latest cached version of the dataset since google-research-datasets/paws-x couldn't be found on the Hugging Face Hub\n",
|
| 623 |
+
"Found the latest cached dataset configuration 'de' at /root/.cache/huggingface/datasets/google-research-datasets___paws-x/de/0.0.0/4cd8187c404bda33cb1f62b49b001115862acf37 (last modified on Fri Feb 7 11:21:19 2025).\n"
|
| 624 |
+
]
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"data": {
|
| 628 |
+
"text/html": [],
|
| 629 |
+
"text/plain": [
|
| 630 |
+
"<IPython.core.display.HTML object>"
|
| 631 |
+
]
|
| 632 |
+
},
|
| 633 |
+
"metadata": {},
|
| 634 |
+
"output_type": "display_data"
|
| 635 |
+
},
|
| 636 |
+
{
|
| 637 |
+
"name": "stderr",
|
| 638 |
+
"output_type": "stream",
|
| 639 |
+
"text": [
|
| 640 |
+
"Using the latest cached version of the module from /root/.cache/huggingface/modules/evaluate_modules/metrics/evaluate-metric--glue/05234ba7acc44554edcca0978db5fa3bc600eeee66229abe79ff9887eacaf3ed (last modified on Sat Feb 1 18:33:18 2025) since it couldn't be found locally at evaluate-metric--glue, or remotely on the Hugging Face Hub.\n"
|
| 641 |
+
]
|
| 642 |
+
},
|
| 643 |
+
{
|
| 644 |
+
"name": "stdout",
|
| 645 |
+
"output_type": "stream",
|
| 646 |
+
"text": [
|
| 647 |
+
"{'accuracy': 0.46, 'f1': 0.5690343176376695}\n"
|
| 648 |
+
]
|
| 649 |
+
}
|
| 650 |
+
],
|
| 651 |
+
"source": [
|
| 652 |
+
"#模型测试,德文数据集\n",
|
| 653 |
+
"raw_datasets_de = load_dataset('google-research-datasets/paws-x', 'de') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-\n",
|
| 654 |
+
"tokenized_datasets_de = raw_datasets_de.map(tokenize_function, batched=True)\n",
|
| 655 |
+
"predictions = trainer.predict(tokenized_datasets_de[\"test\"])\n",
|
| 656 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 657 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 658 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 659 |
+
"print(ret)\n",
|
| 660 |
+
"result[\"de\"] = ret"
|
| 661 |
+
]
|
| 662 |
+
},
|
| 663 |
+
{
|
| 664 |
+
"cell_type": "code",
|
| 665 |
+
"execution_count": 11,
|
| 666 |
+
"id": "51800395-5a52-4eab-90fc-acecd3b16a9d",
|
| 667 |
+
"metadata": {},
|
| 668 |
+
"outputs": [
|
| 669 |
+
{
|
| 670 |
+
"name": "stderr",
|
| 671 |
+
"output_type": "stream",
|
| 672 |
+
"text": [
|
| 673 |
+
"Using the latest cached version of the dataset since google-research-datasets/paws-x couldn't be found on the Hugging Face Hub\n",
|
| 674 |
+
"Found the latest cached dataset configuration 'zh' at /root/.cache/huggingface/datasets/google-research-datasets___paws-x/zh/0.0.0/4cd8187c404bda33cb1f62b49b001115862acf37 (last modified on Fri Feb 7 11:21:38 2025).\n"
|
| 675 |
+
]
|
| 676 |
+
},
|
| 677 |
+
{
|
| 678 |
+
"data": {
|
| 679 |
+
"text/html": [],
|
| 680 |
+
"text/plain": [
|
| 681 |
+
"<IPython.core.display.HTML object>"
|
| 682 |
+
]
|
| 683 |
+
},
|
| 684 |
+
"metadata": {},
|
| 685 |
+
"output_type": "display_data"
|
| 686 |
+
},
|
| 687 |
+
{
|
| 688 |
+
"name": "stderr",
|
| 689 |
+
"output_type": "stream",
|
| 690 |
+
"text": [
|
| 691 |
+
"Using the latest cached version of the module from /root/.cache/huggingface/modules/evaluate_modules/metrics/evaluate-metric--glue/05234ba7acc44554edcca0978db5fa3bc600eeee66229abe79ff9887eacaf3ed (last modified on Sat Feb 1 18:33:18 2025) since it couldn't be found locally at evaluate-metric--glue, or remotely on the Hugging Face Hub.\n"
|
| 692 |
+
]
|
| 693 |
+
},
|
| 694 |
+
{
|
| 695 |
+
"name": "stdout",
|
| 696 |
+
"output_type": "stream",
|
| 697 |
+
"text": [
|
| 698 |
+
"{'accuracy': 0.539, 'f1': 0.1811722912966252}\n"
|
| 699 |
+
]
|
| 700 |
+
}
|
| 701 |
+
],
|
| 702 |
+
"source": [
|
| 703 |
+
"#模型测试,中文数据集\n",
|
| 704 |
+
"raw_datasets_zh = load_dataset('google-research-datasets/paws-x', 'zh') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-\n",
|
| 705 |
+
"tokenized_datasets_zh = raw_datasets_zh.map(tokenize_function, batched=True)\n",
|
| 706 |
+
"\n",
|
| 707 |
+
"predictions = trainer.predict(tokenized_datasets_zh[\"test\"])\n",
|
| 708 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 709 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 710 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 711 |
+
"\n",
|
| 712 |
+
"print(ret)\n",
|
| 713 |
+
"result[\"zh\"] = ret"
|
| 714 |
+
]
|
| 715 |
+
},
|
| 716 |
+
{
|
| 717 |
+
"cell_type": "code",
|
| 718 |
+
"execution_count": 12,
|
| 719 |
+
"id": "ff9680bc-d7f8-4cb0-a1da-da056016fd5d",
|
| 720 |
+
"metadata": {},
|
| 721 |
+
"outputs": [
|
| 722 |
+
{
|
| 723 |
+
"data": {
|
| 724 |
+
"text/plain": [
|
| 725 |
+
"{'id': 111,\n",
|
| 726 |
+
" 'sentence1': '这在澳大利亚地区和澳大利亚南部更为常见,但在澳大利亚城市已经普遍存在了数十年。',\n",
|
| 727 |
+
" 'sentence2': '这种情况在澳大利亚城市更为常见,但几十年来一直在澳大利亚和澳大利亚南部地区普遍使用。',\n",
|
| 728 |
+
" 'label': 0}"
|
| 729 |
+
]
|
| 730 |
+
},
|
| 731 |
+
"execution_count": 12,
|
| 732 |
+
"metadata": {},
|
| 733 |
+
"output_type": "execute_result"
|
| 734 |
+
}
|
| 735 |
+
],
|
| 736 |
+
"source": [
|
| 737 |
+
"raw_datasets_zh[\"train\"][110]"
|
| 738 |
+
]
|
| 739 |
+
},
|
| 740 |
+
{
|
| 741 |
+
"cell_type": "markdown",
|
| 742 |
+
"id": "12ab9c6f-2b9d-432e-87be-85c22a46d89b",
|
| 743 |
+
"metadata": {},
|
| 744 |
+
"source": [
|
| 745 |
+
"## 生物序列测试"
|
| 746 |
+
]
|
| 747 |
+
},
|
| 748 |
+
{
|
| 749 |
+
"cell_type": "markdown",
|
| 750 |
+
"id": "cf9e0f8c-f74e-4eb6-83bc-6b83220e6122",
|
| 751 |
+
"metadata": {},
|
| 752 |
+
"source": [
|
| 753 |
+
"### DNA 150bp simple"
|
| 754 |
+
]
|
| 755 |
+
},
|
| 756 |
+
{
|
| 757 |
+
"cell_type": "code",
|
| 758 |
+
"execution_count": 13,
|
| 759 |
+
"id": "29ca633a-f7fa-49fe-bb8d-842dd573a0fc",
|
| 760 |
+
"metadata": {},
|
| 761 |
+
"outputs": [
|
| 762 |
+
{
|
| 763 |
+
"name": "stderr",
|
| 764 |
+
"output_type": "stream",
|
| 765 |
+
"text": [
|
| 766 |
+
"Using the latest cached version of the dataset since dnagpt/gene_lan_transfer couldn't be found on the Hugging Face Hub\n",
|
| 767 |
+
"Found the latest cached dataset configuration 'dna_sim_pair_simple_150bp' at /root/.cache/huggingface/datasets/dnagpt___gene_lan_transfer/dna_sim_pair_simple_150bp/0.0.0/fc103580e7cda0d9bc41947f4058887fdc81188c (last modified on Fri Feb 7 11:21:53 2025).\n"
|
| 768 |
+
]
|
| 769 |
+
},
|
| 770 |
+
{
|
| 771 |
+
"data": {
|
| 772 |
+
"text/html": [],
|
| 773 |
+
"text/plain": [
|
| 774 |
+
"<IPython.core.display.HTML object>"
|
| 775 |
+
]
|
| 776 |
+
},
|
| 777 |
+
"metadata": {},
|
| 778 |
+
"output_type": "display_data"
|
| 779 |
+
},
|
| 780 |
+
{
|
| 781 |
+
"name": "stderr",
|
| 782 |
+
"output_type": "stream",
|
| 783 |
+
"text": [
|
| 784 |
+
"\n",
|
| 785 |
+
"KeyboardInterrupt\n",
|
| 786 |
+
"\n"
|
| 787 |
+
]
|
| 788 |
+
}
|
| 789 |
+
],
|
| 790 |
+
"source": [
|
| 791 |
+
"#模型测试 dna数据集,150 bp长度 简单版本\n",
|
| 792 |
+
"raw_datasets_dna =load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_simple_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle\n",
|
| 793 |
+
"tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)\n",
|
| 794 |
+
"predictions = trainer.predict(tokenized_datasets_dna[\"test\"])\n",
|
| 795 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 796 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 797 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 798 |
+
"\n",
|
| 799 |
+
"print(ret)\n",
|
| 800 |
+
"result[\"dna_sim_pair_simple_150bp\"] = ret"
|
| 801 |
+
]
|
| 802 |
+
},
|
| 803 |
+
{
|
| 804 |
+
"cell_type": "code",
|
| 805 |
+
"execution_count": null,
|
| 806 |
+
"id": "2da2c6b8-409f-462a-a0de-178c7d66b40b",
|
| 807 |
+
"metadata": {},
|
| 808 |
+
"outputs": [],
|
| 809 |
+
"source": [
|
| 810 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 811 |
+
"import matplotlib.pyplot as plt\n",
|
| 812 |
+
"\n",
|
| 813 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 814 |
+
"cm = confusion_matrix(predictions.label_ids, preds)\n",
|
| 815 |
+
"\n",
|
| 816 |
+
"# 可视化混淆矩阵\n",
|
| 817 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 818 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 819 |
+
"plt.title('Confusion Matrix')\n",
|
| 820 |
+
"plt.show()"
|
| 821 |
+
]
|
| 822 |
+
},
|
| 823 |
+
{
|
| 824 |
+
"cell_type": "markdown",
|
| 825 |
+
"id": "fb436436-20f3-4bec-8fb2-5ab58d837f42",
|
| 826 |
+
"metadata": {},
|
| 827 |
+
"source": [
|
| 828 |
+
"### DNA 150 bp"
|
| 829 |
+
]
|
| 830 |
+
},
|
| 831 |
+
{
|
| 832 |
+
"cell_type": "code",
|
| 833 |
+
"execution_count": null,
|
| 834 |
+
"id": "be3aa946-c697-4392-80ea-a2d31710ca5c",
|
| 835 |
+
"metadata": {},
|
| 836 |
+
"outputs": [],
|
| 837 |
+
"source": [
|
| 838 |
+
"#模型测试 dna数据集,150长度,复杂版本 不相似\n",
|
| 839 |
+
"raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle\n",
|
| 840 |
+
"tokenized_datasets_dna= raw_datasets_dna.map(tokenize_function, batched=True)\n",
|
| 841 |
+
"\n",
|
| 842 |
+
"predictions = trainer.predict(tokenized_datasets_dna[\"test\"])\n",
|
| 843 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 844 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 845 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 846 |
+
"\n",
|
| 847 |
+
"print(ret)\n",
|
| 848 |
+
"result[\"dna_sim_pair_150bp\"] = ret"
|
| 849 |
+
]
|
| 850 |
+
},
|
| 851 |
+
{
|
| 852 |
+
"cell_type": "code",
|
| 853 |
+
"execution_count": null,
|
| 854 |
+
"id": "fa2918b9-6ef2-4f82-8262-88372c624a90",
|
| 855 |
+
"metadata": {},
|
| 856 |
+
"outputs": [],
|
| 857 |
+
"source": [
|
| 858 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 859 |
+
"import matplotlib.pyplot as plt\n",
|
| 860 |
+
"\n",
|
| 861 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 862 |
+
"cm = confusion_matrix(predictions.label_ids, preds)\n",
|
| 863 |
+
"\n",
|
| 864 |
+
"# 可视化混淆矩阵\n",
|
| 865 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 866 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 867 |
+
"plt.title('Confusion Matrix')\n",
|
| 868 |
+
"plt.show()"
|
| 869 |
+
]
|
| 870 |
+
},
|
| 871 |
+
{
|
| 872 |
+
"cell_type": "markdown",
|
| 873 |
+
"id": "c32158a3-6fd0-4ef8-9847-d50644ff9257",
|
| 874 |
+
"metadata": {},
|
| 875 |
+
"source": [
|
| 876 |
+
"### DNA 50bp"
|
| 877 |
+
]
|
| 878 |
+
},
|
| 879 |
+
{
|
| 880 |
+
"cell_type": "code",
|
| 881 |
+
"execution_count": null,
|
| 882 |
+
"id": "0f93b4e6-6243-4ebd-8e34-5f8b8a8a24b6",
|
| 883 |
+
"metadata": {},
|
| 884 |
+
"outputs": [],
|
| 885 |
+
"source": [
|
| 886 |
+
"#模型测试 dna数据集,50长度,复杂版本 不相似\n",
|
| 887 |
+
"raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_50bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 888 |
+
"tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)\n",
|
| 889 |
+
"predictions = trainer.predict(tokenized_datasets_dna[\"test\"])\n",
|
| 890 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 891 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 892 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 893 |
+
"\n",
|
| 894 |
+
"print(ret)\n",
|
| 895 |
+
"result[\"dna_sim_pair_50bp\"] = ret"
|
| 896 |
+
]
|
| 897 |
+
},
|
| 898 |
+
{
|
| 899 |
+
"cell_type": "code",
|
| 900 |
+
"execution_count": null,
|
| 901 |
+
"id": "27ab77c8-a1b4-40d3-b342-debc04e5517a",
|
| 902 |
+
"metadata": {},
|
| 903 |
+
"outputs": [],
|
| 904 |
+
"source": [
|
| 905 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 906 |
+
"import matplotlib.pyplot as plt\n",
|
| 907 |
+
"\n",
|
| 908 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 909 |
+
"cm = confusion_matrix(predictions.label_ids, preds)\n",
|
| 910 |
+
"\n",
|
| 911 |
+
"# 可视化混淆矩阵\n",
|
| 912 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 913 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 914 |
+
"plt.title('Confusion Matrix')\n",
|
| 915 |
+
"plt.show()"
|
| 916 |
+
]
|
| 917 |
+
},
|
| 918 |
+
{
|
| 919 |
+
"cell_type": "markdown",
|
| 920 |
+
"id": "613be8ca-afcf-4115-8f1e-28c4b21e6e99",
|
| 921 |
+
"metadata": {},
|
| 922 |
+
"source": [
|
| 923 |
+
"### protein 150bp 50 len"
|
| 924 |
+
]
|
| 925 |
+
},
|
| 926 |
+
{
|
| 927 |
+
"cell_type": "code",
|
| 928 |
+
"execution_count": null,
|
| 929 |
+
"id": "3785407d-de4f-42a4-b755-8365255bf72b",
|
| 930 |
+
"metadata": {},
|
| 931 |
+
"outputs": [],
|
| 932 |
+
"source": [
|
| 933 |
+
"#模型测试 蛋白质数据集,50长度/150bp,复杂版本 不相似\n",
|
| 934 |
+
"\n",
|
| 935 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_150bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 936 |
+
"tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)\n",
|
| 937 |
+
"predictions = trainer.predict(tokenized_datasets_dna_protein[\"test\"])\n",
|
| 938 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 939 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 940 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 941 |
+
"\n",
|
| 942 |
+
"\n",
|
| 943 |
+
"print(ret)\n",
|
| 944 |
+
"result[\"protein_sim_pair_150bp\"] = ret"
|
| 945 |
+
]
|
| 946 |
+
},
|
| 947 |
+
{
|
| 948 |
+
"cell_type": "markdown",
|
| 949 |
+
"id": "55ed3d1d-38e7-430a-bec4-bcc59e9dd288",
|
| 950 |
+
"metadata": {},
|
| 951 |
+
"source": [
|
| 952 |
+
"### protein 450bp 150 len"
|
| 953 |
+
]
|
| 954 |
+
},
|
| 955 |
+
{
|
| 956 |
+
"cell_type": "code",
|
| 957 |
+
"execution_count": null,
|
| 958 |
+
"id": "c268e40d-c973-4166-a9ff-a5ba5478e125",
|
| 959 |
+
"metadata": {},
|
| 960 |
+
"outputs": [],
|
| 961 |
+
"source": [
|
| 962 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 963 |
+
"\n",
|
| 964 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_450bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 965 |
+
"tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)\n",
|
| 966 |
+
"predictions = trainer.predict(tokenized_datasets_dna_protein[\"test\"])\n",
|
| 967 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 968 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 969 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 970 |
+
"\n",
|
| 971 |
+
"print(ret)\n",
|
| 972 |
+
"result[\"protein_sim_pair_450bp\"] = ret"
|
| 973 |
+
]
|
| 974 |
+
},
|
| 975 |
+
{
|
| 976 |
+
"cell_type": "markdown",
|
| 977 |
+
"id": "58c56540-ca70-4f97-9533-6144cbede218",
|
| 978 |
+
"metadata": {},
|
| 979 |
+
"source": [
|
| 980 |
+
"### dna-protein"
|
| 981 |
+
]
|
| 982 |
+
},
|
| 983 |
+
{
|
| 984 |
+
"cell_type": "code",
|
| 985 |
+
"execution_count": null,
|
| 986 |
+
"id": "b5b91fdc-3003-4d46-bd0c-6c14f92395e9",
|
| 987 |
+
"metadata": {},
|
| 988 |
+
"outputs": [],
|
| 989 |
+
"source": [
|
| 990 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 991 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 992 |
+
"\n",
|
| 993 |
+
"# 定义翻转标签的函数\n",
|
| 994 |
+
"def flip_labels(example):\n",
|
| 995 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 996 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 997 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 998 |
+
" #example['label'] = 1 - example['label']\n",
|
| 999 |
+
" return example\n",
|
| 1000 |
+
"\n",
|
| 1001 |
+
"# 应用翻转标签函数\n",
|
| 1002 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 1003 |
+
"\n",
|
| 1004 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)\n",
|
| 1005 |
+
"predictions = trainer.predict(tokenized_datasets_dna_protein[\"test\"])\n",
|
| 1006 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 1007 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 1008 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 1009 |
+
"print(ret)\n",
|
| 1010 |
+
"result[\"dna_protein_pair\"] = ret"
|
| 1011 |
+
]
|
| 1012 |
+
},
|
| 1013 |
+
{
|
| 1014 |
+
"cell_type": "markdown",
|
| 1015 |
+
"id": "6ba865ea-5dfa-4917-80ec-a6e2109fb92a",
|
| 1016 |
+
"metadata": {},
|
| 1017 |
+
"source": [
|
| 1018 |
+
"## dna protein 2"
|
| 1019 |
+
]
|
| 1020 |
+
},
|
| 1021 |
+
{
|
| 1022 |
+
"cell_type": "code",
|
| 1023 |
+
"execution_count": null,
|
| 1024 |
+
"id": "e854a058-e902-4f63-b44a-cfb6633fdc3f",
|
| 1025 |
+
"metadata": {},
|
| 1026 |
+
"outputs": [],
|
| 1027 |
+
"source": [
|
| 1028 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 1029 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 1030 |
+
"\n",
|
| 1031 |
+
"# 定义翻转标签的函数\n",
|
| 1032 |
+
"def flip_labels(example):\n",
|
| 1033 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 1034 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 1035 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 1036 |
+
" #example['label'] = 1 - example['label']\n",
|
| 1037 |
+
" return example\n",
|
| 1038 |
+
"\n",
|
| 1039 |
+
"# 应用翻转标签函数\n",
|
| 1040 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 1041 |
+
"\n",
|
| 1042 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)\n",
|
| 1043 |
+
"predictions = trainer.predict(tokenized_datasets_dna_protein[\"test\"])\n",
|
| 1044 |
+
"preds = np.argmax(predictions.predictions, axis=-1)\n",
|
| 1045 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 1046 |
+
"ret = metric.compute(predictions=preds, references=predictions.label_ids)\n",
|
| 1047 |
+
"print(ret)\n",
|
| 1048 |
+
"result[\"dna_protein_pair_rand\"] = ret"
|
| 1049 |
+
]
|
| 1050 |
+
},
|
| 1051 |
+
{
|
| 1052 |
+
"cell_type": "code",
|
| 1053 |
+
"execution_count": null,
|
| 1054 |
+
"id": "3b3b3504-ba21-429d-9129-3b2a2409eb3f",
|
| 1055 |
+
"metadata": {},
|
| 1056 |
+
"outputs": [],
|
| 1057 |
+
"source": [
|
| 1058 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 1059 |
+
"import matplotlib.pyplot as plt\n",
|
| 1060 |
+
"\n",
|
| 1061 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 1062 |
+
"cm = confusion_matrix(predictions.label_ids, preds)\n",
|
| 1063 |
+
"\n",
|
| 1064 |
+
"# 可视化混淆矩阵\n",
|
| 1065 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 1066 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 1067 |
+
"plt.title('Confusion Matrix')\n",
|
| 1068 |
+
"plt.show()"
|
| 1069 |
+
]
|
| 1070 |
+
},
|
| 1071 |
+
{
|
| 1072 |
+
"cell_type": "code",
|
| 1073 |
+
"execution_count": null,
|
| 1074 |
+
"id": "3b6e4efe-7158-4ea3-8700-447ea56f0f27",
|
| 1075 |
+
"metadata": {},
|
| 1076 |
+
"outputs": [],
|
| 1077 |
+
"source": [
|
| 1078 |
+
"result"
|
| 1079 |
+
]
|
| 1080 |
+
},
|
| 1081 |
+
{
|
| 1082 |
+
"cell_type": "code",
|
| 1083 |
+
"execution_count": null,
|
| 1084 |
+
"id": "c38fe4c3-7f1a-4544-8451-ed4ac29b80f0",
|
| 1085 |
+
"metadata": {},
|
| 1086 |
+
"outputs": [],
|
| 1087 |
+
"source": []
|
| 1088 |
+
}
|
| 1089 |
+
],
|
| 1090 |
+
"metadata": {
|
| 1091 |
+
"kernelspec": {
|
| 1092 |
+
"display_name": "Python 3 (ipykernel)",
|
| 1093 |
+
"language": "python",
|
| 1094 |
+
"name": "python3"
|
| 1095 |
+
},
|
| 1096 |
+
"language_info": {
|
| 1097 |
+
"codemirror_mode": {
|
| 1098 |
+
"name": "ipython",
|
| 1099 |
+
"version": 3
|
| 1100 |
+
},
|
| 1101 |
+
"file_extension": ".py",
|
| 1102 |
+
"mimetype": "text/x-python",
|
| 1103 |
+
"name": "python",
|
| 1104 |
+
"nbconvert_exporter": "python",
|
| 1105 |
+
"pygments_lexer": "ipython3",
|
| 1106 |
+
"version": "3.12.3"
|
| 1107 |
+
}
|
| 1108 |
+
},
|
| 1109 |
+
"nbformat": 4,
|
| 1110 |
+
"nbformat_minor": 5
|
| 1111 |
+
}
|
best_model/gpt2_gene_multiv1_ft_en_test_others_best.ipynb
ADDED
|
@@ -0,0 +1,771 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "dcaea864-b707-4651-965d-b8eefa1b0e07",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"name": "stdout",
|
| 11 |
+
"output_type": "stream",
|
| 12 |
+
"text": [
|
| 13 |
+
"https://hf-mirror.com\n"
|
| 14 |
+
]
|
| 15 |
+
}
|
| 16 |
+
],
|
| 17 |
+
"source": [
|
| 18 |
+
"import os\n",
|
| 19 |
+
"\n",
|
| 20 |
+
"# 设置环境变量\n",
|
| 21 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 22 |
+
"\n",
|
| 23 |
+
"# 打印环境变量以确认设置成功\n",
|
| 24 |
+
"print(os.environ.get('HF_ENDPOINT'))\n",
|
| 25 |
+
"\n",
|
| 26 |
+
"# import subprocess\n",
|
| 27 |
+
"# import os\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"# result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 30 |
+
"# output = result.stdout\n",
|
| 31 |
+
"# for line in output.splitlines():\n",
|
| 32 |
+
"# if '=' in line:\n",
|
| 33 |
+
"# var, value = line.split('=', 1)\n",
|
| 34 |
+
"# os.environ[var] = value"
|
| 35 |
+
]
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"cell_type": "code",
|
| 39 |
+
"execution_count": 2,
|
| 40 |
+
"id": "73cc9d73-f0cb-4392-8280-782275dc7036",
|
| 41 |
+
"metadata": {},
|
| 42 |
+
"outputs": [
|
| 43 |
+
{
|
| 44 |
+
"name": "stderr",
|
| 45 |
+
"output_type": "stream",
|
| 46 |
+
"text": [
|
| 47 |
+
"2025-02-09 19:41:53.922324: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 48 |
+
"2025-02-09 19:41:53.935891: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 49 |
+
"2025-02-09 19:41:53.951620: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 50 |
+
"2025-02-09 19:41:53.956337: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 51 |
+
"2025-02-09 19:41:53.968352: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 52 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 53 |
+
"2025-02-09 19:41:54.782860: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 54 |
+
]
|
| 55 |
+
}
|
| 56 |
+
],
|
| 57 |
+
"source": [
|
| 58 |
+
"from datasets import load_dataset\n",
|
| 59 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 60 |
+
"from transformers import Trainer\n",
|
| 61 |
+
"import evaluate\n",
|
| 62 |
+
"import numpy as np\n",
|
| 63 |
+
"from transformers import TrainingArguments\n",
|
| 64 |
+
"from transformers import AutoModelForSequenceClassification\n",
|
| 65 |
+
"import json\n",
|
| 66 |
+
"from transformers import set_seed\n",
|
| 67 |
+
"import random\n",
|
| 68 |
+
"import numpy as np\n",
|
| 69 |
+
"import torch\n",
|
| 70 |
+
"from tqdm import tqdm"
|
| 71 |
+
]
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"cell_type": "code",
|
| 75 |
+
"execution_count": 3,
|
| 76 |
+
"id": "8255851b-d2c4-437c-a306-fcb00ccab684",
|
| 77 |
+
"metadata": {},
|
| 78 |
+
"outputs": [],
|
| 79 |
+
"source": [
|
| 80 |
+
"# seed = 42\n",
|
| 81 |
+
"# random.seed(seed)\n",
|
| 82 |
+
"# np.random.seed(seed)\n",
|
| 83 |
+
"# torch.manual_seed(seed)\n",
|
| 84 |
+
"# torch.cuda.manual_seed_all(seed)\n",
|
| 85 |
+
"\n",
|
| 86 |
+
"\n",
|
| 87 |
+
"# 动态生成随机种子\n",
|
| 88 |
+
"import random\n",
|
| 89 |
+
"#seed = random.randint(0, 10000)\n",
|
| 90 |
+
"seed = 7967\n",
|
| 91 |
+
"#print(f\"Generated seed: {seed}\")\n",
|
| 92 |
+
"set_seed(seed)\n",
|
| 93 |
+
"result = {}\n",
|
| 94 |
+
"result[\"seed\"] = seed"
|
| 95 |
+
]
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"cell_type": "code",
|
| 99 |
+
"execution_count": 4,
|
| 100 |
+
"id": "2a744bd7-b674-4048-b303-d4f85bdd694d",
|
| 101 |
+
"metadata": {},
|
| 102 |
+
"outputs": [],
|
| 103 |
+
"source": [
|
| 104 |
+
"# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象\n",
|
| 105 |
+
"raw_datasets = load_dataset('google-research-datasets/paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x\n",
|
| 106 |
+
"\n",
|
| 107 |
+
"#分词器\n",
|
| 108 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"dnagpt/gpt2_gene_multi_v1\")\n",
|
| 109 |
+
"tokenizer.pad_token = tokenizer.eos_token\n",
|
| 110 |
+
"\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"#分词函数\n",
|
| 113 |
+
"def tokenize_function(example):\n",
|
| 114 |
+
" return tokenizer(example[\"sentence1\"], example[\"sentence2\"], truncation=True,max_length=256, padding=\"max_length\")\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"#构建分词后的数据集\n",
|
| 117 |
+
"tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)\n",
|
| 118 |
+
"\n",
|
| 119 |
+
"#训练数据构建\n",
|
| 120 |
+
"data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
|
| 121 |
+
]
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"cell_type": "code",
|
| 125 |
+
"execution_count": 5,
|
| 126 |
+
"id": "b2d3081f-1df2-45fa-a3f6-1516c19d7318",
|
| 127 |
+
"metadata": {},
|
| 128 |
+
"outputs": [
|
| 129 |
+
{
|
| 130 |
+
"name": "stderr",
|
| 131 |
+
"output_type": "stream",
|
| 132 |
+
"text": [
|
| 133 |
+
"/root/miniconda3/lib/python3.12/site-packages/transformers/training_args.py:1545: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
|
| 134 |
+
" warnings.warn(\n",
|
| 135 |
+
"Some weights of GPT2ForSequenceClassification were not initialized from the model checkpoint at dnagpt/gpt2_gene_multi_v1 and are newly initialized: ['score.weight']\n",
|
| 136 |
+
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
| 137 |
+
]
|
| 138 |
+
}
|
| 139 |
+
],
|
| 140 |
+
"source": [
|
| 141 |
+
"#指标函数定义\n",
|
| 142 |
+
"def compute_metrics(eval_pred):\n",
|
| 143 |
+
" predictions, labels = eval_pred\n",
|
| 144 |
+
" predictions = np.argmax(predictions, axis=1)\n",
|
| 145 |
+
" return {'accuracy': (predictions==labels).sum() / len(labels)}\n",
|
| 146 |
+
"\n",
|
| 147 |
+
"\n",
|
| 148 |
+
"\n",
|
| 149 |
+
"training_args = TrainingArguments(\n",
|
| 150 |
+
" output_dir=\"ds_job_dna_2222\",\n",
|
| 151 |
+
" learning_rate=1e-5,\n",
|
| 152 |
+
" lr_scheduler_type=\"constant_with_warmup\",\n",
|
| 153 |
+
" warmup_ratio=0.1,\n",
|
| 154 |
+
" optim='adamw_torch',\n",
|
| 155 |
+
" weight_decay=0.0,\n",
|
| 156 |
+
" seed=seed, # 使用动态生成的随机种子\n",
|
| 157 |
+
" per_device_train_batch_size=64,\n",
|
| 158 |
+
" per_device_eval_batch_size=64,\n",
|
| 159 |
+
" num_train_epochs=4, #训练多少轮\n",
|
| 160 |
+
" evaluation_strategy=\"epoch\",\n",
|
| 161 |
+
" save_strategy=\"epoch\",\n",
|
| 162 |
+
" logging_strategy=\"epoch\",\n",
|
| 163 |
+
" load_best_model_at_end=True\n",
|
| 164 |
+
")\n",
|
| 165 |
+
"\n",
|
| 166 |
+
"#模型定义,文本分类模型\n",
|
| 167 |
+
"model = AutoModelForSequenceClassification.from_pretrained(\"dnagpt/gpt2_gene_multi_v1\", num_labels=2)\n",
|
| 168 |
+
"model.config.pad_token_id = model.config.eos_token_id\n",
|
| 169 |
+
"\n",
|
| 170 |
+
"trainer = Trainer(\n",
|
| 171 |
+
" model,\n",
|
| 172 |
+
" training_args,\n",
|
| 173 |
+
" train_dataset=tokenized_datasets[\"train\"],\n",
|
| 174 |
+
" eval_dataset=tokenized_datasets[\"validation\"],\n",
|
| 175 |
+
" data_collator=data_collator,\n",
|
| 176 |
+
" tokenizer=tokenizer,\n",
|
| 177 |
+
" compute_metrics=compute_metrics,\n",
|
| 178 |
+
")"
|
| 179 |
+
]
|
| 180 |
+
},
|
| 181 |
+
{
|
| 182 |
+
"cell_type": "code",
|
| 183 |
+
"execution_count": 6,
|
| 184 |
+
"id": "06f4ea9e-dbac-405e-8875-aea569c708cf",
|
| 185 |
+
"metadata": {},
|
| 186 |
+
"outputs": [
|
| 187 |
+
{
|
| 188 |
+
"name": "stdout",
|
| 189 |
+
"output_type": "stream",
|
| 190 |
+
"text": [
|
| 191 |
+
"[2025-02-09 19:42:11,162] [INFO] [real_accelerator.py:219:get_accelerator] Setting ds_accelerator to cuda (auto detect)\n"
|
| 192 |
+
]
|
| 193 |
+
},
|
| 194 |
+
{
|
| 195 |
+
"name": "stderr",
|
| 196 |
+
"output_type": "stream",
|
| 197 |
+
"text": [
|
| 198 |
+
"/root/miniconda3/compiler_compat/ld: cannot find -laio: No such file or directory\n",
|
| 199 |
+
"collect2: error: ld returned 1 exit status\n",
|
| 200 |
+
"/root/miniconda3/compiler_compat/ld: warning: libpthread.so.0, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 201 |
+
"/root/miniconda3/compiler_compat/ld: warning: libstdc++.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 202 |
+
"/root/miniconda3/compiler_compat/ld: warning: libm.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 203 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::runtime_error::~runtime_error()@GLIBCXX_3.4'\n",
|
| 204 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__gxx_personality_v0@CXXABI_1.3'\n",
|
| 205 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::tellp()@GLIBCXX_3.4'\n",
|
| 206 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::steady_clock::now()@GLIBCXX_3.4.19'\n",
|
| 207 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_replace_aux(unsigned long, unsigned long, unsigned long, char)@GLIBCXX_3.4'\n",
|
| 208 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for bool@CXXABI_1.3'\n",
|
| 209 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_logic_error(char const*)@GLIBCXX_3.4'\n",
|
| 210 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 211 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::logic_error@GLIBCXX_3.4'\n",
|
| 212 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::~locale()@GLIBCXX_3.4'\n",
|
| 213 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 214 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_end_catch@CXXABI_1.3'\n",
|
| 215 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 216 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::logic_error::~logic_error()@GLIBCXX_3.4'\n",
|
| 217 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info@CXXABI_1.3'\n",
|
| 218 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 219 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 220 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new[](unsigned long)@GLIBCXX_3.4'\n",
|
| 221 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak_hard()@GLIBCXX_3.4'\n",
|
| 222 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 223 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::basic_streambuf(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 224 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 225 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)@GLIBCXX_3.4'\n",
|
| 226 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned short@CXXABI_1.3'\n",
|
| 227 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::resize(unsigned long, char)@GLIBCXX_3.4'\n",
|
| 228 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char const*@CXXABI_1.3'\n",
|
| 229 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'\n",
|
| 230 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_invalid_argument(char const*)@GLIBCXX_3.4'\n",
|
| 231 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::operator=(std::locale const&)@GLIBCXX_3.4'\n",
|
| 232 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 233 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 234 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_free_exception@CXXABI_1.3'\n",
|
| 235 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::notify_one()@GLIBCXX_3.4.11'\n",
|
| 236 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::~Init()@GLIBCXX_3.4'\n",
|
| 237 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@GLIBCXX_3.4'\n",
|
| 238 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_pure_virtual@CXXABI_1.3'\n",
|
| 239 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::flush()@GLIBCXX_3.4'\n",
|
| 240 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__class_type_info@CXXABI_1.3'\n",
|
| 241 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_rethrow@CXXABI_1.3'\n",
|
| 242 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 243 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_fstream<char, std::char_traits<char> >::~basic_fstream()@GLIBCXX_3.4'\n",
|
| 244 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::compare(char const*) const@GLIBCXX_3.4'\n",
|
| 245 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 246 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale()@GLIBCXX_3.4'\n",
|
| 247 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::system_clock::now()@GLIBCXX_3.4.19'\n",
|
| 248 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 249 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Hash_bytes(void const*, unsigned long, unsigned long)@CXXABI_1.3.5'\n",
|
| 250 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long long>(long long)@GLIBCXX_3.4.9'\n",
|
| 251 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char*@CXXABI_1.3'\n",
|
| 252 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const@GLIBCXX_3.4.18'\n",
|
| 253 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::out_of_range@GLIBCXX_3.4'\n",
|
| 254 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)@GLIBCXX_3.4.9'\n",
|
| 255 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 256 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::~ios_base()@GLIBCXX_3.4'\n",
|
| 257 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::range_error::~range_error()@GLIBCXX_3.4'\n",
|
| 258 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::~__basic_file()@GLIBCXX_3.4'\n",
|
| 259 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_acquire@CXXABI_1.3'\n",
|
| 260 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<bool>(bool)@GLIBCXX_3.4.9'\n",
|
| 261 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::overflow_error@GLIBCXX_3.4'\n",
|
| 262 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 263 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::range_error@GLIBCXX_3.4'\n",
|
| 264 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 265 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_filebuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 266 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete[](void*)@GLIBCXX_3.4'\n",
|
| 267 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 268 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(unsigned long, char, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 269 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 270 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::replace(unsigned long, unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 271 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::exception@GLIBCXX_3.4'\n",
|
| 272 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_destroy(std::allocator<wchar_t> const&)@GLIBCXX_3.4'\n",
|
| 273 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream& std::istream::_M_extract<double>(double&)@GLIBCXX_3.4.9'\n",
|
| 274 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 275 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 276 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 277 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(std::string const&)@GLIBCXX_3.4'\n",
|
| 278 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new(unsigned long)@GLIBCXX_3.4'\n",
|
| 279 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 280 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned int@CXXABI_1.3'\n",
|
| 281 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*)@GLIBCXX_3.4'\n",
|
| 282 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::domain_error@GLIBCXX_3.4'\n",
|
| 283 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char, unsigned long) const@GLIBCXX_3.4'\n",
|
| 284 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::put(char)@GLIBCXX_3.4'\n",
|
| 285 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int@CXXABI_1.3'\n",
|
| 286 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_alloc()@GLIBCXX_3.4'\n",
|
| 287 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_thread_atexit@CXXABI_1.3.7'\n",
|
| 288 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 289 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()@GLIBCXX_3.4'\n",
|
| 290 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::Init()@GLIBCXX_3.4'\n",
|
| 291 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::condition_variable()@GLIBCXX_3.4.11'\n",
|
| 292 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf()@GLIBCXX_3.4'\n",
|
| 293 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 294 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::domain_error::~domain_error()@GLIBCXX_3.4'\n",
|
| 295 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cerr@GLIBCXX_3.4'\n",
|
| 296 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char const*, unsigned long, unsigned long) const@GLIBCXX_3.4'\n",
|
| 297 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 298 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 299 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@GLIBCXX_3.4'\n",
|
| 300 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::invalid_argument@GLIBCXX_3.4'\n",
|
| 301 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void*@CXXABI_1.3'\n",
|
| 302 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(std::string const&)@GLIBCXX_3.4'\n",
|
| 303 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()@GLIBCXX_3.4'\n",
|
| 304 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 305 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long@CXXABI_1.3'\n",
|
| 306 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 307 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_unhook()@GLIBCXX_3.4.15'\n",
|
| 308 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 309 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(char*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 310 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<char, std::char_traits<char> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 311 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 312 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 313 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `log2f@GLIBC_2.2.5'\n",
|
| 314 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 315 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 316 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::exception::~exception()@GLIBCXX_3.4'\n",
|
| 317 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 318 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::is_open() const@GLIBCXX_3.4'\n",
|
| 319 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_istringstream()@GLIBCXX_3.4'\n",
|
| 320 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::swap(std::string&)@GLIBCXX_3.4'\n",
|
| 321 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long*@CXXABI_1.3'\n",
|
| 322 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 323 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::basic_streambuf(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 324 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 325 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_cast()@GLIBCXX_3.4'\n",
|
| 326 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)@GLIBCXX_3.4'\n",
|
| 327 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::operator=(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 328 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete(void*)@GLIBCXX_3.4'\n",
|
| 329 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(int)@GLIBCXX_3.4'\n",
|
| 330 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 331 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_M_destroy(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 332 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<wchar_t, std::char_traits<wchar_t> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 333 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::runtime_error@GLIBCXX_3.4'\n",
|
| 334 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 335 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 336 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()@GLIBCXX_3.4'\n",
|
| 337 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 338 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long>(long)@GLIBCXX_3.4.9'\n",
|
| 339 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::get()@GLIBCXX_3.4'\n",
|
| 340 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long long@CXXABI_1.3'\n",
|
| 341 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@GLIBCXX_3.4'\n",
|
| 342 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::out_of_range::~out_of_range()@GLIBCXX_3.4'\n",
|
| 343 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::length_error::~length_error()@GLIBCXX_3.4'\n",
|
| 344 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)@GLIBCXX_3.4.9'\n",
|
| 345 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::invalid_argument::~invalid_argument()@GLIBCXX_3.4'\n",
|
| 346 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::swap(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)@GLIBCXX_3.4'\n",
|
| 347 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cout@GLIBCXX_3.4'\n",
|
| 348 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long long>(unsigned long long)@GLIBCXX_3.4.9'\n",
|
| 349 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int*@CXXABI_1.3'\n",
|
| 350 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<void const*>(void const*)@GLIBCXX_3.4.9'\n",
|
| 351 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::underflow_error@GLIBCXX_3.4'\n",
|
| 352 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 353 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::out_of_range@GLIBCXX_3.4'\n",
|
| 354 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_allocate_exception@CXXABI_1.3'\n",
|
| 355 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 356 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void const*@CXXABI_1.3'\n",
|
| 357 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::init(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >*)@GLIBCXX_3.4'\n",
|
| 358 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::reserve(unsigned long)@GLIBCXX_3.4'\n",
|
| 359 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_begin_catch@CXXABI_1.3'\n",
|
| 360 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long@CXXABI_1.3'\n",
|
| 361 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 362 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak()@GLIBCXX_3.4'\n",
|
| 363 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 364 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_sync(wchar_t*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 365 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::getline(char*, long, char)@GLIBCXX_3.4'\n",
|
| 366 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char)@GLIBCXX_3.4'\n",
|
| 367 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 368 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::~condition_variable()@GLIBCXX_3.4.11'\n",
|
| 369 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 370 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::insert(unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 371 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 372 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned char@CXXABI_1.3'\n",
|
| 373 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::ios_base()@GLIBCXX_3.4'\n",
|
| 374 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_out_of_range(char const*)@GLIBCXX_3.4'\n",
|
| 375 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::overflow_error::~overflow_error()@GLIBCXX_3.4'\n",
|
| 376 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_length_error(char const*)@GLIBCXX_3.4'\n",
|
| 377 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_system_error(int)@GLIBCXX_3.4.11'\n",
|
| 378 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 379 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<double>(double)@GLIBCXX_3.4.9'\n",
|
| 380 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::operator=(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 381 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long long@CXXABI_1.3'\n",
|
| 382 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 383 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 384 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_release@CXXABI_1.3'\n",
|
| 385 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_throw@CXXABI_1.3'\n",
|
| 386 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::underflow_error::~underflow_error()@GLIBCXX_3.4'\n",
|
| 387 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 388 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::length_error@GLIBCXX_3.4'\n",
|
| 389 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf()@GLIBCXX_3.4'\n",
|
| 390 |
+
"collect2: error: ld returned 1 exit status\n"
|
| 391 |
+
]
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"data": {
|
| 395 |
+
"text/html": [
|
| 396 |
+
"\n",
|
| 397 |
+
" <div>\n",
|
| 398 |
+
" \n",
|
| 399 |
+
" <progress value='3088' max='3088' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
| 400 |
+
" [3088/3088 22:01, Epoch 4/4]\n",
|
| 401 |
+
" </div>\n",
|
| 402 |
+
" <table border=\"1\" class=\"dataframe\">\n",
|
| 403 |
+
" <thead>\n",
|
| 404 |
+
" <tr style=\"text-align: left;\">\n",
|
| 405 |
+
" <th>Epoch</th>\n",
|
| 406 |
+
" <th>Training Loss</th>\n",
|
| 407 |
+
" <th>Validation Loss</th>\n",
|
| 408 |
+
" <th>Accuracy</th>\n",
|
| 409 |
+
" </tr>\n",
|
| 410 |
+
" </thead>\n",
|
| 411 |
+
" <tbody>\n",
|
| 412 |
+
" <tr>\n",
|
| 413 |
+
" <td>1</td>\n",
|
| 414 |
+
" <td>0.633200</td>\n",
|
| 415 |
+
" <td>0.448454</td>\n",
|
| 416 |
+
" <td>0.803000</td>\n",
|
| 417 |
+
" </tr>\n",
|
| 418 |
+
" <tr>\n",
|
| 419 |
+
" <td>2</td>\n",
|
| 420 |
+
" <td>0.376200</td>\n",
|
| 421 |
+
" <td>0.471739</td>\n",
|
| 422 |
+
" <td>0.821000</td>\n",
|
| 423 |
+
" </tr>\n",
|
| 424 |
+
" <tr>\n",
|
| 425 |
+
" <td>3</td>\n",
|
| 426 |
+
" <td>0.267600</td>\n",
|
| 427 |
+
" <td>0.354833</td>\n",
|
| 428 |
+
" <td>0.865000</td>\n",
|
| 429 |
+
" </tr>\n",
|
| 430 |
+
" <tr>\n",
|
| 431 |
+
" <td>4</td>\n",
|
| 432 |
+
" <td>0.204300</td>\n",
|
| 433 |
+
" <td>0.383833</td>\n",
|
| 434 |
+
" <td>0.873500</td>\n",
|
| 435 |
+
" </tr>\n",
|
| 436 |
+
" </tbody>\n",
|
| 437 |
+
"</table><p>"
|
| 438 |
+
],
|
| 439 |
+
"text/plain": [
|
| 440 |
+
"<IPython.core.display.HTML object>"
|
| 441 |
+
]
|
| 442 |
+
},
|
| 443 |
+
"metadata": {},
|
| 444 |
+
"output_type": "display_data"
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"data": {
|
| 448 |
+
"text/plain": [
|
| 449 |
+
"TrainOutput(global_step=3088, training_loss=0.37034162215000604, metrics={'train_runtime': 1321.9045, 'train_samples_per_second': 149.484, 'train_steps_per_second': 2.336, 'total_flos': 2.5816641551990784e+16, 'train_loss': 0.37034162215000604, 'epoch': 4.0})"
|
| 450 |
+
]
|
| 451 |
+
},
|
| 452 |
+
"execution_count": 6,
|
| 453 |
+
"metadata": {},
|
| 454 |
+
"output_type": "execute_result"
|
| 455 |
+
}
|
| 456 |
+
],
|
| 457 |
+
"source": [
|
| 458 |
+
"trainer.train() #模型训练"
|
| 459 |
+
]
|
| 460 |
+
},
|
| 461 |
+
{
|
| 462 |
+
"cell_type": "code",
|
| 463 |
+
"execution_count": 7,
|
| 464 |
+
"id": "adacc2bb-bda6-4e9f-92fb-54d64c324147",
|
| 465 |
+
"metadata": {},
|
| 466 |
+
"outputs": [
|
| 467 |
+
{
|
| 468 |
+
"data": {
|
| 469 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 470 |
+
"model_id": "2a404a3810d442ecb077b5e0794cf21f",
|
| 471 |
+
"version_major": 2,
|
| 472 |
+
"version_minor": 0
|
| 473 |
+
},
|
| 474 |
+
"text/plain": [
|
| 475 |
+
"Map (num_proc=4): 0%| | 0/2000 [00:00<?, ? examples/s]"
|
| 476 |
+
]
|
| 477 |
+
},
|
| 478 |
+
"metadata": {},
|
| 479 |
+
"output_type": "display_data"
|
| 480 |
+
},
|
| 481 |
+
{
|
| 482 |
+
"data": {
|
| 483 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 484 |
+
"model_id": "90bf9102d4d446ea83c037dcd0bd78bc",
|
| 485 |
+
"version_major": 2,
|
| 486 |
+
"version_minor": 0
|
| 487 |
+
},
|
| 488 |
+
"text/plain": [
|
| 489 |
+
"Map (num_proc=4): 0%| | 0/2000 [00:00<?, ? examples/s]"
|
| 490 |
+
]
|
| 491 |
+
},
|
| 492 |
+
"metadata": {},
|
| 493 |
+
"output_type": "display_data"
|
| 494 |
+
},
|
| 495 |
+
{
|
| 496 |
+
"name": "stderr",
|
| 497 |
+
"output_type": "stream",
|
| 498 |
+
"text": [
|
| 499 |
+
"Predicting: 100%|██████████| 32/32 [00:04<00:00, 6.82it/s]\n"
|
| 500 |
+
]
|
| 501 |
+
}
|
| 502 |
+
],
|
| 503 |
+
"source": [
|
| 504 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 505 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 506 |
+
"\n",
|
| 507 |
+
"# 定义翻转标签的函数\n",
|
| 508 |
+
"def flip_labels(example):\n",
|
| 509 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 510 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 511 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 512 |
+
" example['label'] = 1 - example['label']\n",
|
| 513 |
+
" return example\n",
|
| 514 |
+
"\n",
|
| 515 |
+
"# 应用翻转标签函数\n",
|
| 516 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 517 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)\n",
|
| 518 |
+
"\n",
|
| 519 |
+
"\n",
|
| 520 |
+
"\n",
|
| 521 |
+
"# 确保模型在 GPU 上\n",
|
| 522 |
+
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
| 523 |
+
"model.to(device)\n",
|
| 524 |
+
"model.eval() # 进入推理模式,加速推理\n",
|
| 525 |
+
"\n",
|
| 526 |
+
"# 取出测试集数据\n",
|
| 527 |
+
"test_dataset = tokenized_datasets_dna_protein[\"test\"]\n",
|
| 528 |
+
"\n",
|
| 529 |
+
"# 预存预测结果\n",
|
| 530 |
+
"preds = []\n",
|
| 531 |
+
"labels = []\n",
|
| 532 |
+
"\n",
|
| 533 |
+
"# 批量大小(建议 64、128、256 视显存大小调整)\n",
|
| 534 |
+
"batch_size = 64\n",
|
| 535 |
+
"\n",
|
| 536 |
+
"# 直接遍历数据集进行推理\n",
|
| 537 |
+
"for i in tqdm(range(0, len(test_dataset), batch_size), desc=\"Predicting\"):\n",
|
| 538 |
+
" batch = test_dataset[i : i + batch_size]\n",
|
| 539 |
+
" \n",
|
| 540 |
+
" # 转换为 Tensor 并移动到 GPU\n",
|
| 541 |
+
" inputs = {\n",
|
| 542 |
+
" \"input_ids\": torch.tensor(batch[\"input_ids\"]).to(device),\n",
|
| 543 |
+
" \"attention_mask\": torch.tensor(batch[\"attention_mask\"]).to(device),\n",
|
| 544 |
+
" }\n",
|
| 545 |
+
" batch_labels = batch[\"label\"] # 原始标签\n",
|
| 546 |
+
"\n",
|
| 547 |
+
" with torch.no_grad(): # 关闭梯度计算,减少内存占用\n",
|
| 548 |
+
" outputs = model(**inputs)\n",
|
| 549 |
+
" batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别\n",
|
| 550 |
+
"\n",
|
| 551 |
+
" preds.extend(batch_preds)\n",
|
| 552 |
+
" labels.extend(batch_labels)\n",
|
| 553 |
+
" \n",
|
| 554 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 555 |
+
"ret = metric.compute(predictions=preds, references=labels)\n",
|
| 556 |
+
"\n",
|
| 557 |
+
"\n",
|
| 558 |
+
"result[\"dna_protein_pair_full\"] = ret"
|
| 559 |
+
]
|
| 560 |
+
},
|
| 561 |
+
{
|
| 562 |
+
"cell_type": "code",
|
| 563 |
+
"execution_count": 8,
|
| 564 |
+
"id": "55d7df83-ff43-4dc3-970d-8124d0f4b534",
|
| 565 |
+
"metadata": {},
|
| 566 |
+
"outputs": [
|
| 567 |
+
{
|
| 568 |
+
"data": {
|
| 569 |
+
"image/png": "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",
|
| 570 |
+
"text/plain": [
|
| 571 |
+
"<Figure size 640x480 with 2 Axes>"
|
| 572 |
+
]
|
| 573 |
+
},
|
| 574 |
+
"metadata": {},
|
| 575 |
+
"output_type": "display_data"
|
| 576 |
+
}
|
| 577 |
+
],
|
| 578 |
+
"source": [
|
| 579 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 580 |
+
"import matplotlib.pyplot as plt\n",
|
| 581 |
+
"\n",
|
| 582 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 583 |
+
"cm = confusion_matrix(labels, preds)\n",
|
| 584 |
+
"\n",
|
| 585 |
+
"# 可视化混淆矩阵\n",
|
| 586 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 587 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 588 |
+
"plt.title('Confusion Matrix')\n",
|
| 589 |
+
"plt.show()"
|
| 590 |
+
]
|
| 591 |
+
},
|
| 592 |
+
{
|
| 593 |
+
"cell_type": "code",
|
| 594 |
+
"execution_count": 9,
|
| 595 |
+
"id": "ab2de8ae-c04d-4de7-aef7-25aa66551a0a",
|
| 596 |
+
"metadata": {},
|
| 597 |
+
"outputs": [
|
| 598 |
+
{
|
| 599 |
+
"data": {
|
| 600 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 601 |
+
"model_id": "062918eaa1034dc588d04114d6b0b5e3",
|
| 602 |
+
"version_major": 2,
|
| 603 |
+
"version_minor": 0
|
| 604 |
+
},
|
| 605 |
+
"text/plain": [
|
| 606 |
+
"Map (num_proc=4): 0%| | 0/8000 [00:00<?, ? examples/s]"
|
| 607 |
+
]
|
| 608 |
+
},
|
| 609 |
+
"metadata": {},
|
| 610 |
+
"output_type": "display_data"
|
| 611 |
+
},
|
| 612 |
+
{
|
| 613 |
+
"data": {
|
| 614 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 615 |
+
"model_id": "afbefd7d107843459de649cf5e603472",
|
| 616 |
+
"version_major": 2,
|
| 617 |
+
"version_minor": 0
|
| 618 |
+
},
|
| 619 |
+
"text/plain": [
|
| 620 |
+
"Map (num_proc=4): 0%| | 0/8000 [00:00<?, ? examples/s]"
|
| 621 |
+
]
|
| 622 |
+
},
|
| 623 |
+
"metadata": {},
|
| 624 |
+
"output_type": "display_data"
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"name": "stderr",
|
| 628 |
+
"output_type": "stream",
|
| 629 |
+
"text": [
|
| 630 |
+
"Predicting: 100%|██████████| 125/125 [00:18<00:00, 6.63it/s]\n"
|
| 631 |
+
]
|
| 632 |
+
}
|
| 633 |
+
],
|
| 634 |
+
"source": [
|
| 635 |
+
"#############################################################\n",
|
| 636 |
+
"#模型测试 蛋白质数据集,随机版本\n",
|
| 637 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 638 |
+
"\n",
|
| 639 |
+
"# 定义翻转标签的函数\n",
|
| 640 |
+
"def flip_labels(example):\n",
|
| 641 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 642 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 643 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 644 |
+
" example['label'] = 1 - example['label']\n",
|
| 645 |
+
" return example\n",
|
| 646 |
+
"\n",
|
| 647 |
+
"# 应用翻转标签函数\n",
|
| 648 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 649 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)\n",
|
| 650 |
+
"\n",
|
| 651 |
+
"\n",
|
| 652 |
+
"# 确保模型在 GPU 上\n",
|
| 653 |
+
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
| 654 |
+
"model.to(device)\n",
|
| 655 |
+
"model.eval() # 进入推理模式,加速推理\n",
|
| 656 |
+
"\n",
|
| 657 |
+
"# 取出测试集数据\n",
|
| 658 |
+
"test_dataset = tokenized_datasets_dna_protein[\"test\"]\n",
|
| 659 |
+
"\n",
|
| 660 |
+
"# 预存预测结果\n",
|
| 661 |
+
"preds = []\n",
|
| 662 |
+
"labels = []\n",
|
| 663 |
+
"\n",
|
| 664 |
+
"# 批量大小(建议 64、128、256 视显存大小调整)\n",
|
| 665 |
+
"batch_size = 64\n",
|
| 666 |
+
"\n",
|
| 667 |
+
"# 直接遍历数据集进行推理\n",
|
| 668 |
+
"for i in tqdm(range(0, len(test_dataset), batch_size), desc=\"Predicting\"):\n",
|
| 669 |
+
" batch = test_dataset[i : i + batch_size]\n",
|
| 670 |
+
" \n",
|
| 671 |
+
" # 转换为 Tensor 并移动到 GPU\n",
|
| 672 |
+
" inputs = {\n",
|
| 673 |
+
" \"input_ids\": torch.tensor(batch[\"input_ids\"]).to(device),\n",
|
| 674 |
+
" \"attention_mask\": torch.tensor(batch[\"attention_mask\"]).to(device),\n",
|
| 675 |
+
" }\n",
|
| 676 |
+
" batch_labels = batch[\"label\"] # 原始标签\n",
|
| 677 |
+
"\n",
|
| 678 |
+
" with torch.no_grad(): # 关闭梯度计算,减少内存占用\n",
|
| 679 |
+
" outputs = model(**inputs)\n",
|
| 680 |
+
" batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别\n",
|
| 681 |
+
"\n",
|
| 682 |
+
" preds.extend(batch_preds)\n",
|
| 683 |
+
" labels.extend(batch_labels)\n",
|
| 684 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 685 |
+
"ret = metric.compute(predictions=preds, references=labels)\n",
|
| 686 |
+
"\n",
|
| 687 |
+
"result[\"dna_protein_pair_rand_full\"] = ret"
|
| 688 |
+
]
|
| 689 |
+
},
|
| 690 |
+
{
|
| 691 |
+
"cell_type": "code",
|
| 692 |
+
"execution_count": 10,
|
| 693 |
+
"id": "b6fc8ee6-89d3-4d32-b67d-2980a0be79cb",
|
| 694 |
+
"metadata": {},
|
| 695 |
+
"outputs": [
|
| 696 |
+
{
|
| 697 |
+
"name": "stdout",
|
| 698 |
+
"output_type": "stream",
|
| 699 |
+
"text": [
|
| 700 |
+
"{\"seed\": 7967, \"dna_protein_pair_full\": {\"accuracy\": 0.694, \"f1\": 0.6412661195779601}, \"dna_protein_pair_rand_full\": {\"accuracy\": 0.6, \"f1\": 0.6077469968129443}}\n"
|
| 701 |
+
]
|
| 702 |
+
}
|
| 703 |
+
],
|
| 704 |
+
"source": [
|
| 705 |
+
"print(json.dumps(result))"
|
| 706 |
+
]
|
| 707 |
+
},
|
| 708 |
+
{
|
| 709 |
+
"cell_type": "code",
|
| 710 |
+
"execution_count": 11,
|
| 711 |
+
"id": "f7db7f38-a3f1-45e8-bf92-af50b7b67ece",
|
| 712 |
+
"metadata": {},
|
| 713 |
+
"outputs": [],
|
| 714 |
+
"source": [
|
| 715 |
+
"model.save_pretrained(\"gpt2_gene_multi_v1_ft\")"
|
| 716 |
+
]
|
| 717 |
+
},
|
| 718 |
+
{
|
| 719 |
+
"cell_type": "code",
|
| 720 |
+
"execution_count": 12,
|
| 721 |
+
"id": "c34d5df5-7baf-4a05-ba25-7d3b99856d8f",
|
| 722 |
+
"metadata": {},
|
| 723 |
+
"outputs": [
|
| 724 |
+
{
|
| 725 |
+
"data": {
|
| 726 |
+
"text/plain": [
|
| 727 |
+
"('gpt2_gene_multi_v1_ft/tokenizer_config.json',\n",
|
| 728 |
+
" 'gpt2_gene_multi_v1_ft/special_tokens_map.json',\n",
|
| 729 |
+
" 'gpt2_gene_multi_v1_ft/tokenizer.json')"
|
| 730 |
+
]
|
| 731 |
+
},
|
| 732 |
+
"execution_count": 12,
|
| 733 |
+
"metadata": {},
|
| 734 |
+
"output_type": "execute_result"
|
| 735 |
+
}
|
| 736 |
+
],
|
| 737 |
+
"source": [
|
| 738 |
+
"tokenizer.save_pretrained(\"gpt2_gene_multi_v1_ft\")"
|
| 739 |
+
]
|
| 740 |
+
},
|
| 741 |
+
{
|
| 742 |
+
"cell_type": "code",
|
| 743 |
+
"execution_count": null,
|
| 744 |
+
"id": "15feb59b-73c1-462d-b9ed-ceb607a38f6f",
|
| 745 |
+
"metadata": {},
|
| 746 |
+
"outputs": [],
|
| 747 |
+
"source": []
|
| 748 |
+
}
|
| 749 |
+
],
|
| 750 |
+
"metadata": {
|
| 751 |
+
"kernelspec": {
|
| 752 |
+
"display_name": "Python 3 (ipykernel)",
|
| 753 |
+
"language": "python",
|
| 754 |
+
"name": "python3"
|
| 755 |
+
},
|
| 756 |
+
"language_info": {
|
| 757 |
+
"codemirror_mode": {
|
| 758 |
+
"name": "ipython",
|
| 759 |
+
"version": 3
|
| 760 |
+
},
|
| 761 |
+
"file_extension": ".py",
|
| 762 |
+
"mimetype": "text/x-python",
|
| 763 |
+
"name": "python",
|
| 764 |
+
"nbconvert_exporter": "python",
|
| 765 |
+
"pygments_lexer": "ipython3",
|
| 766 |
+
"version": "3.12.3"
|
| 767 |
+
}
|
| 768 |
+
},
|
| 769 |
+
"nbformat": 4,
|
| 770 |
+
"nbformat_minor": 5
|
| 771 |
+
}
|
best_model/gpt2_gene_multiv2_ft_en_test_others_best.ipynb
ADDED
|
@@ -0,0 +1,771 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "dcaea864-b707-4651-965d-b8eefa1b0e07",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"name": "stdout",
|
| 11 |
+
"output_type": "stream",
|
| 12 |
+
"text": [
|
| 13 |
+
"https://hf-mirror.com\n"
|
| 14 |
+
]
|
| 15 |
+
}
|
| 16 |
+
],
|
| 17 |
+
"source": [
|
| 18 |
+
"import os\n",
|
| 19 |
+
"\n",
|
| 20 |
+
"# 设置环境变量\n",
|
| 21 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 22 |
+
"\n",
|
| 23 |
+
"# 打印环境变量以确认设置成功\n",
|
| 24 |
+
"print(os.environ.get('HF_ENDPOINT'))\n",
|
| 25 |
+
"\n",
|
| 26 |
+
"# import subprocess\n",
|
| 27 |
+
"# import os\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"# result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 30 |
+
"# output = result.stdout\n",
|
| 31 |
+
"# for line in output.splitlines():\n",
|
| 32 |
+
"# if '=' in line:\n",
|
| 33 |
+
"# var, value = line.split('=', 1)\n",
|
| 34 |
+
"# os.environ[var] = value"
|
| 35 |
+
]
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"cell_type": "code",
|
| 39 |
+
"execution_count": 2,
|
| 40 |
+
"id": "73cc9d73-f0cb-4392-8280-782275dc7036",
|
| 41 |
+
"metadata": {},
|
| 42 |
+
"outputs": [
|
| 43 |
+
{
|
| 44 |
+
"name": "stderr",
|
| 45 |
+
"output_type": "stream",
|
| 46 |
+
"text": [
|
| 47 |
+
"2025-02-09 16:27:19.297328: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 48 |
+
"2025-02-09 16:27:19.311074: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 49 |
+
"2025-02-09 16:27:19.327136: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 50 |
+
"2025-02-09 16:27:19.331944: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 51 |
+
"2025-02-09 16:27:19.344392: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 52 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 53 |
+
"2025-02-09 16:27:20.187982: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 54 |
+
]
|
| 55 |
+
}
|
| 56 |
+
],
|
| 57 |
+
"source": [
|
| 58 |
+
"from datasets import load_dataset\n",
|
| 59 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 60 |
+
"from transformers import Trainer\n",
|
| 61 |
+
"import evaluate\n",
|
| 62 |
+
"import numpy as np\n",
|
| 63 |
+
"from transformers import TrainingArguments\n",
|
| 64 |
+
"from transformers import AutoModelForSequenceClassification\n",
|
| 65 |
+
"import json\n",
|
| 66 |
+
"from transformers import set_seed\n",
|
| 67 |
+
"import random\n",
|
| 68 |
+
"import numpy as np\n",
|
| 69 |
+
"import torch\n",
|
| 70 |
+
"from tqdm import tqdm"
|
| 71 |
+
]
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"cell_type": "code",
|
| 75 |
+
"execution_count": 3,
|
| 76 |
+
"id": "8255851b-d2c4-437c-a306-fcb00ccab684",
|
| 77 |
+
"metadata": {},
|
| 78 |
+
"outputs": [],
|
| 79 |
+
"source": [
|
| 80 |
+
"# seed = 42\n",
|
| 81 |
+
"# random.seed(seed)\n",
|
| 82 |
+
"# np.random.seed(seed)\n",
|
| 83 |
+
"# torch.manual_seed(seed)\n",
|
| 84 |
+
"# torch.cuda.manual_seed_all(seed)\n",
|
| 85 |
+
"\n",
|
| 86 |
+
"\n",
|
| 87 |
+
"# 动态生成随机种子\n",
|
| 88 |
+
"import random\n",
|
| 89 |
+
"#seed = random.randint(0, 10000)\n",
|
| 90 |
+
"seed = 2621\n",
|
| 91 |
+
"#print(f\"Generated seed: {seed}\")\n",
|
| 92 |
+
"set_seed(seed)\n",
|
| 93 |
+
"result = {}\n",
|
| 94 |
+
"result[\"seed\"] = seed"
|
| 95 |
+
]
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"cell_type": "code",
|
| 99 |
+
"execution_count": 4,
|
| 100 |
+
"id": "2a744bd7-b674-4048-b303-d4f85bdd694d",
|
| 101 |
+
"metadata": {},
|
| 102 |
+
"outputs": [],
|
| 103 |
+
"source": [
|
| 104 |
+
"# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象\n",
|
| 105 |
+
"raw_datasets = load_dataset('google-research-datasets/paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x\n",
|
| 106 |
+
"\n",
|
| 107 |
+
"#分词器\n",
|
| 108 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"dnagpt/gpt2_gene_multi_v2\")\n",
|
| 109 |
+
"tokenizer.pad_token = tokenizer.eos_token\n",
|
| 110 |
+
"\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"#分词函数\n",
|
| 113 |
+
"def tokenize_function(example):\n",
|
| 114 |
+
" return tokenizer(example[\"sentence1\"], example[\"sentence2\"], truncation=True,max_length=256, padding=\"max_length\")\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"#构建分词后的数据集\n",
|
| 117 |
+
"tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)\n",
|
| 118 |
+
"\n",
|
| 119 |
+
"#训练数据构建\n",
|
| 120 |
+
"data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
|
| 121 |
+
]
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"cell_type": "code",
|
| 125 |
+
"execution_count": 5,
|
| 126 |
+
"id": "b2d3081f-1df2-45fa-a3f6-1516c19d7318",
|
| 127 |
+
"metadata": {},
|
| 128 |
+
"outputs": [
|
| 129 |
+
{
|
| 130 |
+
"name": "stderr",
|
| 131 |
+
"output_type": "stream",
|
| 132 |
+
"text": [
|
| 133 |
+
"/root/miniconda3/lib/python3.12/site-packages/transformers/training_args.py:1545: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
|
| 134 |
+
" warnings.warn(\n",
|
| 135 |
+
"Some weights of GPT2ForSequenceClassification were not initialized from the model checkpoint at dnagpt/gpt2_gene_multi_v2 and are newly initialized: ['score.weight']\n",
|
| 136 |
+
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
| 137 |
+
]
|
| 138 |
+
}
|
| 139 |
+
],
|
| 140 |
+
"source": [
|
| 141 |
+
"#指标函数定义\n",
|
| 142 |
+
"def compute_metrics(eval_pred):\n",
|
| 143 |
+
" predictions, labels = eval_pred\n",
|
| 144 |
+
" predictions = np.argmax(predictions, axis=1)\n",
|
| 145 |
+
" return {'accuracy': (predictions==labels).sum() / len(labels)}\n",
|
| 146 |
+
"\n",
|
| 147 |
+
"\n",
|
| 148 |
+
"\n",
|
| 149 |
+
"training_args = TrainingArguments(\n",
|
| 150 |
+
" output_dir=\"ds_job_dna_2222\",\n",
|
| 151 |
+
" learning_rate=1e-5,\n",
|
| 152 |
+
" lr_scheduler_type=\"constant_with_warmup\",\n",
|
| 153 |
+
" warmup_ratio=0.1,\n",
|
| 154 |
+
" optim='adamw_torch',\n",
|
| 155 |
+
" weight_decay=0.0,\n",
|
| 156 |
+
" seed=seed, # 使用动态生成的随机种子\n",
|
| 157 |
+
" per_device_train_batch_size=64,\n",
|
| 158 |
+
" per_device_eval_batch_size=64,\n",
|
| 159 |
+
" num_train_epochs=4, #训练多少轮\n",
|
| 160 |
+
" evaluation_strategy=\"epoch\",\n",
|
| 161 |
+
" save_strategy=\"epoch\",\n",
|
| 162 |
+
" logging_strategy=\"epoch\",\n",
|
| 163 |
+
" load_best_model_at_end=True\n",
|
| 164 |
+
")\n",
|
| 165 |
+
"\n",
|
| 166 |
+
"#模型定义,文本分类模型\n",
|
| 167 |
+
"model = AutoModelForSequenceClassification.from_pretrained(\"dnagpt/gpt2_gene_multi_v2\", num_labels=2)\n",
|
| 168 |
+
"model.config.pad_token_id = model.config.eos_token_id\n",
|
| 169 |
+
"\n",
|
| 170 |
+
"trainer = Trainer(\n",
|
| 171 |
+
" model,\n",
|
| 172 |
+
" training_args,\n",
|
| 173 |
+
" train_dataset=tokenized_datasets[\"train\"],\n",
|
| 174 |
+
" eval_dataset=tokenized_datasets[\"validation\"],\n",
|
| 175 |
+
" data_collator=data_collator,\n",
|
| 176 |
+
" tokenizer=tokenizer,\n",
|
| 177 |
+
" compute_metrics=compute_metrics,\n",
|
| 178 |
+
")"
|
| 179 |
+
]
|
| 180 |
+
},
|
| 181 |
+
{
|
| 182 |
+
"cell_type": "code",
|
| 183 |
+
"execution_count": 6,
|
| 184 |
+
"id": "06f4ea9e-dbac-405e-8875-aea569c708cf",
|
| 185 |
+
"metadata": {},
|
| 186 |
+
"outputs": [
|
| 187 |
+
{
|
| 188 |
+
"name": "stdout",
|
| 189 |
+
"output_type": "stream",
|
| 190 |
+
"text": [
|
| 191 |
+
"[2025-02-09 16:27:34,332] [INFO] [real_accelerator.py:219:get_accelerator] Setting ds_accelerator to cuda (auto detect)\n"
|
| 192 |
+
]
|
| 193 |
+
},
|
| 194 |
+
{
|
| 195 |
+
"name": "stderr",
|
| 196 |
+
"output_type": "stream",
|
| 197 |
+
"text": [
|
| 198 |
+
"/root/miniconda3/compiler_compat/ld: cannot find -laio: No such file or directory\n",
|
| 199 |
+
"collect2: error: ld returned 1 exit status\n",
|
| 200 |
+
"/root/miniconda3/compiler_compat/ld: warning: libpthread.so.0, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 201 |
+
"/root/miniconda3/compiler_compat/ld: warning: libstdc++.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 202 |
+
"/root/miniconda3/compiler_compat/ld: warning: libm.so.6, needed by /usr/local/cuda/lib64/libcufile.so, not found (try using -rpath or -rpath-link)\n",
|
| 203 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::runtime_error::~runtime_error()@GLIBCXX_3.4'\n",
|
| 204 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__gxx_personality_v0@CXXABI_1.3'\n",
|
| 205 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::tellp()@GLIBCXX_3.4'\n",
|
| 206 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::steady_clock::now()@GLIBCXX_3.4.19'\n",
|
| 207 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_replace_aux(unsigned long, unsigned long, unsigned long, char)@GLIBCXX_3.4'\n",
|
| 208 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for bool@CXXABI_1.3'\n",
|
| 209 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_logic_error(char const*)@GLIBCXX_3.4'\n",
|
| 210 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 211 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::logic_error@GLIBCXX_3.4'\n",
|
| 212 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::~locale()@GLIBCXX_3.4'\n",
|
| 213 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 214 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_end_catch@CXXABI_1.3'\n",
|
| 215 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 216 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::logic_error::~logic_error()@GLIBCXX_3.4'\n",
|
| 217 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info@CXXABI_1.3'\n",
|
| 218 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 219 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 220 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new[](unsigned long)@GLIBCXX_3.4'\n",
|
| 221 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak_hard()@GLIBCXX_3.4'\n",
|
| 222 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 223 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::basic_streambuf(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 224 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 225 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)@GLIBCXX_3.4'\n",
|
| 226 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned short@CXXABI_1.3'\n",
|
| 227 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::resize(unsigned long, char)@GLIBCXX_3.4'\n",
|
| 228 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char const*@CXXABI_1.3'\n",
|
| 229 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'\n",
|
| 230 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_invalid_argument(char const*)@GLIBCXX_3.4'\n",
|
| 231 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::operator=(std::locale const&)@GLIBCXX_3.4'\n",
|
| 232 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::_M_cache_locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 233 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 234 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_free_exception@CXXABI_1.3'\n",
|
| 235 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::notify_one()@GLIBCXX_3.4.11'\n",
|
| 236 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::~Init()@GLIBCXX_3.4'\n",
|
| 237 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@GLIBCXX_3.4'\n",
|
| 238 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_pure_virtual@CXXABI_1.3'\n",
|
| 239 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::flush()@GLIBCXX_3.4'\n",
|
| 240 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for __cxxabiv1::__class_type_info@CXXABI_1.3'\n",
|
| 241 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_rethrow@CXXABI_1.3'\n",
|
| 242 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 243 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_fstream<char, std::char_traits<char> >::~basic_fstream()@GLIBCXX_3.4'\n",
|
| 244 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::compare(char const*) const@GLIBCXX_3.4'\n",
|
| 245 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 246 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale()@GLIBCXX_3.4'\n",
|
| 247 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::chrono::_V2::system_clock::now()@GLIBCXX_3.4.19'\n",
|
| 248 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 249 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Hash_bytes(void const*, unsigned long, unsigned long)@CXXABI_1.3.5'\n",
|
| 250 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long long>(long long)@GLIBCXX_3.4.9'\n",
|
| 251 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for char*@CXXABI_1.3'\n",
|
| 252 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const@GLIBCXX_3.4.18'\n",
|
| 253 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::out_of_range@GLIBCXX_3.4'\n",
|
| 254 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)@GLIBCXX_3.4.9'\n",
|
| 255 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)@GLIBCXX_3.4'\n",
|
| 256 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::~ios_base()@GLIBCXX_3.4'\n",
|
| 257 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::range_error::~range_error()@GLIBCXX_3.4'\n",
|
| 258 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::~__basic_file()@GLIBCXX_3.4'\n",
|
| 259 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_acquire@CXXABI_1.3'\n",
|
| 260 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<bool>(bool)@GLIBCXX_3.4.9'\n",
|
| 261 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::overflow_error@GLIBCXX_3.4'\n",
|
| 262 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 263 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::range_error@GLIBCXX_3.4'\n",
|
| 264 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 265 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_filebuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 266 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete[](void*)@GLIBCXX_3.4'\n",
|
| 267 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 268 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(unsigned long, char, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 269 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 270 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::replace(unsigned long, unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 271 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::exception@GLIBCXX_3.4'\n",
|
| 272 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_destroy(std::allocator<wchar_t> const&)@GLIBCXX_3.4'\n",
|
| 273 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream& std::istream::_M_extract<double>(double&)@GLIBCXX_3.4.9'\n",
|
| 274 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 275 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_fstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 276 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 277 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(std::string const&)@GLIBCXX_3.4'\n",
|
| 278 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator new(unsigned long)@GLIBCXX_3.4'\n",
|
| 279 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 280 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned int@CXXABI_1.3'\n",
|
| 281 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::append(char const*)@GLIBCXX_3.4'\n",
|
| 282 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::domain_error@GLIBCXX_3.4'\n",
|
| 283 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char, unsigned long) const@GLIBCXX_3.4'\n",
|
| 284 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::put(char)@GLIBCXX_3.4'\n",
|
| 285 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int@CXXABI_1.3'\n",
|
| 286 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_alloc()@GLIBCXX_3.4'\n",
|
| 287 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_thread_atexit@CXXABI_1.3.7'\n",
|
| 288 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 289 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()@GLIBCXX_3.4'\n",
|
| 290 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::Init::Init()@GLIBCXX_3.4'\n",
|
| 291 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::condition_variable()@GLIBCXX_3.4.11'\n",
|
| 292 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf()@GLIBCXX_3.4'\n",
|
| 293 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 294 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::domain_error::~domain_error()@GLIBCXX_3.4'\n",
|
| 295 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cerr@GLIBCXX_3.4'\n",
|
| 296 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::find(char const*, unsigned long, unsigned long) const@GLIBCXX_3.4'\n",
|
| 297 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 298 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 299 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@GLIBCXX_3.4'\n",
|
| 300 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::invalid_argument@GLIBCXX_3.4'\n",
|
| 301 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void*@CXXABI_1.3'\n",
|
| 302 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(std::string const&)@GLIBCXX_3.4'\n",
|
| 303 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()@GLIBCXX_3.4'\n",
|
| 304 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 305 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long@CXXABI_1.3'\n",
|
| 306 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'\n",
|
| 307 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__detail::_List_node_base::_M_unhook()@GLIBCXX_3.4.15'\n",
|
| 308 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 309 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(char*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 310 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<char, std::char_traits<char> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 311 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::locale::locale(std::locale const&)@GLIBCXX_3.4'\n",
|
| 312 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_istringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 313 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `log2f@GLIBC_2.2.5'\n",
|
| 314 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 315 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 316 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::exception::~exception()@GLIBCXX_3.4'\n",
|
| 317 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 318 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__basic_file<char>::is_open() const@GLIBCXX_3.4'\n",
|
| 319 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_istringstream()@GLIBCXX_3.4'\n",
|
| 320 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::swap(std::string&)@GLIBCXX_3.4'\n",
|
| 321 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long*@CXXABI_1.3'\n",
|
| 322 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4'\n",
|
| 323 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::basic_streambuf(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 324 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*)@GLIBCXX_3.4'\n",
|
| 325 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_bad_cast()@GLIBCXX_3.4'\n",
|
| 326 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)@GLIBCXX_3.4'\n",
|
| 327 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >::operator=(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> > const&)@GLIBCXX_3.4'\n",
|
| 328 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `operator delete(void*)@GLIBCXX_3.4'\n",
|
| 329 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream::operator<<(int)@GLIBCXX_3.4'\n",
|
| 330 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 331 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_Rep::_M_destroy(std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 332 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_iostream<wchar_t, std::char_traits<wchar_t> >::~basic_iostream()@GLIBCXX_3.4'\n",
|
| 333 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::runtime_error@GLIBCXX_3.4'\n",
|
| 334 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ofstream<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 335 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)@GLIBCXX_3.4'\n",
|
| 336 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()@GLIBCXX_3.4'\n",
|
| 337 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `VTT for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 338 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<long>(long)@GLIBCXX_3.4.9'\n",
|
| 339 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::get()@GLIBCXX_3.4'\n",
|
| 340 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned long long@CXXABI_1.3'\n",
|
| 341 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@GLIBCXX_3.4'\n",
|
| 342 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::out_of_range::~out_of_range()@GLIBCXX_3.4'\n",
|
| 343 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::length_error::~length_error()@GLIBCXX_3.4'\n",
|
| 344 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)@GLIBCXX_3.4.9'\n",
|
| 345 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::invalid_argument::~invalid_argument()@GLIBCXX_3.4'\n",
|
| 346 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::swap(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)@GLIBCXX_3.4'\n",
|
| 347 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::cout@GLIBCXX_3.4'\n",
|
| 348 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<unsigned long long>(unsigned long long)@GLIBCXX_3.4.9'\n",
|
| 349 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for int*@CXXABI_1.3'\n",
|
| 350 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<void const*>(void const*)@GLIBCXX_3.4.9'\n",
|
| 351 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::underflow_error@GLIBCXX_3.4'\n",
|
| 352 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_streambuf<char, std::char_traits<char> >@GLIBCXX_3.4'\n",
|
| 353 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for std::out_of_range@GLIBCXX_3.4'\n",
|
| 354 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_allocate_exception@CXXABI_1.3'\n",
|
| 355 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_ios<wchar_t, std::char_traits<wchar_t> >@GLIBCXX_3.4'\n",
|
| 356 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for void const*@CXXABI_1.3'\n",
|
| 357 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ios<wchar_t, std::char_traits<wchar_t> >::init(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >*)@GLIBCXX_3.4'\n",
|
| 358 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::reserve(unsigned long)@GLIBCXX_3.4'\n",
|
| 359 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_begin_catch@CXXABI_1.3'\n",
|
| 360 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long@CXXABI_1.3'\n",
|
| 361 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_empty_rep_storage@GLIBCXX_3.4'\n",
|
| 362 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::_M_leak()@GLIBCXX_3.4'\n",
|
| 363 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)@GLIBCXX_3.4'\n",
|
| 364 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_sync(wchar_t*, unsigned long, unsigned long)@GLIBCXX_3.4'\n",
|
| 365 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::istream::getline(char*, long, char)@GLIBCXX_3.4'\n",
|
| 366 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char)@GLIBCXX_3.4'\n",
|
| 367 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 368 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::condition_variable::~condition_variable()@GLIBCXX_3.4.11'\n",
|
| 369 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >@GLIBCXX_3.4'\n",
|
| 370 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::insert(unsigned long, char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 371 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::string::assign(char const*, unsigned long)@GLIBCXX_3.4'\n",
|
| 372 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for unsigned char@CXXABI_1.3'\n",
|
| 373 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ios_base::ios_base()@GLIBCXX_3.4'\n",
|
| 374 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_out_of_range(char const*)@GLIBCXX_3.4'\n",
|
| 375 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::overflow_error::~overflow_error()@GLIBCXX_3.4'\n",
|
| 376 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_length_error(char const*)@GLIBCXX_3.4'\n",
|
| 377 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::__throw_system_error(int)@GLIBCXX_3.4.11'\n",
|
| 378 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 379 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::ostream& std::ostream::_M_insert<double>(double)@GLIBCXX_3.4.9'\n",
|
| 380 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::operator=(std::basic_streambuf<char, std::char_traits<char> > const&)@GLIBCXX_3.4'\n",
|
| 381 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `typeinfo for long long@CXXABI_1.3'\n",
|
| 382 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)@GLIBCXX_3.4'\n",
|
| 383 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::close()@GLIBCXX_3.4'\n",
|
| 384 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_guard_release@CXXABI_1.3'\n",
|
| 385 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `__cxa_throw@CXXABI_1.3'\n",
|
| 386 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::underflow_error::~underflow_error()@GLIBCXX_3.4'\n",
|
| 387 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)@GLIBCXX_3.4'\n",
|
| 388 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `vtable for std::length_error@GLIBCXX_3.4'\n",
|
| 389 |
+
"/root/miniconda3/compiler_compat/ld: /usr/local/cuda/lib64/libcufile.so: undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf()@GLIBCXX_3.4'\n",
|
| 390 |
+
"collect2: error: ld returned 1 exit status\n"
|
| 391 |
+
]
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"data": {
|
| 395 |
+
"text/html": [
|
| 396 |
+
"\n",
|
| 397 |
+
" <div>\n",
|
| 398 |
+
" \n",
|
| 399 |
+
" <progress value='3088' max='3088' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
| 400 |
+
" [3088/3088 22:00, Epoch 4/4]\n",
|
| 401 |
+
" </div>\n",
|
| 402 |
+
" <table border=\"1\" class=\"dataframe\">\n",
|
| 403 |
+
" <thead>\n",
|
| 404 |
+
" <tr style=\"text-align: left;\">\n",
|
| 405 |
+
" <th>Epoch</th>\n",
|
| 406 |
+
" <th>Training Loss</th>\n",
|
| 407 |
+
" <th>Validation Loss</th>\n",
|
| 408 |
+
" <th>Accuracy</th>\n",
|
| 409 |
+
" </tr>\n",
|
| 410 |
+
" </thead>\n",
|
| 411 |
+
" <tbody>\n",
|
| 412 |
+
" <tr>\n",
|
| 413 |
+
" <td>1</td>\n",
|
| 414 |
+
" <td>0.649400</td>\n",
|
| 415 |
+
" <td>0.484690</td>\n",
|
| 416 |
+
" <td>0.771000</td>\n",
|
| 417 |
+
" </tr>\n",
|
| 418 |
+
" <tr>\n",
|
| 419 |
+
" <td>2</td>\n",
|
| 420 |
+
" <td>0.402200</td>\n",
|
| 421 |
+
" <td>0.359919</td>\n",
|
| 422 |
+
" <td>0.849500</td>\n",
|
| 423 |
+
" </tr>\n",
|
| 424 |
+
" <tr>\n",
|
| 425 |
+
" <td>3</td>\n",
|
| 426 |
+
" <td>0.262500</td>\n",
|
| 427 |
+
" <td>0.431527</td>\n",
|
| 428 |
+
" <td>0.846500</td>\n",
|
| 429 |
+
" </tr>\n",
|
| 430 |
+
" <tr>\n",
|
| 431 |
+
" <td>4</td>\n",
|
| 432 |
+
" <td>0.194800</td>\n",
|
| 433 |
+
" <td>0.344590</td>\n",
|
| 434 |
+
" <td>0.868000</td>\n",
|
| 435 |
+
" </tr>\n",
|
| 436 |
+
" </tbody>\n",
|
| 437 |
+
"</table><p>"
|
| 438 |
+
],
|
| 439 |
+
"text/plain": [
|
| 440 |
+
"<IPython.core.display.HTML object>"
|
| 441 |
+
]
|
| 442 |
+
},
|
| 443 |
+
"metadata": {},
|
| 444 |
+
"output_type": "display_data"
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"data": {
|
| 448 |
+
"text/plain": [
|
| 449 |
+
"TrainOutput(global_step=3088, training_loss=0.37721804880725285, metrics={'train_runtime': 1321.4067, 'train_samples_per_second': 149.541, 'train_steps_per_second': 2.337, 'total_flos': 2.5816641551990784e+16, 'train_loss': 0.37721804880725285, 'epoch': 4.0})"
|
| 450 |
+
]
|
| 451 |
+
},
|
| 452 |
+
"execution_count": 6,
|
| 453 |
+
"metadata": {},
|
| 454 |
+
"output_type": "execute_result"
|
| 455 |
+
}
|
| 456 |
+
],
|
| 457 |
+
"source": [
|
| 458 |
+
"trainer.train() #模型训练"
|
| 459 |
+
]
|
| 460 |
+
},
|
| 461 |
+
{
|
| 462 |
+
"cell_type": "code",
|
| 463 |
+
"execution_count": 7,
|
| 464 |
+
"id": "adacc2bb-bda6-4e9f-92fb-54d64c324147",
|
| 465 |
+
"metadata": {},
|
| 466 |
+
"outputs": [
|
| 467 |
+
{
|
| 468 |
+
"data": {
|
| 469 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 470 |
+
"model_id": "459c442921c14438bd4b8059814e82bb",
|
| 471 |
+
"version_major": 2,
|
| 472 |
+
"version_minor": 0
|
| 473 |
+
},
|
| 474 |
+
"text/plain": [
|
| 475 |
+
"Map (num_proc=4): 0%| | 0/3600 [00:00<?, ? examples/s]"
|
| 476 |
+
]
|
| 477 |
+
},
|
| 478 |
+
"metadata": {},
|
| 479 |
+
"output_type": "display_data"
|
| 480 |
+
},
|
| 481 |
+
{
|
| 482 |
+
"data": {
|
| 483 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 484 |
+
"model_id": "557a2495904c43feba126bcc26cae03e",
|
| 485 |
+
"version_major": 2,
|
| 486 |
+
"version_minor": 0
|
| 487 |
+
},
|
| 488 |
+
"text/plain": [
|
| 489 |
+
"Map (num_proc=4): 0%| | 0/400 [00:00<?, ? examples/s]"
|
| 490 |
+
]
|
| 491 |
+
},
|
| 492 |
+
"metadata": {},
|
| 493 |
+
"output_type": "display_data"
|
| 494 |
+
},
|
| 495 |
+
{
|
| 496 |
+
"name": "stderr",
|
| 497 |
+
"output_type": "stream",
|
| 498 |
+
"text": [
|
| 499 |
+
"Predicting: 100%|██████████| 7/7 [00:00<00:00, 7.28it/s]\n"
|
| 500 |
+
]
|
| 501 |
+
}
|
| 502 |
+
],
|
| 503 |
+
"source": [
|
| 504 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 505 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 506 |
+
"\n",
|
| 507 |
+
"# 定义翻转标签的函数\n",
|
| 508 |
+
"def flip_labels(example):\n",
|
| 509 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 510 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 511 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 512 |
+
" example['label'] = 1 - example['label']\n",
|
| 513 |
+
" return example\n",
|
| 514 |
+
"\n",
|
| 515 |
+
"# 应用翻转标签函数\n",
|
| 516 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 517 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)\n",
|
| 518 |
+
"\n",
|
| 519 |
+
"\n",
|
| 520 |
+
"\n",
|
| 521 |
+
"# 确保模型在 GPU 上\n",
|
| 522 |
+
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
| 523 |
+
"model.to(device)\n",
|
| 524 |
+
"model.eval() # 进入推理模式,加速推理\n",
|
| 525 |
+
"\n",
|
| 526 |
+
"# 取出测试集数据\n",
|
| 527 |
+
"test_dataset = tokenized_datasets_dna_protein[\"test\"]\n",
|
| 528 |
+
"\n",
|
| 529 |
+
"# 预存预测结果\n",
|
| 530 |
+
"preds = []\n",
|
| 531 |
+
"labels = []\n",
|
| 532 |
+
"\n",
|
| 533 |
+
"# 批量大小(建议 64、128、256 视显存大小调整)\n",
|
| 534 |
+
"batch_size = 64\n",
|
| 535 |
+
"\n",
|
| 536 |
+
"# 直接遍历数据集进行推理\n",
|
| 537 |
+
"for i in tqdm(range(0, len(test_dataset), batch_size), desc=\"Predicting\"):\n",
|
| 538 |
+
" batch = test_dataset[i : i + batch_size]\n",
|
| 539 |
+
" \n",
|
| 540 |
+
" # 转换为 Tensor 并移动到 GPU\n",
|
| 541 |
+
" inputs = {\n",
|
| 542 |
+
" \"input_ids\": torch.tensor(batch[\"input_ids\"]).to(device),\n",
|
| 543 |
+
" \"attention_mask\": torch.tensor(batch[\"attention_mask\"]).to(device),\n",
|
| 544 |
+
" }\n",
|
| 545 |
+
" batch_labels = batch[\"label\"] # 原始标签\n",
|
| 546 |
+
"\n",
|
| 547 |
+
" with torch.no_grad(): # 关闭梯度计算,减少内存占用\n",
|
| 548 |
+
" outputs = model(**inputs)\n",
|
| 549 |
+
" batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别\n",
|
| 550 |
+
"\n",
|
| 551 |
+
" preds.extend(batch_preds)\n",
|
| 552 |
+
" labels.extend(batch_labels)\n",
|
| 553 |
+
" \n",
|
| 554 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 555 |
+
"ret = metric.compute(predictions=preds, references=labels)\n",
|
| 556 |
+
"\n",
|
| 557 |
+
"\n",
|
| 558 |
+
"result[\"dna_protein_pair_full\"] = ret"
|
| 559 |
+
]
|
| 560 |
+
},
|
| 561 |
+
{
|
| 562 |
+
"cell_type": "code",
|
| 563 |
+
"execution_count": 8,
|
| 564 |
+
"id": "ab2de8ae-c04d-4de7-aef7-25aa66551a0a",
|
| 565 |
+
"metadata": {},
|
| 566 |
+
"outputs": [
|
| 567 |
+
{
|
| 568 |
+
"data": {
|
| 569 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 570 |
+
"model_id": "0f685ff06b6549bf99c52993afff9c6d",
|
| 571 |
+
"version_major": 2,
|
| 572 |
+
"version_minor": 0
|
| 573 |
+
},
|
| 574 |
+
"text/plain": [
|
| 575 |
+
"Map (num_proc=4): 0%| | 0/8000 [00:00<?, ? examples/s]"
|
| 576 |
+
]
|
| 577 |
+
},
|
| 578 |
+
"metadata": {},
|
| 579 |
+
"output_type": "display_data"
|
| 580 |
+
},
|
| 581 |
+
{
|
| 582 |
+
"data": {
|
| 583 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 584 |
+
"model_id": "e2fddae113df4960ae02ab4801dde622",
|
| 585 |
+
"version_major": 2,
|
| 586 |
+
"version_minor": 0
|
| 587 |
+
},
|
| 588 |
+
"text/plain": [
|
| 589 |
+
"Map (num_proc=4): 0%| | 0/8000 [00:00<?, ? examples/s]"
|
| 590 |
+
]
|
| 591 |
+
},
|
| 592 |
+
"metadata": {},
|
| 593 |
+
"output_type": "display_data"
|
| 594 |
+
},
|
| 595 |
+
{
|
| 596 |
+
"name": "stderr",
|
| 597 |
+
"output_type": "stream",
|
| 598 |
+
"text": [
|
| 599 |
+
"Predicting: 100%|██████████| 125/125 [00:18<00:00, 6.63it/s]\n"
|
| 600 |
+
]
|
| 601 |
+
}
|
| 602 |
+
],
|
| 603 |
+
"source": [
|
| 604 |
+
"#############################################################\n",
|
| 605 |
+
"#模型测试 蛋白质数据集,随机版本\n",
|
| 606 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 607 |
+
"\n",
|
| 608 |
+
"# 定义翻转标签的函数\n",
|
| 609 |
+
"def flip_labels(example):\n",
|
| 610 |
+
" # 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token\n",
|
| 611 |
+
" example[\"sentence1\"] = example[\"sentence1\"]\n",
|
| 612 |
+
" example[\"sentence2\"] = example[\"sentence2\"]\n",
|
| 613 |
+
" example['label'] = 1 - example['label']\n",
|
| 614 |
+
" return example\n",
|
| 615 |
+
"\n",
|
| 616 |
+
"# 应用翻转标签函数\n",
|
| 617 |
+
"flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)\n",
|
| 618 |
+
"tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)\n",
|
| 619 |
+
"\n",
|
| 620 |
+
"\n",
|
| 621 |
+
"# 确保模型在 GPU 上\n",
|
| 622 |
+
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
| 623 |
+
"model.to(device)\n",
|
| 624 |
+
"model.eval() # 进入推理模式,加速推理\n",
|
| 625 |
+
"\n",
|
| 626 |
+
"# 取出测试集数据\n",
|
| 627 |
+
"test_dataset = tokenized_datasets_dna_protein[\"test\"]\n",
|
| 628 |
+
"\n",
|
| 629 |
+
"# 预存预测结果\n",
|
| 630 |
+
"preds = []\n",
|
| 631 |
+
"labels = []\n",
|
| 632 |
+
"\n",
|
| 633 |
+
"# 批量大小(建议 64、128、256 视显存大小调整)\n",
|
| 634 |
+
"batch_size = 64\n",
|
| 635 |
+
"\n",
|
| 636 |
+
"# 直接遍历数据集进行推理\n",
|
| 637 |
+
"for i in tqdm(range(0, len(test_dataset), batch_size), desc=\"Predicting\"):\n",
|
| 638 |
+
" batch = test_dataset[i : i + batch_size]\n",
|
| 639 |
+
" \n",
|
| 640 |
+
" # 转换为 Tensor 并移动到 GPU\n",
|
| 641 |
+
" inputs = {\n",
|
| 642 |
+
" \"input_ids\": torch.tensor(batch[\"input_ids\"]).to(device),\n",
|
| 643 |
+
" \"attention_mask\": torch.tensor(batch[\"attention_mask\"]).to(device),\n",
|
| 644 |
+
" }\n",
|
| 645 |
+
" batch_labels = batch[\"label\"] # 原始标签\n",
|
| 646 |
+
"\n",
|
| 647 |
+
" with torch.no_grad(): # 关闭梯度计算,减少内存占用\n",
|
| 648 |
+
" outputs = model(**inputs)\n",
|
| 649 |
+
" batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别\n",
|
| 650 |
+
"\n",
|
| 651 |
+
" preds.extend(batch_preds)\n",
|
| 652 |
+
" labels.extend(batch_labels)\n",
|
| 653 |
+
"metric = evaluate.load(\"glue\", \"mrpc\")\n",
|
| 654 |
+
"ret = metric.compute(predictions=preds, references=labels)\n",
|
| 655 |
+
"\n",
|
| 656 |
+
"result[\"dna_protein_pair_rand_full\"] = ret"
|
| 657 |
+
]
|
| 658 |
+
},
|
| 659 |
+
{
|
| 660 |
+
"cell_type": "code",
|
| 661 |
+
"execution_count": 9,
|
| 662 |
+
"id": "b12be26b-8f77-4b90-8aef-52ecd4ca242e",
|
| 663 |
+
"metadata": {},
|
| 664 |
+
"outputs": [
|
| 665 |
+
{
|
| 666 |
+
"data": {
|
| 667 |
+
"image/png": "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a9bA19cX06ZNw/z583Xqj4iewcCrlIj+sf78809x+PDhYoMGDUSlUilaWVmJPj4+4tKlS8W8vDypXWFhoThz5kzR1dVVrFmzpujs7CxOnjxZo40oPlrWHBgYWOY6Ty6nfdqyZlEUxT179ojNmzcXlUql2KRJE/Hbb78ts6x57969Yp8+fUQnJydRqVSKTk5O4ttvvy3++eefZa7x5NLfX3/9VfTx8RHNzMxEtVot9u7dWzx//rxGm9LrPblses2aNSIAMSkp6anvqShqLmt+mqcta/7www/FunXrimZmZqKPj48YFxdX7nLkn376SfT09BRr1KihcZ9dunQRmzVrVu41H+8nOztbdHFxEVu3bi0WFhZqtBs3bpyoUCjEuLg4rfdARLoRRFGHGXBEREREBsA5LERERCR7TFiIiIhI9piwEBERkewxYSEiIiLZY8JCREREsseEhYiIiGSPD46rYiUlJUhJSYGVlZVeHwlOREQvhiiKuH//PpycnKRvBNe3vLw8FBQU6KUvpVIJU1NTvfQlJ0xYqlhKSgqcnZ0NHQYREVXSjRs3UK9ePb33m5eXBzOrWkDRQ7305+joiKSkJKNLWpiwVDErKysAgHPoWiiU5gaOhqhqLHu3raFDIKoyD3Pu403fFtLPc30rKCgAih5C5RkCmCgr11lxAdLOr0VBQQETFtJN6TCQQmkOhYoJCxknC8uq+UFOJCdVPqxfwxRCJRMWUTDeqalMWIiIiORAAFDZpMiIp0oyYSEiIpIDQfFoq2wfRsp474yIiIiMBissREREciAIehgSMt4xISYsREREcsAhIa2M986IiIjIaLDCQkREJAccEtKKCQsREZEs6GFIyIgHToz3zoiIiMhosMJCREQkBxwS0ooJCxERkRxwlZBWxntnREREZDRYYSEiIpIDDglpxYSFiIhIDjgkpBUTFiIiIjlghUUr403FiIiIyGiwwkJERCQHHBLSigkLERGRHAiCHhIWDgkRERERGQwrLERERHKgEB5tle3DSDFhISIikgPOYdHKeO+MiIiIjAYrLERERHLA57BoxYSFiIhIDjgkpJXx3hkREREZDVZYiIiI5IBDQloxYSEiIpIDDglpxYSFiIhIDlhh0cp4UzEiIiIyGqywEBERyQGHhLRiwkJERCQHHBLSynhTMSIiIjIaTFiIiIhkQfH3sNDzbjr+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wNvbG++88w4GDx6MWbNmSW1cXV0RHR2NmJgYtGzZEp999hlWrVpV4SXNACfdEhERyYIhvvxQFEWtx52dnXHgwIFn9uPi4oJffvlFaxtfX1+cOnVKp/gexwoLERERyR4rLERERDLALz/UjgkLERGRDBhiSOifhAkLERGRDLDCoh3nsBAREZHsscJCREQkB3oYEoLxFliYsBAREckBh4S045AQERERyR4rLERERDLAVULaMWEhIiKSAQ4JacchISIiIpI9VliIiIhkgENC2jFhISIikgEOCWnHISEiIiKSPVZYiIiIZIAVFu2YsBAREckA57Box4SFiIhIBlhh0Y5zWIiIiEj2WGEhIiKSAQ4JaceEhYiISAY4JKQdh4SIiIhI9lhhISIikgEBehgS0ksk8sSEhYiISAYUggBFJTOWyp4vZxwSIiIiItljhYWIiEgGuEpIOyYsREREMsBVQtoxYSEiIpIBhfBoq2wfxopzWIiIiEj2WGEhIiKSA0EPQzpGXGFhwkJERCQDnHSrHYeEiIiISPZYYSEiIpIB4X//VbYPY8WEhYiISAa4Skg7DgkRERGR7LHCQkREJAN8cJx2FUpYfv755wp3+Prrrz93MERERNUVVwlpV6GEpW/fvhXqTBAEFBcXVyYeIiIiojIqlLCUlJRUdRxERETVmkIQoKhkiaSy58tZpeaw5OXlwdTUVF+xEBERVVscEtJO51VCxcXFmD17Nl566SVYWlri6tWrAIBp06bhm2++0XuARERE1UHppNvKbsZK54Rl7ty5iIyMxPz586FUKqX9zZs3x6pVq/QaHBERERHwHAnLunXr8NVXX2HgwIEwMTGR9rds2RIXL17Ua3BERETVRemQUGU3Y6XzHJZbt26hUaNGZfaXlJSgsLBQL0ERERFVN5x0q53OFRZPT0/89ttvZfb/8MMPePnll/USFBEREdHjdK6wTJ8+HSEhIbh16xZKSkqwdetWJCYmYt26dYiKiqqKGImIiIye8L+tsn0YK50rLH369MGOHTvw66+/wsLCAtOnT8eFCxewY8cOvPbaa1URIxERkdHjKiHtnus5LJ06dUJMTIy+YyEiIiIq13M/OO7EiRO4cOECgEfzWtq0aaO3oIiIiKobhfBoq2wfxkrnhOXmzZt4++23cfjwYdjY2AAAMjMz8eqrr2LTpk2oV6+evmMkIiIy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QkREJANcJaQdExYiIiIZ4Lc1a8c5LERERCR7rLAQERHJAKewaMeEhYiISA6YsWjFISEiIiKSPVZYiIiIZICrhLRjwkJERCQDXCWkHYeEiIiISPZYYSEiIpIBzrnVjgkLERGRHDBj0YpDQkRERCR7rLAQERHJAFcJaceEhYiISAa4Skg7JixEREQywCks2nEOCxEREckeKyxERERywBKLVkxYiIiIZICTbrXjkBARERHJHissREREMsBVQtoxYSEiIpIBTmHRjkNCREREJHussBAREckBSyxaMWEhIiKSAa4S0o5DQkRERCR7rLAQERHJAFcJaceEhYiISAY4hUU7JixERERywIxFK85hISIiItljhYWIiEgGuEpIOyYsREREcqCHSbdGnK9wSIiIiIjkjxUWIiIiGeCcW+2YsBAREckBMxatOCREREREsscKCxERkQxwlZB2TFiIiIhkgI/m145DQkRERNXUwYMH0bt3bzg5OUEQBGzfvl3juCiKmD59OurWrQszMzP4+fnh0qVLGm0yMjIwcOBAqNVq2NjYYNiwYcjJydFoc+bMGXTq1AmmpqZwdnbG/PnzdY6VCQsREZEMCHradPHgwQO0bNkSy5YtK/f4/PnzsWTJEqxcuRJHjx6FhYUFAgICkJeXJ7UZOHAgzp07h5iYGERFReHgwYN47733pOPZ2dnw9/eHi4sLTp48iQULFiAiIgJfffWVTrFySIiIiEgODLBKqEePHujRo0e5x0RRxOeff46pU6eiT58+AIB169bBwcEB27dvR3BwMC5cuIBdu3bh+PHjaNu2LQBg6dKl6NmzJz799FM4OTlhw4YNKCgowOrVq6FUKtGsWTPEx8dj4cKFGonNs7DCQkREJAOCnv4DHlU1Ht/y8/N1jicpKQlpaWnw8/OT9llbW6N9+/aIi4sDAMTFxcHGxkZKVgDAz88PCoUCR48eldp07twZSqVSahMQEIDExETcu3evwvEwYSEiIjIyzs7OsLa2lrZ58+bp3EdaWhoAwMHBQWO/g4ODdCwtLQ329vYax2vUqAE7OzuNNuX18fg1KoJDQkRERDIgQA+rhP73vzdu3IBarZb2q1SqynUsA6ywEBERyYA+J92q1WqN7XkSFkdHRwBAenq6xv709HTpmKOjI27fvq1xvKioCBkZGRptyuvj8WtUBBMWIiIiKsPV1RWO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",
|
| 668 |
+
"text/plain": [
|
| 669 |
+
"<Figure size 640x480 with 2 Axes>"
|
| 670 |
+
]
|
| 671 |
+
},
|
| 672 |
+
"metadata": {},
|
| 673 |
+
"output_type": "display_data"
|
| 674 |
+
}
|
| 675 |
+
],
|
| 676 |
+
"source": [
|
| 677 |
+
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
| 678 |
+
"import matplotlib.pyplot as plt\n",
|
| 679 |
+
"\n",
|
| 680 |
+
"# 假设 predictions.label_ids 是真实的标签,preds 是模型的预测\n",
|
| 681 |
+
"cm = confusion_matrix(labels, preds)\n",
|
| 682 |
+
"\n",
|
| 683 |
+
"# 可视化混淆矩阵\n",
|
| 684 |
+
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Class 0', 'Class 1'])\n",
|
| 685 |
+
"disp.plot(cmap=plt.cm.Blues)\n",
|
| 686 |
+
"plt.title('Confusion Matrix')\n",
|
| 687 |
+
"plt.show()"
|
| 688 |
+
]
|
| 689 |
+
},
|
| 690 |
+
{
|
| 691 |
+
"cell_type": "code",
|
| 692 |
+
"execution_count": 10,
|
| 693 |
+
"id": "b6fc8ee6-89d3-4d32-b67d-2980a0be79cb",
|
| 694 |
+
"metadata": {},
|
| 695 |
+
"outputs": [
|
| 696 |
+
{
|
| 697 |
+
"name": "stdout",
|
| 698 |
+
"output_type": "stream",
|
| 699 |
+
"text": [
|
| 700 |
+
"{\"seed\": 2621, \"dna_protein_pair_full\": {\"accuracy\": 0.41, \"f1\": 0.4326923076923077}, \"dna_protein_pair_rand_full\": {\"accuracy\": 0.73725, \"f1\": 0.757050392972723}}\n"
|
| 701 |
+
]
|
| 702 |
+
}
|
| 703 |
+
],
|
| 704 |
+
"source": [
|
| 705 |
+
"print(json.dumps(result))"
|
| 706 |
+
]
|
| 707 |
+
},
|
| 708 |
+
{
|
| 709 |
+
"cell_type": "code",
|
| 710 |
+
"execution_count": 11,
|
| 711 |
+
"id": "f7db7f38-a3f1-45e8-bf92-af50b7b67ece",
|
| 712 |
+
"metadata": {},
|
| 713 |
+
"outputs": [],
|
| 714 |
+
"source": [
|
| 715 |
+
"model.save_pretrained(\"gpt2_gene_multi_v2_ft\")"
|
| 716 |
+
]
|
| 717 |
+
},
|
| 718 |
+
{
|
| 719 |
+
"cell_type": "code",
|
| 720 |
+
"execution_count": 12,
|
| 721 |
+
"id": "c34d5df5-7baf-4a05-ba25-7d3b99856d8f",
|
| 722 |
+
"metadata": {},
|
| 723 |
+
"outputs": [
|
| 724 |
+
{
|
| 725 |
+
"data": {
|
| 726 |
+
"text/plain": [
|
| 727 |
+
"('gpt2_gene_multi_v2_ft/tokenizer_config.json',\n",
|
| 728 |
+
" 'gpt2_gene_multi_v2_ft/special_tokens_map.json',\n",
|
| 729 |
+
" 'gpt2_gene_multi_v2_ft/tokenizer.json')"
|
| 730 |
+
]
|
| 731 |
+
},
|
| 732 |
+
"execution_count": 12,
|
| 733 |
+
"metadata": {},
|
| 734 |
+
"output_type": "execute_result"
|
| 735 |
+
}
|
| 736 |
+
],
|
| 737 |
+
"source": [
|
| 738 |
+
"tokenizer.save_pretrained(\"gpt2_gene_multi_v2_ft\")"
|
| 739 |
+
]
|
| 740 |
+
},
|
| 741 |
+
{
|
| 742 |
+
"cell_type": "code",
|
| 743 |
+
"execution_count": null,
|
| 744 |
+
"id": "15feb59b-73c1-462d-b9ed-ceb607a38f6f",
|
| 745 |
+
"metadata": {},
|
| 746 |
+
"outputs": [],
|
| 747 |
+
"source": []
|
| 748 |
+
}
|
| 749 |
+
],
|
| 750 |
+
"metadata": {
|
| 751 |
+
"kernelspec": {
|
| 752 |
+
"display_name": "Python 3 (ipykernel)",
|
| 753 |
+
"language": "python",
|
| 754 |
+
"name": "python3"
|
| 755 |
+
},
|
| 756 |
+
"language_info": {
|
| 757 |
+
"codemirror_mode": {
|
| 758 |
+
"name": "ipython",
|
| 759 |
+
"version": 3
|
| 760 |
+
},
|
| 761 |
+
"file_extension": ".py",
|
| 762 |
+
"mimetype": "text/x-python",
|
| 763 |
+
"name": "python",
|
| 764 |
+
"nbconvert_exporter": "python",
|
| 765 |
+
"pygments_lexer": "ipython3",
|
| 766 |
+
"version": "3.12.3"
|
| 767 |
+
}
|
| 768 |
+
},
|
| 769 |
+
"nbformat": 4,
|
| 770 |
+
"nbformat_minor": 5
|
| 771 |
+
}
|
best_model/vect_sim_gpt2_gene_en_ft_dna_protein_pair_test_others.ipynb
ADDED
|
@@ -0,0 +1,468 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "c0314d29-7fc8-4c11-8bfc-5440a442629a",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"data": {
|
| 11 |
+
"text/plain": [
|
| 12 |
+
"\"\\nimport os\\n\\n# 设置环境变量\\nos.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\\n\\n# 打印环境变量以确认设置成功\\nprint(os.environ.get('HF_ENDPOINT')\\n\""
|
| 13 |
+
]
|
| 14 |
+
},
|
| 15 |
+
"execution_count": 1,
|
| 16 |
+
"metadata": {},
|
| 17 |
+
"output_type": "execute_result"
|
| 18 |
+
}
|
| 19 |
+
],
|
| 20 |
+
"source": [
|
| 21 |
+
"import subprocess\n",
|
| 22 |
+
"import os\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 25 |
+
"output = result.stdout\n",
|
| 26 |
+
"for line in output.splitlines():\n",
|
| 27 |
+
" if '=' in line:\n",
|
| 28 |
+
" var, value = line.split('=', 1)\n",
|
| 29 |
+
" os.environ[var] = value\n",
|
| 30 |
+
"\n",
|
| 31 |
+
"'''\n",
|
| 32 |
+
"import os\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"# 设置环境变量\n",
|
| 35 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 36 |
+
"\n",
|
| 37 |
+
"# 打印环境变量以确认设置成功\n",
|
| 38 |
+
"print(os.environ.get('HF_ENDPOINT')\n",
|
| 39 |
+
"'''"
|
| 40 |
+
]
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"cell_type": "code",
|
| 44 |
+
"execution_count": 2,
|
| 45 |
+
"id": "1a09a2f5-dda6-4d86-badd-60bf2fda3983",
|
| 46 |
+
"metadata": {},
|
| 47 |
+
"outputs": [
|
| 48 |
+
{
|
| 49 |
+
"name": "stderr",
|
| 50 |
+
"output_type": "stream",
|
| 51 |
+
"text": [
|
| 52 |
+
"2025-02-10 00:53:51.873159: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 53 |
+
"2025-02-10 00:53:51.888142: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 54 |
+
"2025-02-10 00:53:51.903163: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 55 |
+
"2025-02-10 00:53:51.907736: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 56 |
+
"2025-02-10 00:53:51.920017: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 57 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 58 |
+
"2025-02-10 00:53:52.889296: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 59 |
+
]
|
| 60 |
+
}
|
| 61 |
+
],
|
| 62 |
+
"source": [
|
| 63 |
+
"from transformers import GPT2Tokenizer, GPT2Model,AutoModel\n",
|
| 64 |
+
"import torch\n",
|
| 65 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 66 |
+
"from datasets import load_dataset\n",
|
| 67 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 68 |
+
"from transformers import Trainer\n",
|
| 69 |
+
"import evaluate\n",
|
| 70 |
+
"import numpy as np\n",
|
| 71 |
+
"from transformers import TrainingArguments\n",
|
| 72 |
+
"from transformers import AutoModelForSequenceClassification"
|
| 73 |
+
]
|
| 74 |
+
},
|
| 75 |
+
{
|
| 76 |
+
"cell_type": "code",
|
| 77 |
+
"execution_count": 3,
|
| 78 |
+
"id": "7c5ab8f5-b8a9-4930-ac30-49d0bf26d579",
|
| 79 |
+
"metadata": {},
|
| 80 |
+
"outputs": [],
|
| 81 |
+
"source": [
|
| 82 |
+
"model_name=\"gpt2_dna_ft_5\"\n",
|
| 83 |
+
"device=\"cuda\"\n",
|
| 84 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"dnagpt/gene_eng_gpt2_v1\")\n",
|
| 85 |
+
"model = AutoModel.from_pretrained(model_name)\n",
|
| 86 |
+
"model.to(device)\n",
|
| 87 |
+
"\n",
|
| 88 |
+
"def get_text_embedding(text):\n",
|
| 89 |
+
" \"\"\"\n",
|
| 90 |
+
" 使用 GPT-2 模型获取文本的向量表示。\n",
|
| 91 |
+
" \n",
|
| 92 |
+
" 参数:\n",
|
| 93 |
+
" text (str): 输入文本。\n",
|
| 94 |
+
" model_name (str): 预训练 GPT-2 模型名称,默认为 \"gpt2\"。\n",
|
| 95 |
+
" device (str): 设备名称(\"cpu\" 或 \"cuda\")。\n",
|
| 96 |
+
" \n",
|
| 97 |
+
" 返回:\n",
|
| 98 |
+
" torch.Tensor: 文本的向量表示,维度为 [hidden_size]。\n",
|
| 99 |
+
" \"\"\"\n",
|
| 100 |
+
"\n",
|
| 101 |
+
" # 将文本编码为输入 ID 并添加批量维度\n",
|
| 102 |
+
" inputs = tokenizer(text, return_tensors=\"pt\", truncation=True, max_length=256)\n",
|
| 103 |
+
" input_ids = inputs[\"input_ids\"].to(device)\n",
|
| 104 |
+
" attention_mask = inputs[\"attention_mask\"].to(device)\n",
|
| 105 |
+
" \n",
|
| 106 |
+
" # 获取模型的隐藏层输出\n",
|
| 107 |
+
" with torch.no_grad():\n",
|
| 108 |
+
" outputs = model(input_ids, attention_mask=attention_mask)\n",
|
| 109 |
+
" hidden_states = outputs.last_hidden_state # [batch_size, seq_length, hidden_size]\n",
|
| 110 |
+
" \n",
|
| 111 |
+
" # 平均池化:获取序列中所有词向量的平均值\n",
|
| 112 |
+
" embeddings = hidden_states.mean(dim=1).squeeze() # [hidden_size]\n",
|
| 113 |
+
" \n",
|
| 114 |
+
" return embeddings"
|
| 115 |
+
]
|
| 116 |
+
},
|
| 117 |
+
{
|
| 118 |
+
"cell_type": "code",
|
| 119 |
+
"execution_count": 4,
|
| 120 |
+
"id": "5aa4d742-2104-4f24-861b-3e3c0d08e262",
|
| 121 |
+
"metadata": {},
|
| 122 |
+
"outputs": [
|
| 123 |
+
{
|
| 124 |
+
"name": "stderr",
|
| 125 |
+
"output_type": "stream",
|
| 126 |
+
"text": [
|
| 127 |
+
"Using the latest cached version of the dataset since dnagpt/gene_lan_transfer couldn't be found on the Hugging Face Hub\n",
|
| 128 |
+
"Found the latest cached dataset configuration 'dna_protein_pair' at /root/.cache/huggingface/datasets/dnagpt___gene_lan_transfer/dna_protein_pair/0.0.0/fc103580e7cda0d9bc41947f4058887fdc81188c (last modified on Mon Feb 10 00:14:56 2025).\n"
|
| 129 |
+
]
|
| 130 |
+
},
|
| 131 |
+
{
|
| 132 |
+
"data": {
|
| 133 |
+
"text/plain": [
|
| 134 |
+
"DatasetDict({\n",
|
| 135 |
+
" train: Dataset({\n",
|
| 136 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 137 |
+
" num_rows: 3600\n",
|
| 138 |
+
" })\n",
|
| 139 |
+
" test: Dataset({\n",
|
| 140 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 141 |
+
" num_rows: 400\n",
|
| 142 |
+
" })\n",
|
| 143 |
+
"})"
|
| 144 |
+
]
|
| 145 |
+
},
|
| 146 |
+
"execution_count": 4,
|
| 147 |
+
"metadata": {},
|
| 148 |
+
"output_type": "execute_result"
|
| 149 |
+
}
|
| 150 |
+
],
|
| 151 |
+
"source": [
|
| 152 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 153 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle\n",
|
| 154 |
+
"raw_datasets_dna_protein"
|
| 155 |
+
]
|
| 156 |
+
},
|
| 157 |
+
{
|
| 158 |
+
"cell_type": "code",
|
| 159 |
+
"execution_count": 5,
|
| 160 |
+
"id": "76ff7fed-fc17-421e-8a57-2a5de33d4ba6",
|
| 161 |
+
"metadata": {},
|
| 162 |
+
"outputs": [
|
| 163 |
+
{
|
| 164 |
+
"data": {
|
| 165 |
+
"text/plain": [
|
| 166 |
+
"77.26516"
|
| 167 |
+
]
|
| 168 |
+
},
|
| 169 |
+
"execution_count": 5,
|
| 170 |
+
"metadata": {},
|
| 171 |
+
"output_type": "execute_result"
|
| 172 |
+
}
|
| 173 |
+
],
|
| 174 |
+
"source": [
|
| 175 |
+
"from sklearn.metrics.pairwise import cosine_similarity\n",
|
| 176 |
+
"\n",
|
| 177 |
+
"def get_sim_score(s1, s2):\n",
|
| 178 |
+
" v1 = get_text_embedding(s1)\n",
|
| 179 |
+
" v2 = get_text_embedding(s2)\n",
|
| 180 |
+
" \n",
|
| 181 |
+
" # 假设dna_embedding和protein_embedding为numpy数组\n",
|
| 182 |
+
" #similarity = cosine_similarity([v1.cpu().numpy()], [v2.cpu().numpy()])[0][0]\n",
|
| 183 |
+
" A = v1.cpu().numpy()\n",
|
| 184 |
+
" B = v2.cpu().numpy()\n",
|
| 185 |
+
" #similarity = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))\n",
|
| 186 |
+
" similarity = np.linalg.norm(A - B)\n",
|
| 187 |
+
" return similarity\n",
|
| 188 |
+
"\n",
|
| 189 |
+
"s1 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 190 |
+
"s2 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 191 |
+
"s1 = \"ATGTCTCTACAGATGATAACGGTCAGTAATAACGTAACTTTAATTCAACCAGGCTTCTCACTGATGAATTTTGATGGACAAGTTTTCTTCTTTGGTCAAAAAGGCTGGCCCAAGAGATCCTGCCCCACAGGAGTTTTCCATTTTGATGTAAAGCATAACCATCTCAAACTGAAGCCTACAGTTTTCTCAAAGGATTCCTGCTACCTTCCTCCTCTTCGCTATCCAGCCACTTGCATATTTAAAGGCAACTTCGAGTCTGAAAAGCATCAGTATATCATCCATGGAGGGAAAACACCAAACAATGAACTTTCAGATAAGATGTATGTCATGTCTATTGTTTGCAAAAACAACAAAAAATTTACTTTTCGCTGCACGGAGAAAGACTTGGTAGGTGATGTTCCTGAAGGCAGATATGGCCATTCCATTGATGTAGTGTATAGTCGAGGGAAAAGTATGGGCGTTCTCTTTGGAGGACGATCTTACATGCCTTCTGCCCAAAGAACCACAGAAAAATGGAACAGTGTAGTTGACTGCTTGCCCCATCTCTTCTTGGTGGATTTTGAATTTGGGTGTTCTACATCCTACATTCTTCCCGAACTTCAGGATGGGATATCTTTTCATGTCTCCATTGCCAGAAATGATACCATTTATATTTTAGGAGGTCATTCACTCACCAATAACATCCGCCCTGCCAATCTGTTCAGAGTAAGGGTTGATCTCCCCCTGGGTAGCCCAGCTGTGAGTTGCACGGTCTTATCAGGAGGAATCTCTGTCTCCAGTGCAATCTTGACTCAAACTAATAATGATGAATTTGTCATTGTTGGTGGCTATCAGCTTGAAAATCAAAAAAGAATGGTCTGCAACATTGTCACTTTAGATGACAACAAGATAGATATTCGTGAGATGGAGGCACCAGATTGGACCCCAGATATTAAGCACAGCAAGGTATGGTTTGGAAACAACATGGGAAATGGGAGTGTTTTCCTTGGAATACCAGGAGACAATAAGCAGGCTGTTTCAGAAGCATTCTATTTCTATATGTTGAAATGTGCTGAAGATGATATAAATGAAGATGAGAAAACATTGATGAACAGTCAGACATCAACAGAAGATCCAGGAGACTCCACACCCTTTGAAGACTCGGAAGAATTTTGCTTCAGTGCAGAAGCAAATAGTTTTGGTGGGGATGATGAATTTGACACCTATAATGAAGATGATGAGGAAGATGAGTCTGAGACAGGCTACTGGATTACGTGTTGCCTTACTTGTAATGTGGATATCAACACTTGGGTACCATTCTACTCAACTGAGCTCAACAAACCTGCTATGATCTACTGCTCTCATGAGGACGGGCACTGGGTCCATGCTCAGTGCATGGATCTGGCAGAGCGCACGCTCATCCATCTGTCAGAAGGAAGCAACAAGTATTATTGCAATGAGCATGTGGAGATAGCAAGAGCACTACAAACCCCCAAAAGAGCCATGCCCTTGAAAAAGCCCCCACTGAAATCCCTCCGCAAAAAAGGCCCTGCAAAAATCTTGACTCCTGCCAAGAAATCCTTCCTTAGAAGATTGTTTGAT\"\n",
|
| 192 |
+
"s2 = \"MSLQMITVSNNVTLIQPGFSLMNFDGQVFFFGQKGWPKRSCPTGVFHFDVKHNHLKLKPTVFSKDSCYLPPLRYPATCIFKGNFESEKHQYIIHGGKTPNNELSDKMYVMSIVCKNNKKFTFRCTEKDLVGDVPEGRYGHSIDVVYSRGKSMGVLFGGRSYMPSAQRTTEKWNSVVDCLPHLFLVDFEFGCSTSYILPELQDGISFHVSIARNDTIYILGGHSLTNNIRPANLFRVRVDLPLGSPAVSCTVLSGGISVSSAILTQTNNDEFVIVGGYQLENQKRMVCNIVTLDDNKIDIREMEAPDWTPDIKHSKVWFGNNMGNGSVFLGIPGDNKQAVSEAFYFYMLKCAEDDINEDEKTLMNSQTSTEDPGDSTPFEDSEEFCFSAEANSFGGDDEFDTYNEDDEEDESETGYWITCCLTCNVDINTWVPFYSTELNKPAMIYCSHEDGHWVHAQCMDLAERTLIHLSEGSNKYYCNEHVEIARALQTPKRAMPLKKPPLKSLRKKGPAKILTPAKKSFLRRLFD\"\n",
|
| 193 |
+
"get_sim_score(s1, s2)"
|
| 194 |
+
]
|
| 195 |
+
},
|
| 196 |
+
{
|
| 197 |
+
"cell_type": "code",
|
| 198 |
+
"execution_count": 6,
|
| 199 |
+
"id": "8c14a02c-4493-45b1-9e87-e9a87e16638f",
|
| 200 |
+
"metadata": {},
|
| 201 |
+
"outputs": [],
|
| 202 |
+
"source": [
|
| 203 |
+
"sim_score = []\n",
|
| 204 |
+
"dif_score = []\n",
|
| 205 |
+
"\n",
|
| 206 |
+
"for item in raw_datasets_dna_protein[\"train\"]:\n",
|
| 207 |
+
" #print(item)\n",
|
| 208 |
+
" sentence1 = item[\"sentence1\"]\n",
|
| 209 |
+
" sentence2 = item[\"sentence2\"]\n",
|
| 210 |
+
" label = item[\"label\"]\n",
|
| 211 |
+
" score = get_sim_score(sentence1, sentence2)\n",
|
| 212 |
+
"\n",
|
| 213 |
+
" if 1 == label:\n",
|
| 214 |
+
" sim_score.append(score)\n",
|
| 215 |
+
" else:\n",
|
| 216 |
+
" dif_score.append(score)"
|
| 217 |
+
]
|
| 218 |
+
},
|
| 219 |
+
{
|
| 220 |
+
"cell_type": "code",
|
| 221 |
+
"execution_count": 7,
|
| 222 |
+
"id": "049f400e-ff0b-40df-9c15-a803ff0db1fd",
|
| 223 |
+
"metadata": {},
|
| 224 |
+
"outputs": [
|
| 225 |
+
{
|
| 226 |
+
"name": "stdout",
|
| 227 |
+
"output_type": "stream",
|
| 228 |
+
"text": [
|
| 229 |
+
"67.42139 64.66472\n"
|
| 230 |
+
]
|
| 231 |
+
}
|
| 232 |
+
],
|
| 233 |
+
"source": [
|
| 234 |
+
"import numpy as np\n",
|
| 235 |
+
"print(np.mean(sim_score), np.mean(dif_score))"
|
| 236 |
+
]
|
| 237 |
+
},
|
| 238 |
+
{
|
| 239 |
+
"cell_type": "code",
|
| 240 |
+
"execution_count": 8,
|
| 241 |
+
"id": "ad2fd985-e398-4077-b1b9-4d54300967b2",
|
| 242 |
+
"metadata": {},
|
| 243 |
+
"outputs": [
|
| 244 |
+
{
|
| 245 |
+
"name": "stdout",
|
| 246 |
+
"output_type": "stream",
|
| 247 |
+
"text": [
|
| 248 |
+
"1806 1794\n"
|
| 249 |
+
]
|
| 250 |
+
}
|
| 251 |
+
],
|
| 252 |
+
"source": [
|
| 253 |
+
"print(len(sim_score),len(dif_score))"
|
| 254 |
+
]
|
| 255 |
+
},
|
| 256 |
+
{
|
| 257 |
+
"cell_type": "code",
|
| 258 |
+
"execution_count": 9,
|
| 259 |
+
"id": "53bd3216-8a65-4358-9493-5affbde4fabb",
|
| 260 |
+
"metadata": {},
|
| 261 |
+
"outputs": [
|
| 262 |
+
{
|
| 263 |
+
"data": {
|
| 264 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABYFUlEQVR4nO3deXwT1d4G8Cdt0jShG+lCWwUKiIAKRVAQWWRTFkEUrgqCUkAQBWUR5VZvFaiXsggii6Dv1RYRN7xc9HVBWQURkUWoLAJlq0gbaKFp02mWJuf9g7e5hG5J2jTp8Hw/n3xsZuZMfpM09mHmnDkKIYQAERERkUwF+LoAIiIiIm9i2CEiIiJZY9ghIiIiWWPYISIiIllj2CEiIiJZY9ghIiIiWWPYISIiIllj2CEiIiJZY9ghIiIiWWPYIaplCQkJSEpK8nUZsrdw4UI0b94cgYGBaN++va/LISI/xrBDVIWMjAwoFArs27evwvU9e/bEHXfcUePX+fbbbzFr1qwa7+dG8cMPP+Dll19G165dkZ6ejrlz55bbZvv27VAoFC496tLZs2edXlulUiEqKgr33nsvXnnlFWRnZ3u87wsXLmDWrFk4ePBg7RX8/86ePYsxY8agRYsWCA4ORmxsLHr06IHXX3/do/3xd57qktLXBRDJzfHjxxEQ4N6/I7799lusWLGC//N30datWxEQEID3338fQUFBFW7Tpk0brFmzxmlZcnIyQkJC8Oqrr9ZFmVUaMWIEBg4cCLvdjitXrmDv3r1YsmQJ3n77bbz//vsYPny42/u8cOECZs+ejYSEhFo925WVlYW7774bGo0GY8eORUJCAnJycnDgwAHMnz8fs2fPdnuf/J2nusSwQ1TL1Gq1r0twW3FxMRo0aODrMlx28eJFaDSaSoMOADRq1AijRo1yWjZv3jxERUWVW+4LHTp0KFfHuXPn8MADD2D06NFo06YNEhMTfVSds7feegtGoxEHDx5E06ZNndZdvHjRR1URuY6XsYhq2fV9dqxWK2bPno2WLVsiODgYkZGR6NatGzZt2gQASEpKwooVKwCgwksrxcXFePHFF9G4cWOo1Wq0atUKb775JoQQTq9bUlKCF154AVFRUQgNDcVDDz2Ev/76CwqFwulfz7NmzYJCocDRo0fxxBNPoGHDhujWrRsAIDMzE0lJSWjevLnjUsXYsWORn5/v9Fpl+zhx4gRGjRqF8PBwREdHIyUlBUII/PnnnxgyZAjCwsIQGxuLRYsWufTelZaWIjU1FS1atIBarUZCQgJeeeUVmM1mxzYKhQLp6ekoLi52vFcZGRku7f9aQghERUVh+vTpjmV2ux0REREIDAxEQUGBY/n8+fOhVCphNBody7Zu3Yru3bujQYMGiIiIwJAhQ3Ds2DG367hW06ZNkZGRAYvFggULFjiWX758GTNmzEDbtm0REhKCsLAwDBgwAIcOHXJss337dtx9990AgDFjxpR7b3bu3IlHH30UTZo0gVqtRuPGjTFt2jSUlJRUW9epU6dw8803lws6ABATE1Nu2Xfffed4b0JDQ/Hggw/iyJEjjvXV/c5/+umn6NixI0JDQxEWFoa2bdvi7bffrrZOosrwzA6RCwwGA/Ly8sott1qt1badNWsW0tLS8PTTT6NTp04oLCzEvn37cODAAdx///145plncOHCBWzatKncZRchBB566CFs27YN48aNQ/v27fH999/jpZdewl9//YW33nrLsW1SUhI+//xzPPnkk7jnnnvw448/4sEHH6y0rkcffRQtW7bE3LlzHcFp06ZNOH36NMaMGYPY2FgcOXIE7733Ho4cOYJffvmlXP+Wxx9/HG3atMG8efPwzTff4I033oBOp8O7776L3r17Y/78+Vi7di1mzJiBu+++Gz169KjyvXr66aexevVq/O1vf8OLL76IPXv2IC0tDceOHcN//vMfAMCaNWvw3nvv4ddff8W//vUvAMC9995b7edwPYVCga5du2LHjh2OZZmZmTAYDAgICMCuXbsc79/OnTtx5513IiQkBACwefNmDBgwAM2bN8esWbNQUlKCZcuWoWvXrjhw4AASEhLcrqdMly5d0KJFC0cYBoDTp09jw4YNePTRR9GsWTPo9Xq8++67uO+++3D06FHEx8ejTZs2mDNnDl577TVMmDAB3bt3d3pv1q1bB0mS8OyzzyIyMhK//vorli1bhvPnz2PdunVV1tS0aVNs3rwZW7duRe/evavcds2aNRg9ejT69euH+fPnQ5IkrFy5Et26dcNvv/2GhISEKn/nN23ahBEjRqBPnz6YP38+AODYsWPYtWsXpkyZ4vb7SQQAEERUqfT0dAGgysftt9/u1KZp06Zi9OjRjueJiYniwQcfrPJ1Jk2aJCr6Om7YsEEA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586tcPtLly5VW+v135eAgABH37hrvzNE7uCZHSIvu+2229CzZ0907NgROp0O+/btwxdffIHJkyc7tunYsSMA4IUXXkC/fv0QGBiI4cOHY/DgwejVqxdeffVVnD17FomJifjhhx/w5ZdfYurUqY5/SXfs2BHDhg3DkiVLkJ+f7xh6fuLECQCuXRoKCwtDjx49sGDBAlitVtx000344YcfcObMGS+8K+UlJiZi9OjReO+991BQUID77rsPv/76K1avXo2HH34YvXr18srrdunSBUqlEsePH8eECRMcy3v06IGVK1cCgFPYAa7OyzVgwAB06dIF48aNcww9Dw8Pd/mOwAcOHMBHH30Eu92OgoIC7N27F//+97+hUCiwZs0ap87vgwYNwpw5czBmzBjce++9+P3337F27Vo0b97caZ8tWrRAREQEVq1ahdDQUDRo0ACdO3dG69at0aJFC8yYMQN//fUXwsLC8O9//7vaflRl5s+fj/3792Po0KGOug4cOIAPP/wQOp0OU6dOBXD1d2jlypV48skn0aFDBwwfPhzR0dHIzs7GN998g65duzqCe2W/808//TQuX76M3r174+abb8a5c+ewbNkytG/f3umMH5FbfDcQjMj/lQ0937t3b4Xr77vvvmqHnr/xxhuiU6dOIiIiQmg0GtG6dWvxz3/+U1gsFsc2paWl4vnnnxfR0dFCoVA4DcktKioS06ZNE/Hx8UKlUomWLVuKhQsXCrvd7vS6xcXFYtKkSUKn04mQkBDx8MMPi+PHjwsATkPBy4aNX7p0qdzxnD9/XjzyyCMiIiJChIeHi0cffVRcuHCh0uHr1++jsiHhFb1PFbFarWL27NmiWbNmQqVSicaNG4vk5GRhMplcep3qXD/0vMzdd98tAIg9e/Y4lp0/f14AEI0bN65wX5s3bxZdu3YVGo1GhIWFicGDB4ujR49WW0PZ0POyh1KpFDqdTnTu3FkkJydXOAzcZDKJF198UcTFxQmNRiO6du0qdu/eLe67775yx/Pll1+K2267TSiVSqdh6EePHhV9+/YVISEhIioqSowfP14cOnSo0qHq19q1a5eYNGmSuOOOO0R4eLhQqVSiSZMmIikpSZw6darc9tu2bRP9+vUT4eHhIjg4WLRo0UIkJSWJffv2Obap7Hf+iy++EA888ICIiYkRQUFBokmTJuKZZ54ROTk5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sENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREsqb0dQFERCR/FosJer3e7XZ6vR4Wi8ULFdGNhGGHiIi8ymwuRGbm75g71w6tVutWW0kqwpEjp6HTmRAa6qUCSfYYdoiIyKus1hKYTCoEBz+CyMgEt9ra7UdhNi+D1VrqneLohsCwQ0REdUKjiUJoaJxbbYxG9y99EV2PHZSJiIhI1hh2iIiISNYYdoiIiEjWGHaIiIhI1hh2iIiISNYYdoiIiEjWGHaIiIhI1hh2iIiISNYYdoiIiEjWGHaIiIhI1nwadnbs2IHBgwcjPj4eCoUCGzZscFqflJQEhULh9Ojfv7/TNpcvX8bIkSMRFhaGiIgIjBs3DkajsQ6PgoiIiPyZT8NOcXExEhMTsWLFikq36d+/P3JychyPTz75xGn9yJEjceTIEWzatAlff/01duzYgQkTJni7dCIiIqonfDoR6IABAzBgwIAqt1Gr1YiNja1w3bFjx7Bx40bs3bsXd911FwBg2bJlGDhwIN58803Ex8fXes1ERERUv/h9n53t27cjJiYGrVq1wrPPPov8/HzHut27dyMiIsIRdACgb9++CAgIwJ49eyrdp9lsRmFhodODiIiI5Mmvw07//v3x4YcfYsuWLZg/fz5+/PFHDBgwADabDQCQm5uLmJgYpzZKpRI6nQ65ubmV7jctLQ3h4eGOR+PGjb16HEREROQ7Pr2MVZ3hw4c7fm7bti3atWuHFi1aYPv27ejTp4/H+01OTsb06dMdzwsLCxl4iIiIZMqvz+xcr3nz5oiKikJWVhYAIDY2FhcvXnTaprS0FJcvX660nw9wtR9QWFiY04OIiIjkqV6FnfPnzyM/Px9xcXEAgC5duqCgoAD79+93bLN161bY7XZ07tzZV2USERGRH/HpZSyj0eg4SwMAZ86cwcGDB6HT6aDT6TB79mwMGzYMsbGxOHXqFF5++WXccsst6NevHwCgTZs26N+/P8aPH49Vq1bBarVi8uTJGD58OEdiEREREQAfn9nZt28f7rzzTtx5550AgOnTp+POO+/Ea6+9hsDAQGRmZuKhhx7CrbfeinHjxqFjx47YuXMn1Gq1Yx9r165F69at0adPHwwcOBDdunXDe++956tDIiIiIj/j0zM7PXv2hBCi0vXff/99tfvQ6XT4+OOPa7MsIiIikpF61WeHiIiIyF0MO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGt+PREoERFVzGAwQJIkj9pqtVqEh4fXckVE/othh4ionjEYDEhNXY68PKtH7aOiVEhJmczAQzcMhh0ionpGkiTk5Vmh0QyFVhvtZttLyMtbD0mSGHbohsGwQ0RUT2m10QgNjXO7XUmJF4oh8mPsoExERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxvvsEBHdYCwWE/R6vVtt9Ho9LBaLlyoi8i6GHSKiG4jZXIjMzN8xd64dWq3W5XaSVIQjR05DpzMhNNSLBRJ5AcMOEdENxGotgcmkQnDwI4iMTHC5nd1+FGbzMlitpd4rjshLGHaIiG5AGk2UW1NNGI3uXfYi8ifsoExERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESy5tOws2PHDgwePBjx8fFQKBTYsGGDY53VasXMmTPRtm1bNGjQAPHx8Xjqqadw4cIFp30kJCRAoVA4PebNm1fHR0JERET+yqdhp7i4GImJiVixYkW5dZIk4cCBA0hJScGBAwewfv16HD9+HA899FC5befMmYOcnBzH4/nnn6+L8omIiKgeUPryxQcMGIABAwZUuC48PBybNm1yWrZ8+XJ06tQJ2dnZaNKkiWN5aGgoYmNjvVorERER1U/1qs+OwWCAQqFARESE0/J58+YhMjISd955JxYuXIjS0lLfFEhERER+x6dndtxhMpkwc+ZMjBgxAmFhYY7lL7zwAjp06ACdToeff/4ZycnJyMnJweLFiyvdl9lshtlsdjwvLCz0au1ERETkO/Ui7FitVjz22GMQQmDlypVO66ZPn+74uV27dggKCsIzzzyDtLQ0qNXqCveXlpaG2bNne7VmIiIi8g9+fxmrLOicO3cOmzZtcjqrU5HOnTujtLQUZ8+erXSb5ORkGAwGx+PPP/+s5aqJiIjIX/j1mZ2yoHPy5Els27YNkZGR1bY5ePAgAgICEBMTU+k2arW60rM+REREJC8+DTtGoxFZWVmO52fOnMHBgweh0+kQFxeHv/3tbzhw4AC+/vpr2Gw25ObmAgB0Oh2CgoKwe/du7NmzB7169UJoaCh2796NadOmYdSoUWjYsKGvDouIiIj8iE/Dzr59+9CrVy/H87L+N6NHj8asWbPw1VdfAQDat2/v1G7btm3o2bMn1Go1Pv30U8yaNQtmsxnNmjXDtGnTnPrxEBER0Y3Np2GnZ8+eEEJUur6qdQDQoUMH/PLLL7VdFhEREcmI33dQJiIiIqoJhh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjW/voMyEZGcGQwGSJLkdju9Xg+LxeKFiojkiWGHiMgHDAYDUlOXIy/P6nZbSSrCkSOnodOZEBrqheKIZIZhh4jIByRJQl6eFRrNUGi10W61tduPwmxeBqu11EvVEckLww4RkQ9ptdEIDY1zq43RqPdSNUTy5FEH5dOnT9d2HURERERe4VHYueWWW9CrVy989NFHMJlMtV0TERERUa3xKOwcOHAA7dq1w/Tp0xEbG4tnnnkGv/76a23XRkRERFRjHoWd9u3b4+2338aFCxfwwQcfICcnB926dcMdd9yBxYsX49KlS7VdJxER1ZDJZIAkXUJpqQmSdBFFRTkuPUwmg69LJ6qRGnVQViqVGDp0KB588EG88847SE5OxowZM/DKK6/gsccew/z58xEX517HOyIiqn0mkwG/70iFNe8EQvOPQr9nEYq0YS61tWqjENNqiJcrJPKeGoWdffv24YMPPsCnn36KBg0aYMaMGRg3bhzOnz+P2bNnY8iQIby8RUTkB6xWCSopD/0C1TAEBqFJcARCNA2rbVdglfC/Uh5KS9k/k+ovj8LO4sWLkZ6ejuPHj2PgwIH48MMPMXDgQAQEXL0q1qxZM2RkZCAhIaE2ayUiohoKVwUDAUroVA0QqnbxjoSlJd4tisjLPAo7K1euxNixY5GUlFTpZaqYmBi8//77NSqOiIiIqKY8CjsnT56sdpugoCCMHj3ak90TERER1RqPRmOlp6dj3bp15ZavW7cOq1evrnFRRERERLXFo7CTlpaGqKiocstjYmIwd+7cGhdFREREVFs8CjvZ2dlo1qxZueVNmzZFdnZ2jYsiIiIiqi0ehZ2YmBhkZmaWW37o0CFERkbWuCgiIiKi2uJR2BkxYgReeOEFbNu2DTabDTabDVu3bsWUKVMwfPjw2q6RiIiIyGMejcZKTU3F2bNn0adPHyiVV3dht9vx1FNPsc8OERER+RWPwk5QUBA+++wzpKam4tChQ9BoNGjbti2aNm1a2/UREdENyGQywGqVrpvLK8SltiqV1svVUX1To+kibr31Vtx66621VQsREclM+clHqw8sZnMhTv66HBpLESTpMufyohrzKOzYbDZkZGRgy5YtuHjxIux2u9P6rVu31kpxRERUf3k6+ajJKqH44hEMu7kz1MHhyOZcXlRDHoWdKVOmICMjAw8++CDuuOMOKBSK2q6LiK5jMBggSZLb7bRaLcLDw71QEVHVPJ189Kyw40ubGSEBKoQGBMHAubyohjwKO59++ik+//xzDBw4sLbrIaIKGAwGLE9NhTUvz+22qqgoTE5JYeAhn3F38tErFmMdVEU3Eo87KN9yyy21XQsRVUKSJFjz8jBUo0G01vXOl5ckCevz8iBJEsOOnyksLIQkFUGt1rvVjp1vidznUdh58cUX8fbbb2P58uW8hEVUh6K1WsSFungqv0wJT+n7G4PBgIwlS3D5wG4Uq/90K8Cw8y2R+zwKOz/99BO2bduG7777DrfffjtUKpXT+vXr19dKcUREciRJEmz5+RgUqERMcEOog1wbUs3Ot0Se8SjsRERE4JFHHqntWoiIbihhShUig0KgdrXjLcDOt0Qe8CjspKen13YdRERERF7h0dxYAFBaWorNmzfj3XffRVFREQDgwoULMBrZi56IiIj8h0dh59y5c2jbti2GDBmCSZMm4dKlSwCA+fPnY8aMGS7vZ8eOHRg8eDDi4+OhUCiwYcMGp/VCCLz22muIi4uDRqNB3759cfLkSadtLl++jJEjRyIsLAwREREYN24cAxcRyZbVZoEk5V9zR+Iclx5Gox42m8XX5dcJT98jk8ng69LJSzy+qeBdd92FQ4cOITIy0rH8kUcewfjx413eT3FxMRITEzF27FgMHTq03PoFCxZg6dKlWL16NZo1a4aUlBT069cPR48eRXBwMABg5MiRyMnJwaZNm2C1WjFmzBhMmDABH3/8sSeHRkTkt4pLzbioz0RocR5C8/9wawoFk1WC8eIR2GLu8HKVvlWT98iqjULbHilerpB8waOws3PnTvz8888ICgpyWp6QkIC//vrL5f0MGDAAAwYMqHCdEAJLlizBP/7x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jzh+/LiPqvVcVccpSZJ44IEHRHR0tFCpVKJp06Zi/PjxIjc314cVe+b7778XACr8jOTy/RSi8uOU0/ezsLBQTJkyRTRp0kQEBweL5s2bi1dffVWYzWbHNvXh+6kQ4prbIBIRERHJDPvsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BCRbPXs2RNTp071dRlE5GMMO0TklwYPHoz+/ftXuG7nzp1QKBTIzMys46qIqD5i2CEivzRu3Dhs2rQJ58+fL7cuPT0dd911F9q1a+eDyoiovmHYISK/NGjQIERHRyMjI8NpudFoxLp16/Dwww9jxIgRuOmmm6DVatG2bVt88sknVe5ToVBgw4YNTssiIiKcXuPPP//EY489hoiICOh0OgwZMgRnz56tnYMiIp9g2CEiv6RUKvHUU08hIyMD107ht27dOthsNowaNQodO3bEN998g8OHD2PChAl48skn8euvv3r8mlarFf369UNoaCh27tyJXbt2ISQkBP3794fFYqmNwyIiH2DYISK/NXbsWJw6dQo//vijY1l6ejqGDRuGpk2bYsaMGWjfvj2aN2+O559/Hv3798fnn3/u8et99tlnsNvt+Ne//oW2bduiTZs2SE9PR3Z2NrZv314LR0REvsCwQ0R+q3Xr1rj33nvxwQcfAACysrKwc+dOjBs3DjabDampqWjbti10Oh1CQkLw/fffIzs72+PXO3ToELKyshAaGoqQkBCEhIRAp9PBZDLh1KlTtXVYRFTHlL4ugIioKuPGjcPzzz+PFStWID09HS1atMB9992H+fPn4+2338aSJUvQtm1bNGjQAFOnTq3ycpNCoXC6JAZcvXRVxmg0omPHjli7dm25ttHR0bV3UERUpxh2iMivPfbYY5gyZQo+/vhjfPjhh3j22WehUCiwa9cuDBkyBKNGjQIA2O12nDhxArfddlul+4qOjkZOTo7j+cmTJyFJkuN5hw4d8NlnnyEmJgZhYWHeOygiqlO8jEVEfi0kJASPP/44kpOTkZOTg6SkJABAy5YtsWnTJvz88884duwYnnnmGej1+ir31bt3byxfvhy//fYb9u3bh4kTJ0KlUjnWjxw5ElFRURgyZAh27tyJM2fOYPv27XjhhRcqHAJPRPUDww4R+b1x48bhypUr6NevH+Lj4wEA//jHP9ChQwf069cPPXv2RGxsLB5++OEq97No0SI0btwY3bt3xxNPPIEZM2ZAq9U61mu1WuzYsQNNmjTB0KFD0aZNG4wbNw4mk4lneojqMYW4/gI2ERERkYzwzA4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREcna/wEl78oMVcWRIwAAAABJRU5ErkJggg==",
|
| 265 |
+
"text/plain": [
|
| 266 |
+
"<Figure size 640x480 with 1 Axes>"
|
| 267 |
+
]
|
| 268 |
+
},
|
| 269 |
+
"metadata": {},
|
| 270 |
+
"output_type": "display_data"
|
| 271 |
+
}
|
| 272 |
+
],
|
| 273 |
+
"source": [
|
| 274 |
+
"import matplotlib.pyplot as plt\n",
|
| 275 |
+
"import numpy as np\n",
|
| 276 |
+
"\n",
|
| 277 |
+
"# 示例数据\n",
|
| 278 |
+
"data1 = sim_score # 生成 1000 个符合正态分布的随机数\n",
|
| 279 |
+
"data2 = dif_score # 生成 1000 个偏移的随机数\n",
|
| 280 |
+
"\n",
|
| 281 |
+
"# 绘制直方图\n",
|
| 282 |
+
"plt.hist(data1, bins=30, alpha=0.5, label='Data 1', color='blue', edgecolor='black')\n",
|
| 283 |
+
"plt.hist(data2, bins=30, alpha=0.5, label='Data 2', color='red', edgecolor='black')\n",
|
| 284 |
+
"\n",
|
| 285 |
+
"# 添加图例\n",
|
| 286 |
+
"plt.legend()\n",
|
| 287 |
+
"\n",
|
| 288 |
+
"# 添加标题和标签\n",
|
| 289 |
+
"plt.title('Histogram of Two Data Sets')\n",
|
| 290 |
+
"plt.xlabel('Value')\n",
|
| 291 |
+
"plt.ylabel('Frequency')\n",
|
| 292 |
+
"\n",
|
| 293 |
+
"# 显示图形\n",
|
| 294 |
+
"plt.show()"
|
| 295 |
+
]
|
| 296 |
+
},
|
| 297 |
+
{
|
| 298 |
+
"cell_type": "code",
|
| 299 |
+
"execution_count": 10,
|
| 300 |
+
"id": "2116f787-781f-4bfc-b12d-c36efe26cfa9",
|
| 301 |
+
"metadata": {},
|
| 302 |
+
"outputs": [
|
| 303 |
+
{
|
| 304 |
+
"name": "stderr",
|
| 305 |
+
"output_type": "stream",
|
| 306 |
+
"text": [
|
| 307 |
+
"Using the latest cached version of the dataset since dnagpt/gene_lan_transfer couldn't be found on the Hugging Face Hub\n",
|
| 308 |
+
"Found the latest cached dataset configuration 'dna_protein_pair_rand' at /root/.cache/huggingface/datasets/dnagpt___gene_lan_transfer/dna_protein_pair_rand/0.0.0/fc103580e7cda0d9bc41947f4058887fdc81188c (last modified on Mon Feb 10 00:26:42 2025).\n"
|
| 309 |
+
]
|
| 310 |
+
},
|
| 311 |
+
{
|
| 312 |
+
"data": {
|
| 313 |
+
"text/plain": [
|
| 314 |
+
"DatasetDict({\n",
|
| 315 |
+
" train: Dataset({\n",
|
| 316 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 317 |
+
" num_rows: 8000\n",
|
| 318 |
+
" })\n",
|
| 319 |
+
" test: Dataset({\n",
|
| 320 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 321 |
+
" num_rows: 8000\n",
|
| 322 |
+
" })\n",
|
| 323 |
+
"})"
|
| 324 |
+
]
|
| 325 |
+
},
|
| 326 |
+
"execution_count": 10,
|
| 327 |
+
"metadata": {},
|
| 328 |
+
"output_type": "execute_result"
|
| 329 |
+
}
|
| 330 |
+
],
|
| 331 |
+
"source": [
|
| 332 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 333 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 334 |
+
"raw_datasets_dna_protein"
|
| 335 |
+
]
|
| 336 |
+
},
|
| 337 |
+
{
|
| 338 |
+
"cell_type": "code",
|
| 339 |
+
"execution_count": 11,
|
| 340 |
+
"id": "6e6b1d3d-3d05-40b0-a96a-537a4dc324d6",
|
| 341 |
+
"metadata": {},
|
| 342 |
+
"outputs": [],
|
| 343 |
+
"source": [
|
| 344 |
+
"sim_score = []\n",
|
| 345 |
+
"dif_score = []\n",
|
| 346 |
+
"\n",
|
| 347 |
+
"for item in raw_datasets_dna_protein[\"train\"]:\n",
|
| 348 |
+
" #print(item)\n",
|
| 349 |
+
" sentence1 = item[\"sentence1\"]\n",
|
| 350 |
+
" sentence2 = item[\"sentence2\"]\n",
|
| 351 |
+
" label = item[\"label\"]\n",
|
| 352 |
+
" score = get_sim_score(sentence1, sentence2)\n",
|
| 353 |
+
"\n",
|
| 354 |
+
" if 1 == label:\n",
|
| 355 |
+
" sim_score.append(score)\n",
|
| 356 |
+
" else:\n",
|
| 357 |
+
" dif_score.append(score)"
|
| 358 |
+
]
|
| 359 |
+
},
|
| 360 |
+
{
|
| 361 |
+
"cell_type": "code",
|
| 362 |
+
"execution_count": 12,
|
| 363 |
+
"id": "a515f319-254b-4675-9ca5-fb15da6a62e5",
|
| 364 |
+
"metadata": {},
|
| 365 |
+
"outputs": [
|
| 366 |
+
{
|
| 367 |
+
"name": "stdout",
|
| 368 |
+
"output_type": "stream",
|
| 369 |
+
"text": [
|
| 370 |
+
"68.03318 49.366604\n"
|
| 371 |
+
]
|
| 372 |
+
}
|
| 373 |
+
],
|
| 374 |
+
"source": [
|
| 375 |
+
"import numpy as np\n",
|
| 376 |
+
"print(np.mean(sim_score), np.mean(dif_score))"
|
| 377 |
+
]
|
| 378 |
+
},
|
| 379 |
+
{
|
| 380 |
+
"cell_type": "code",
|
| 381 |
+
"execution_count": 13,
|
| 382 |
+
"id": "4417c7b5-8019-4a53-968a-4dee311acef3",
|
| 383 |
+
"metadata": {},
|
| 384 |
+
"outputs": [
|
| 385 |
+
{
|
| 386 |
+
"name": "stdout",
|
| 387 |
+
"output_type": "stream",
|
| 388 |
+
"text": [
|
| 389 |
+
"4018 3982\n"
|
| 390 |
+
]
|
| 391 |
+
}
|
| 392 |
+
],
|
| 393 |
+
"source": [
|
| 394 |
+
"print(len(sim_score),len(dif_score))"
|
| 395 |
+
]
|
| 396 |
+
},
|
| 397 |
+
{
|
| 398 |
+
"cell_type": "code",
|
| 399 |
+
"execution_count": 14,
|
| 400 |
+
"id": "adc022c4-7bec-4381-b80b-6ac1b18be00c",
|
| 401 |
+
"metadata": {},
|
| 402 |
+
"outputs": [
|
| 403 |
+
{
|
| 404 |
+
"data": {
|
| 405 |
+
"image/png": "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z5Wi6iOKIgRBQE5ODgIDA+Hp6Wn3thh2iIiIKlDytO+SwEPOFRgYWOqJ61XFsENERFQBmUyGyMhIhIWFwWg0urqcB4pcLr+vHp0SDDtEREQ28PT0dMgvXnI+DlAmIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSeMAZSKSJJ3BALVabXN7PlWaSLoYdohIcvL0ehxPT4d5zhwolUqbPiMPCcH46dMZeIgkiGGHiCSnyGiEXKfDQF9fRAcHV9r+hiBgg0YDQRAYdogkiGGHiCQrRKFApL+/bY2Liqq3GCJyGQ5QJiIiIklj2CEiIiJJY9ghIiIiSeOYHSJyKa1WC0EQKm2nVqthMBicUBERSQ3DDhG5jFarxbLERBg1mkrb5gsCLmZkQBcUBNg66JiICAw7RORCgiDAqNFgkEKB0Eruh3PSbMZSvR7FRqOTqiMiqWDYISKXC1UqK50iri4ocFI1RCQ1HKBMREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLmNmFn7ty5kMlkmDhxomWZTqdDQkICgoOD4efnh8GDB0OtVlt9LjMzE3379oVSqURYWBimTp2K4uJiJ1dPRERE7sotws6hQ4fwxRdfoGXLllbLJ02ahJ9//hnr16/H7t27cf36dQwaNMiy3mQyoW/fvjAYDNi3bx9Wr16NlJQUfPTRR84+BCIiInJTLg87BQUFGD58OP7xj3+gdu3aluVarRarVq3CggUL0L17d7Rt2xbJycnYt28f/vjjDwDA1q1bcfLkSXzzzTdo3bo1+vTpg8TERCxfvhwGg8FVh0RERERuxOVhJyEhAX379kXPnj2tlqelpcFoNFotb9q0KaKiorB//34AwP79+9GiRQuEh4db2sTGxiIvLw8ZGRnOOQAiIiJya16u3Pm6detw5MgRHDp0qNS67OxseHt7IzAw0Gp5eHg4srOzLW3uDjol60vWlUev10Ov11ve5+Xl2XsIRERE5OZc1rNz9epVTJgwAWvXroWvr69T952UlASVSmV51atXz6n7JyIiIudxWdhJS0tDTk4O2rRpAy8vL3h5eWH37t1YsmQJvLy8EB4eDoPBgNzcXKvPqdVqREREAAAiIiJKzc4qeV/SpizTpk2DVqu1vK5everYgyMiIiK34bKw06NHDxw/fhxHjx61vNq1a4fhw4db/iyXy7F9+3bLZ86cOYPMzEzExMQAAGJiYnD8+HHk5ORY2qSmpiIgIADNmzcvd98+Pj4ICAiwehEREZE0uWzMjr+/Px577DGrZbVq1UJwcLBl+dixYzF58mQEBQUhICAAb775JmJiYtChQwcAQK9evdC8eXOMHDkS8+fPR3Z2Nj788EMkJCTAx8fH6cdERERE7selA5Qrs3DhQnh4eGDw4MHQ6/WIjY3F559/blnv6emJX375Ba+//jpiYmJQq1YtxMXFYfbs2S6smoiIiNyJW4WdXbt2Wb339fXF8uXLsXz58nI/U79+ffz222/VXBkRERHVVC6/zw4RERFRdWLYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJ83J1AURUM2i1WgiCYFNbpVIJlUpVzRUREdmGYYeIKqXVarEsMRFGjcam9vKQEIyfPp2Bh4jcAsMOEVVKEAQYNRoMUigQqlRW2PaGIGCDRgNBEBh2iMgtMOwQkc1ClUpE+vtX3rCoqPqLISKyEQcoExERkaQx7BAREZGkMewQERGRpHHMDhE5nM5ggFqtrrSdWq2GwWBwQkVE9CBj2CEih8rT63E8PR3mOXOgrGTmVr4g4GJGBnRBQYAtA5+JiOzAsENEDlVkNEKu02Ggry+ig4MrbHvSbMZSvR7FRqOTqiOiBxHDDhFVixCFotJp6uqCAidVQ0QPMg5QJiIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSbMr7Fy8eNHRdRARERFVC7vCzsMPP4xu3brhm2++gU6nc3RNRERERA5jV9g5cuQIWrZsicmTJyMiIgKvvfYaDh486OjaiIiIiO6bXWGndevWWLx4Ma5fv46vvvoKWVlZ6Ny5Mx577DEsWLAAN27ccHSdRERERHa5rwHKXl5eGDRoENavX4958+bh/PnzmDJlCurVq4dRo0YhKyvLUXUSUTXQarXIysqq9KVWq2EwGFxdLhGRXbzu58OHDx/GV199hXXr1qFWrVqYMmUKxo4di7/++guzZs1C//79eXmLyE1ptVosS0yEUaOptG2+IOBiRgZ0QUGAv78TqiMichy7ws6CBQuQnJyMM2fO4Nlnn8XXX3+NZ599Fh4edzqKGjRogJSUFERHRzuyViJyIEEQYNRoMEihQKhSWWHbk2Yzlur1KDYanVQdEZHj2BV2VqxYgTFjxiA+Ph6RkZFltgkLC8OqVavuqzgiqn6hSiUiK+mtURcUOKkaIiLHsyvsnDt3rtI23t7eiIuLs2fzRERERA5j1wDl5ORkrF+/vtTy9evXY/Xq1fddFBEREZGj2BV2kpKSEBISUmp5WFgY5syZc99FERERETmKXWEnMzMTDRo0KLW8fv36yMzMvO+iiIiIiBzFrrATFhaG9PT0UsuPHTuG4OBgm7ezYsUKtGzZEgEBAQgICEBMTAw2bdpkWa/T6ZCQkIDg4GD4+flh8ODBUKvVVtvIzMxE3759oVQqERYWhqlTp6K4uNiewyIiIiIJsivsDBs2DG+99RZ27twJk8kEk8mEHTt2YMKECRg6dKjN26lbty7mzp2LtLQ0HD58GN27d0f//v2RkZEBAJg0aRJ+/vlnrF+/Hrt378b169cxaNAgy+dNJhP69u0Lg8GAffv2YfXq1UhJScFHH31kz2ERERGRBNk1GysxMRGXL19Gjx494OV1ZxNmsxmjRo2q0pidfv36Wb3/5JNPsGLFCvzxxx+oW7cuVq1ahW+//Rbdu3cHcGdgdLNmzfDHH3+gQ4cO2Lp1K06ePIlt27YhPDwcrVu3RmJiIt59913MnDkT3t7e9hweERERSYhdPTve3t7497//jdOnT2Pt2rXYsGEDLly4gK+++srugGEymbBu3ToUFhYiJiYGaWlpMBqN6Nmzp6VN06ZNERUVhf379wMA9u/fjxYtWiA8PNzSJjY2Fnl5eZbeISIiInqw3dfjIh555BE88sgj91XA8ePHERMTA51OBz8/P/zwww9o3rw5jh49Cm9vbwQGBlq1Dw8PR3Z2NgAgOzvbKuiUrC9ZVx69Xg+9Xm95n5eXd1/HQERERO7LrrBjMpmQkpKC7du3IycnB2az2Wr9jh07bN5WkyZNcPToUWi1Wnz//feIi4vD7t277SnLZklJSZg1a1a17oOIiIjcg11hZ8KECUhJSUHfvn3x2GOPQSaT2V2At7c3Hn74YQBA27ZtcejQISxevBhDhgyBwWBAbm6uVe+OWq1GREQEACAiIqLUg0ZLZmuVtCnLtGnTMHnyZMv7vLw81KtXz+5jICIiIvdlV9hZt24dvvvuOzz77LOOrgdmsxl6vR5t27aFXC7H9u3bMXjwYADAmTNnkJmZiZiYGABATEwMPvnkE+Tk5CAsLAwAkJqaioCAADRv3rzcffj4+MDHx8fhtRMREZH7sSvs3N0bcz+mTZuGPn36ICoqCvn5+fj222+xa9cubNmyBSqVCmPHjsXkyZMRFBSEgIAAvPnmm4iJiUGHDh0AAL169ULz5s0xcuRIzJ8/H9nZ2fjwww+RkJDAMENEREQA7Aw7b7/9NhYvXoxly5bd1yWsnJwcjBo1CllZWVCpVGjZsiW2bNmCZ555BgCwcOFCeHh4YPDgwdDr9YiNjcXnn39u+bynpyd++eUXvP7664iJiUGtWrUQFxeH2bNn210TERERSYtdYee///0vdu7ciU2bNuHRRx+FXC63Wr9hwwabtrNq1aoK1/v6+mL58uVYvnx5uW3q16+P3377zab9ERER0YPHrrATGBiIgQMHOroWIiIiIoezK+wkJyc7ug4iIiKiamHXHZQBoLi4GNu2bcMXX3yB/Px8AMD169dRUFDgsOKIiIiI7pddPTtXrlxB7969kZmZCb1ej2eeeQb+/v6YN28e9Ho9Vq5c6eg6iYiIHEKr1UIQhErbKZVKqFQqJ1RE1c3umwq2a9cOx44dQ3BwsGX5wIED8corrzisOCIiIkfSarVITFwGjcZYaduQEDmmTx/v0MDDoOUadoWdPXv2YN++faUe+hkdHY1r1645pDAiIiJHEwQBGo0RCsUgKJWhFbS7AY1mAwRBcFjocHXQepDZFXbMZjNMJlOp5X/99Rf8/f3vuygiIqLqpFSGwt8/ssI2RUWO3acrg9aDzq6w06tXLyxatAhffvklAEAmk6GgoAAzZsyolkdIEBERSYUrgtaDzq6w89lnnyE2NhbNmzeHTqfDSy+9hHPnziEkJAT/+te/HF0jERERkd3sCjt169bFsWPHsG7dOqSnp6OgoABjx47F8OHDoVAoHF0jERERkd3sCjsA4OXlhREjRjiyFiIiIrvYOstJrVbDYDC4ZP/VtW+qnF1h5+uvv65w/ahRo+wqhoiIqKqqMstJEPKRkXERQUE6OGo+ja37r459k23svs/O3YxGIwRBgLe3N5RKJcMOERE5ja2znADAbD4JvX4pjMZip++/OvZNtrEr7Ny+fbvUsnPnzuH111/H1KlT77soIiKiqrJlllNBgdpl+6/OfVPF7H421r0aN26MuXPnlur1ISIiInIlh4Ud4M6g5evXrztyk0RERET3xa7LWD/99JPVe1EUkZWVhWXLlqFTp04OKYyIqs7WGSkAZ4YQ0YPDrrAzYMAAq/cymQyhoaHo3r07PvvsM0fURURVpNVqsSwxEUaNxqb2+YKAixkZ0AUFgVNDiEjK7H42FhG5F0EQYNRoMEihQKhSWWn7k2Yzlur1KDZWPl2XiKgms/umgkTknkKVSkTa0FOjLihwQjVERK5nV9iZPHmyzW0XLFhgzy6IiIhcymDQQa2ufLo4x7+5P7vCzp9//ok///wTRqMRTZo0AQCcPXsWnp6eaNOmjaWdTCZzTJVEREROpNfnIT39OObMMUNZyWVh3hnZ/dkVdvr16wd/f3+sXr0atWvXBnDnRoOjR49Gly5d8Pbbbzu0SCIiImcyGoug08nh6zsQwcHRFbblnZHdn11h57PPPsPWrVstQQcAateujY8//hi9evVi2CGiGkdnMNh0yQIAlEolVCpVNVdE7kChCHHJXZltvYQG8PtoC7vCTl5eHm7cuFFq+Y0bN5Cfn3/fRREROVOeXo/j6ekwz5lT6SULAJCHhGD89On8BUPVoiqX0AAgJESO6dPH8/tYAbvCzsCBAzF69Gh89tlnePLJJwEABw4cwNSpUzFo0CCHFkhEVN2KjEbIdToM9PVFdHBwhW1vCAI2aDQQBIG/XKhaVOUSmiDcgEazgd/HStgVdlauXIkpU6bgpZdegvH/79Hh5eWFsWPH4tNPP3VogUREzhKiUNg0bR9FRdVfDD3wbLmEBvDraAu7wo5SqcTnn3+OTz/9FBcuXAAANGrUCLVq1XJocUREJE22PtqE41HIEe7rpoJZWVnIyspC165doVAoIIoip5sTEVGFtFotEhOXQaOp/O7dHI9CjmBX2Ll58yZefPFF7Ny5EzKZDOfOnUPDhg0xduxY1K5dm8/HIiKicgmCAI3GCIViEJTK0AracTwKOYaHPR+aNGkS5HI5MjMzrUaKDxkyBJs3b3ZYcUREJF1KZSj8/SPLfVUUhIiqwq6ena1bt2LLli2oW7eu1fLGjRvjypUrDimMiIiIyBHs6tkpLCwsc+7/rVu34OPjc99FERERETmKXWGnS5cu+Prrry3vZTIZzGYz5s+fj27dujmsOCIiIqL7ZddlrPnz56NHjx44fPgwDAYD3nnnHWRkZODWrVvYu3evo2skIiIisptdPTuPPfYYzp49i86dO6N///4oLCzEoEGD8Oeff6JRo0aOrpGIiIjIblXu2TEajejduzdWrlyJDz74oDpqIiIiInKYKvfsyOVypKenV0ctRERERA5n12WsESNGYNWqVY6uhYiIiMjh7BqgXFxcjK+++grbtm1D27ZtSz0Ta8GCBQ4pjoiIiOh+VSnsXLx4EdHR0Thx4gTatGkDADh79qxVGz4bi4iIHMVg0EGtVlfYRq1Ww2AwOKkiqomqFHYaN26MrKws7Ny5E8Cdx0MsWbIE4eHh1VIcERE9uPT6PKSnH8ecOeYyb2RbQhDykZFxEUFBOvj7O7FAqjGqFHZEUbR6v2nTJhQWFjq0ICIiIgAwGoug08nh6zsQwcHR5bYzm09Cr18Ko7HYecVRjWLXmJ0S94YfIiIiR1MoQuDvH1nu+oKCii9zEVVpNpZMJis1JodjdIiIiMidVfkyVnx8vOVhnzqdDuPGjSs1G2vDhg2Oq5CIiIjoPlQp7MTFxVm9HzFihEOLISKimkur1UIQhErbcfYUOVuVwk5ycnJ11UFERDWYVqtFYuIyaDTGStty9hQ5230NUCYiIumzpcdGrVbj+vVCqFRDoVSGVtiWs6fI2Rh2iIioXLb22JT01nTr5l/hzCmAs6fI+Rh2iIioXIIgQKMxQqEYVGGPDXtryJ0x7BC5OQ76JHegVIbyXjdUYzHsELkxrVaLZYmJMGo0lbbNFwRczMiALigIHPVJRPQ/DDtEbkwQBBg1GgxSKBBawbOBAOCk2Yylej2KjZXPhiEiepAw7BDVAKFKJSIr6a1RFxQ4qRoicie2PBkeAJRKJVQqlRMqcj8MO0RERDWUrU+GB4CQEDmmTx//QAaeKj0by9GSkpLwxBNPwN/fH2FhYRgwYADOnDlj1Uan0yEhIQHBwcHw8/PD4MGDSyXYzMxM9O3bF0qlEmFhYZg6dSqKizkjgIiIpM36yfCvlftSKAZBozHaNNlBilwadnbv3o2EhAT88ccfSE1NhdFoRK9evVBYWGhpM2nSJPz8889Yv349du/ejevXr2PQoEGW9SaTCX379oXBYMC+ffuwevVqpKSk4KOPPnLFIRERETldyZPhy3tVdqNHqXPpZazNmzdbvU9JSUFYWBjS0tLQtWtXaLVarFq1Ct9++y26d+8O4M4jK5o1a4Y//vgDHTp0wNatW3Hy5Els27YN4eHhaN26NRITE/Huu+9i5syZ8Pb2dsWhERERkZtwac/OvbRaLQAgKCgIAJCWlgaj0YiePXta2jRt2hRRUVHYv38/AGD//v1o0aIFwsPDLW1iY2ORl5eHjIwMJ1ZPRERE7shtBiibzWZMnDgRnTp1wmOPPQYAyM7Ohre3NwIDA63ahoeHIzs729Lm7qBTsr5kXVn0ej30er3lfV5enqMOg4iIiNyM2/TsJCQk4MSJE1i3bl217yspKQkqlcryqlevXrXvk4iIiFzDLcLO+PHj8csvv2Dnzp2oW7euZXlERAQMBgNyc3Ot2qvVakRERFja3Ds7q+R9SZt7TZs2DVqt1vK6evWqA4+GiIiI3IlLw44oihg/fjx++OEH7NixAw0aNLBa37ZtW8jlcmzfvt2y7MyZM8jMzERMTAwAICYmBsePH0dOTo6lTWpqKgICAtC8efMy9+vj44OAgACrFxEREUmTS8fsJCQk4Ntvv8WPP/4If39/yxgblUoFhUIBlUqFsWPHYvLkyQgKCkJAQADefPNNxMTEoEOHDgCAXr16oXnz5hg5ciTmz5+P7OxsfPjhh0hISICPj48rD4+IiIjcgEvDzooVKwAATz/9tNXy5ORkxMfHAwAWLlwIDw8PDB48GHq9HrGxsfj8888tbT09PfHLL7/g9ddfR0xMDGrVqoW4uDjMnj3bWYdBREREbsylYUcUxUrb+Pr6Yvny5Vi+fHm5berXr4/ffvvNkaURVSutVmvTnUzVajUMBoMTKiIiki63mXpO9KDQarVYlpgIo0ZTadt8QcDFjAzogoKASh4ESkREZWPYIXIyQRBg1GgwSKFAaCUP7jtpNmOpXo9io9FJ1RERSQ/DDpGLhCqViKykt0ZdUOCkaoiIpMst7rNDREREVF0YdoiIiEjSGHaIiIhI0hh2iIiISNIYdoiIiEjSGHaIiIhI0jj1nIjoAWXLnbx5F2+SAoYdIqIHkFarRWLiMmg0Fd+wUhDykZFxEUFBOt7Em2oshh0iogeQIAjQaIxQKAZBqQwtt53ZfBJ6/VIYjcVOrI7IsRh2iIgeYEplKPz9I8tdX1CgdmI1RNWDA5SJiIhI0hh2iIiISNJ4GYuIqAawZeYUACiVSqhUKidURFRzMOwQEbk5W2dOAUBIiBzTp49n4CG6C8MOEZGbs3XmlCDcgEazAYIgMOwQ3YVhh4iohqhs5hQAFBU5qRiiGoQDlImIiEjSGHaIiIhI0hh2iIiISNIYdoiIiEjSGHaIiIhI0hh2iIiISNI49ZyIyIVsuTOyWq2GwWBwUkVE0sOwQ0TkIrbeGVkQ8pGRcRFBQTr4+zupOCIJYdghInIRW++MbDafhF6/FEZjsROrI5IOhh0iIher7M7IBQVqJ1ZDJD0coExERESSxrBDREREksawQ0RERJLGsENERESSxrBDREREksawQ0RERJLGsENERESSxvvsEBFJiMGgg1pd+X15+AgKepAw7BARSYRen4f09OOYM8cMpVJZYVs+goIeJAw7REQSYTQWQaeTw9d3IIKDoytsy0dQ0IOEYYeISGIUipAKHz8B8BEU9GDhAGUiIiKSNIYdIiIikjRexiIicjCtVgtBECptxxlRRM7BsENE5EBarRaJicug0RgrbcsZUUTOwbBD5CD81zwBgCAI0GiMUCgGQakMrbAtZ0SRM9l6DyalUgmVSuWEipyHYYfIAbRaLZYlJsKo0VTaNl8QcDEjA7qgIPCf89KlVIZyRhS5jarcgykkRI7p08dLKvAw7BA5gCAIMGo0GKRQILSS/5GcNJuxVK9HsbHyyxxERI5g6z2YBOEGNJoNEASBYYeIyhaqVCKykt4adUGBk6ohIrJmyz2YioqcVIwTceo5ERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUmaS8PO77//jn79+qFOnTqQyWTYuHGj1XpRFPHRRx8hMjISCoUCPXv2xLlz56za3Lp1C8OHD0dAQAACAwMxduxYFPCmbURERPT/XBp2CgsL0apVKyxfvrzM9fPnz8eSJUuwcuVKHDhwALVq1UJsbCx0Op2lzfDhw5GRkYHU1FT88ssv+P333/Hqq6866xCI6AGkMxigVquRlZVV6qVWqyEI+SgoUCM/Pws6ndbV5RI98Fz6uIg+ffqgT58+Za4TRRGLFi3Chx9+iP79+wMAvv76a4SHh2Pjxo0YOnQoTp06hc2bN+PQoUNo164dAGDp0qV49tln8fe//x116tRx2rGQNPFJ5nSvPL0ex9PTYZ4zp8wHKgqCgFtHzqLQ5yrkciWMyhC06Dodvr7Sec4QUU3jts/GunTpErKzs9GzZ0/LMpVKhfbt22P//v0YOnQo9u/fj8DAQEvQAYCePXvCw8MDBw4cwMCBA11ROkkEn2ROZSkyGiHX6TDQ1xfRwcGl1hf4+GCPjwK+vrVRJPPAz4IGRqPAsEPkQm4bdrKzswEA4eHhVsvDw8Mt67KzsxEWFma13svLC0FBQZY2ZdHr9dDr9Zb3eXl5jiqbJIRPMqeKhCgUZT70NR9AkNwHCm8/FABAsQSfqkhUw7ht2KlOSUlJmDVrlqvLoBqCTzKnEjqdDoWCgOLiYgiCgPz8/FJtCgsLYTKZXFAdEZXHbcNOREQEgDtjISIj//c4erVajdatW1va5OTkWH2uuLgYt27dsny+LNOmTcPkyZMt7/Py8lCvXj0HVk9ENYUtAQa40yN88GA6TucW4ubNPBw4cBKXlFdLtTMa9cjJuY0GDYoBT7f9XyzRA8Vt/yY2aNAAERER2L59uyXc5OXl4cCBA3j99dcBADExMcjNzUVaWhratm0LANixYwfMZjPat29f7rZ9fHzg4+NT7cdARO5Np9Ph998P4oRGW2GAAf4XYmRBzeHpeRM+vs2hUISVaieKN2AyHYTJZAY8q/sIiMgWLg07BQUFOH/+vOX9pUuXcPToUQQFBSEqKgoTJ07Exx9/jMaNG6NBgwaYPn066tSpgwEDBgAAmjVrht69e+OVV17BypUrYTQaMX78eAwdOpQzsYioUkajEYJghpdXgwoDDPC/EOPh4Q0PDy/I5Ur4+JS+vGkwFFZ32URURS4NO4cPH0a3bt0s70suLcXFxSElJQXvvPMOCgsL8eqrryI3NxedO3fG5s2b4evra/nM2rVrMX78ePTo0QMeHh4YPHgwlixZ4vRjIaKay9NLUWGAARhiiGoyl4adp59+GqIolrteJpNh9uzZmD17drltgoKC8O2331ZHeURERCQBfDYWERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJmperCyByNq1WC0EQKm2nVqthMBicUBFVB5PJBEEQkJ+fX26bwsJCmEwmQObEwojI6Rh26IGi1WqxLDERRo2m0rb5goCLGRnQBQUB/v5OqI4cRW8w4PZtLQ4cOIlLyqvltjMa9cjJuQ0xrJ4TqyMiZ2PYoQeKIAgwajQYpFAgVKmssO1JsxlL9XoUG41Oqo4cpbi4GCYT4OnVAApF/XLbieINmEwHIZrNTqyOiJyNYYceSKFKJSIr6a1RFxQ4qRqqLl5eCvj4lP9zNhgKnVgNEbkKBygTERGRpDHsEBERkaQx7BAREZGkMewQERGRpDHsEBERkaRxNhYRERFZGAw6qNVqm9oqlUqoVKpqruj+MewQERERAECvz0N6+nHMmWOGspJ7kQFASIgc06ePd/vAw7BDREREAACjsQg6nRy+vgMRHBxdYVtBuAGNZgMEQWDYISIioppFoQiBv39kpe2KipxQjANwgDIRERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkap54TUY2iNxiQn59fYZsiQYAomp1UERG5O4YdIqoxTCYTjhzJwHlZxXd2PZd3CwaDESaTyUmVEZE7Y9ghohpDFEXoikwICmgGubz8wONReBpm8wWI5prVu6PTaWE0CqWWC8INFBfrIAg5yM/3AwDI5Ur4+rr3XWuJ3AXDDhHVOHK5Ej4+/uWu9/LydWI1FTOaDCgoKPuhineHGI3GjHMHl0FhKH2JThBuwf/mSagPfIZ8ZcCd7SpD0KLrdAYeIhsw7FCNp9VqIQil/zVcFrVaDYPBUM0VEd1RWKxHjjod+O+cMnui7g4xN+ReKMzJwOC67RHsW9uqXYHZhExPb0T5BsJPURu5RgE/CxoYjQLDDpENGHaoRtNqtViWmAijRmNT+3xBwMWMDOiCggD/8nsGiBzBYDZCUazDc56+CFMEl1p/d4jRyIrxo0kPPw85gu/ptfI2FELr4YUgeS34l6wrriEPJSJyAww7VKMJggCjRoNBCgVClRUPWgWAk2Yzlur1KDYanVAd0R0quaJUgAGsQ4wR7HEkqi4MOyQJoUolIm3oqVEXFDihGiIicie8qSARERFJGsMOERERSRovY5FbsnWGFWdXERFRZRh2yO1UZYYVZ1cREVFlGHbI7VRlhhVnVxERUWUYdsht2TLDirOr6EFV1p2Zy3qsBMBHSxAx7BAR1TDl3Zm5rMdKAHy0BBHDDhFRDVPenZnvfawEAD5agggMO+REnGFF5Fj33pm5zMdKAHy0BD3wGHbIKTjDioiIXIVhh5yCM6yIiMhVGHbIqTjDiohIOgwGHdRqdaXtlEolVCrXjRlj2CGiaqPT6WCsoIeuUBBQXFyM/IIC5OfnV7itQkGAyWSCyWx2dJmSx2nqVB30+jykpx/HnDlmKCvpsQ8JkWP69PEuCzwMO0RULfQGA37//SAEofxwclHIh0aTi61b9uBSZH14enpW2Pb27XzclHuiflBxdZQsSZymTtXFaCyCTieHr+9ABAdHl9tOEG5Ao9kAQRAYdu7X8uXL8emnnyI7OxutWrXC0qVL8eSTT7q6LMnjDCsqj6m4GIJghpdXM6tfsnfzMedAJsuC3uABD49HoFAElru9krYmE2AysXfHVpymTtVNoQiBv39khW2KXDwhUBJh59///jcmT56MlStXon379li0aBFiY2Nx5swZhIWFubo8yeIMK7KFXK6Ej0/ZP3MfQwFksju9OV5e5be7ty1Vna3T1I16rdUlr/Iud5XgZS+qCSQRdhYsWIBXXnkFo0ePBgCsXLkSv/76K7766iu89957Lq6u5qlKb03h9esYqlJxhpUbK2/cTMl4GUEQkJ+fD7PZDA8PjzK3YW9bk8nk0GOh6lXWJa/yLneVELz98ciT4ysNRQBgNhvh4SG3qW15vYFE9qjxYcdgMCAtLQ3Tpk2zLPPw8EDPnj2xf/9+F1Z2h63BAQCMRiPkcrnN267K6HZb68jLy8M3y5bBs5LBosD/emv8u3XjDCsHuTeY3Bsy7iaXy+Hr61vp9sobN3NRyMfNm3k4cOAkzvtcws2bOQgODi9z3Iw9bY/8eQ7IN6BBA46vqSnKuuRV1uWuEtd1t/H15Z24VKiG0airMBQZTQZk3TyLh4IfgV5fUGFb4M7YobAm/R1/kPRAqvFhR6PRwGQyITw83Gp5eHg4Tp8+XeZn9Ho99Hq95b1WqwVw5xe9I2m1Wnw5fz6Kb96stK3OaMSp8+fx6MMPw9vGwGMOCMCLr7wC/0qCRn5+Ptb/4x+Q2XB8+UVFuHzqFEY/9hhCK9nuJYMBp4uKcEGjQWX9NZlaLYxmM65otRArOb7qausudZTXVmcw4NChY9AV/S+Y/KUvglqjxc//PYLaPtb/0vX2FtGiRRP4eHsDAM7euoUigwGn1WoU/P/4KEEQcOZGHmQedeHl5WP1+Zsmb5iQBY0pGIIgw43CYggKFXx9a5Wq2Z62N4z+MBqyIGqvwddQ9nfvL+EWjGYjbsGMKwVZ8DWVH4qr0ja76BZMoojrRTch5l4pt52u6BbUJgPMRTdhMBnwV74agqnssWW2ti1p51GQBY1odEjbu9v5mgrwl3CrzLb3tis5b1Vtm6/Lg9zjTpDV6fOgE83I1+fB6CFa1XVTuAVPfR4e1+XBF2bkAAgz6eBjLP13QK3Lxc3CHLRShFTaVijWY69Oi1u3LsBsNkKrvQK5XCzVroRWm2lTu6q0deU2pbbvoiINDAY98vPzUatW6f9n3I+S39uiWHGtEGu4a9euiQDEffv2WS2fOnWq+OSTT5b5mRkzZogA+OKLL7744osvCbyuXr1aYVao8T07ISEh8PT0LHVTI7VajYiIiDI/M23aNEyePNny3mw249atWwgODoZMJqvWet1BXl4e6tWrh6tXryIgoOwuZCobz9394fm7Pzx/94fnz37ueu5EUUR+fj7q1KlTYbsaH3a8vb3Rtm1bbN++HQMGDABwJ7xs374d48ePL/MzPj4+8PGx7tIPDAys5krdT0BAgFt9aWsSnrv7w/N3f3j+7g/Pn/3c8dzZMna1xocdAJg8eTLi4uLQrl07PPnkk1i0aBEKCwsts7OIiIjowSWJsDNkyBDcuHEDH330EbKzs9G6dWts3ry51KBlIiIievBIIuwAwPjx48u9bEXWfHx8MGPGjFKX8qhyPHf3h+fv/vD83R+eP/vV9HMnE8XK5msRERER1Vxl3wKViIiISCIYdoiIiEjSGHaIiIhI0hh2iIiISNIYdiRqxYoVaNmypeUGUDExMdi0aZNlvU6nQ0JCAoKDg+Hn54fBgweXugs13TF37lzIZDJMnDjRsoznr3wzZ86ETCazejVt2tSynueucteuXcOIESMQHBwMhUKBFi1a4PDhw5b1oijio48+QmRkJBQKBXr27Ilz5865sGL3ER0dXer7J5PJkJCQAIDfv8qYTCZMnz4dDRo0gEKhQKNGjZCYmGj17Kka+f1zwOOpyA399NNP4q+//iqePXtWPHPmjPj++++LcrlcPHHihCiKojhu3DixXr164vbt28XDhw+LHTp0EDt27Ojiqt3PwYMHxejoaLFly5bihAkTLMt5/so3Y8YM8dFHHxWzsrIsrxs3bljW89xV7NatW2L9+vXF+Ph48cCBA+LFixfFLVu2iOfPn7e0mTt3rqhSqcSNGzeKx44dE59//nmxQYMGYlFRkQsrdw85OTlW373U1FQRgLhz505RFPn9q8wnn3wiBgcHi7/88ot46dIlcf369aKfn5+4ePFiS5ua+P1j2HmA1K5dW/znP/8p5ubminK5XFy/fr1l3alTp0QA4v79+11YoXvJz88XGzduLKampopPPfWUJezw/FVsxowZYqtWrcpcx3NXuXfffVfs3LlzuevNZrMYEREhfvrpp5Zlubm5oo+Pj/ivf/3LGSXWKBMmTBAbNWokms1mfv9s0LdvX3HMmDFWywYNGiQOHz5cFMWa+/3jZawHgMlkwrp161BYWIiYmBikpaXBaDSiZ8+eljZNmzZFVFQU9u/f78JK3UtCQgL69u1rdZ4A8PzZ4Ny5c6hTpw4aNmyI4cOHIzMzEwDPnS1++ukntGvXDi+88ALCwsLw+OOP4x//+Idl/aVLl5CdnW11DlUqFdq3b89zeA+DwYBvvvkGY8aMgUwm4/fPBh07dsT27dtx9uxZAMCxY8fw3//+F3369AFQc79/krmDMpV2/PhxxMTEQKfTwc/PDz/88AOaN2+Oo0ePwtvbu9TDT8PDw5Gdne2aYt3MunXrcOTIERw6dKjUuuzsbJ6/CrRv3x4pKSlo0qQJsrKyMGvWLHTp0gUnTpzgubPBxYsXsWLFCkyePBnvv/8+Dh06hLfeegve3t6Ii4uznKd7H4fDc1jaxo0bkZubi/j4eAD8u2uL9957D3l5eWjatCk8PT1hMpnwySefYPjw4QBQY79/DDsS1qRJExw9ehRarRbff/894uLisHv3bleX5fauXr2KCRMmIDU1Fb6+vq4up8Yp+RcgALRs2RLt27dH/fr18d1330GhULiwsprBbDajXbt2mDNnDgDg8ccfx4kTJ7By5UrExcW5uLqaZdWqVejTpw/q1Knj6lJqjO+++w5r167Ft99+i0cffRRHjx7FxIkTUadOnRr9/eNlLAnz9vbGww8/jLZt2yIpKQmtWrXC4sWLERERAYPBgNzcXKv2arUaERERrinWjaSlpSEnJwdt2rSBl5cXvLy8sHv3bixZsgReXl4IDw/n+auCwMBAPPLIIzh//jy/ezaIjIxE8+bNrZY1a9bMcimw5DzdO4OI59DalStXsG3bNrz88suWZfz+VW7q1Kl47733MHToULRo0QIjR47EpEmTkJSUBKDmfv8Ydh4gZrMZer0ebdu2hVwux/bt2y3rzpw5g8zMTMTExLiwQvfQo0cPHD9+HEePHrW82rVrh+HDh1v+zPNnu4KCAly4cAGRkZH87tmgU6dOOHPmjNWys2fPon79+gCABg0aICIiwuoc5uXl4cCBAzyHd0lOTkZYWBj69u1rWcbvX+UEQYCHh3U08PT0hNlsBlCDv3+uHiFN1eO9994Td+/eLV66dElMT08X33vvPVEmk4lbt24VRfHO9MuoqChxx44d4uHDh8WYmBgxJibGxVW7r7tnY4kiz19F3n77bXHXrl3ipUuXxL1794o9e/YUQ0JCxJycHFEUee4qc/DgQdHLy0v85JNPxHPnzolr164VlUql+M0331jazJ07VwwMDBR//PFHMT09Xezfv7/bT/11JpPJJEZFRYnvvvtuqXX8/lUsLi5OfOihhyxTzzds2CCGhISI77zzjqVNTfz+MexI1JgxY8T69euL3t7eYmhoqNijRw9L0BFFUSwqKhLfeOMNsXbt2qJSqRQHDhwoZmVlubBi93Zv2OH5K9+QIUPEyMhI0dvbW3zooYfEIUOGWN0jhueucj///LP42GOPiT4+PmLTpk3FL7/80mq92WwWp0+fLoaHh4s+Pj5ijx49xDNnzrioWvezZcsWEUCZ54Tfv4rl5eWJEyZMEKOiokRfX1+xYcOG4gcffCDq9XpLm5r4/ZOJ4l23RSQiIiKSGI7ZISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiyXr66acxceJEV5dBRC7GsENEbqlfv37o3bt3mev27NkDmUyG9PR0J1dFRDURww4RuaWxY8ciNTUVf/31V6l1ycnJaNeuHVq2bOmCyoiopmHYISK39NxzzyE0NBQpKSlWywsKCrB+/XoMGDAAw4YNw0MPPQSlUokWLVrgX//6V4XblMlk2Lhxo9WywMBAq31cvXoVL774IgIDAxEUFIT+/fvj8uXLjjkoInIJhh0ickteXl4YNWoUUlJScPcj/NavXw+TyYQRI0agbdu2+PXXX3HixAm8+uqrGDlyJA4ePGj3Po1GI2JjY+Hv7489e/Zg79698PPzQ+/evWEwGBxxWETkAgw7ROS2xowZgwsXLmD37t2WZcnJyRg8eDDq16+PKVOmoHXr1mjYsCHefPNN9O7dG999953d+/v3v/8Ns9mMf/7zn2jRogWaNWuG5ORkZGZmYteuXQ44IiJyBYYdInJbTZs2RceOHfHVV18BAM6fP489e/Zg7NixMJlMSExMRIsWLRAUFAQ/Pz9s2bIFmZmZdu/v2LFjOH/+PPz9/eHn5wc/Pz8EBQVBp9PhwoULjjosInIyL1cXQERUkbFjx+LNN9/E8uXLkZycjEaNGuGpp57CvHnzsHjxYixatAgtWrRArVq1MHHixAovN8lkMqtLYsCdS1clCgoK0LZtW6xdu7bUZ0NDQx13UETkVAw7ROTWXnzxRUyYMAHffvstvv76a7z++uuQyWTYu3cv+vfvjxEjRgAAzGYzzp49i+bNm5e7rdDQUGRlZVnenzt3DoIgWN63adMG//73vxEWFoaAgIDqOygicipexiIit+bn54chQ4Zg2rRpyMrKQnx8PACgcePGSE1Nxb59+3Dq1Cm89tprUKvVFW6re/fuWLZsGf78808cPnwY48aNg1wut6wfPnw4QkJC0L9/f+zZsweXLl3Crl278NZbb5U5BZ6IagaGHSJye2PHjsXt27cRGxuLOnXqAAA+/PBDtGnTBrGxsXj66acRERGBAQMGVLidzz77DPXq1UOXLl3w0ksvYcqUKVAqlZb1SqUSv//+O6KiojBo0CA0a9YMY8eOhU6nY08PUQ0mE++9gE1EREQkIezZISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSfs/vE4R++2ZMqkAAAAASUVORK5CYII=",
|
| 406 |
+
"text/plain": [
|
| 407 |
+
"<Figure size 640x480 with 1 Axes>"
|
| 408 |
+
]
|
| 409 |
+
},
|
| 410 |
+
"metadata": {},
|
| 411 |
+
"output_type": "display_data"
|
| 412 |
+
}
|
| 413 |
+
],
|
| 414 |
+
"source": [
|
| 415 |
+
"import matplotlib.pyplot as plt\n",
|
| 416 |
+
"import numpy as np\n",
|
| 417 |
+
"\n",
|
| 418 |
+
"# 示例数据\n",
|
| 419 |
+
"data1 = sim_score # 生成 1000 个符合正态分布的随机数\n",
|
| 420 |
+
"data2 = dif_score # 生成 1000 个偏移的随机数\n",
|
| 421 |
+
"\n",
|
| 422 |
+
"# 绘制直方图\n",
|
| 423 |
+
"plt.hist(data1, bins=30, alpha=0.5, label='Data 1', color='blue', edgecolor='black')\n",
|
| 424 |
+
"plt.hist(data2, bins=30, alpha=0.5, label='Data 2', color='red', edgecolor='black')\n",
|
| 425 |
+
"\n",
|
| 426 |
+
"# 添加图例\n",
|
| 427 |
+
"plt.legend()\n",
|
| 428 |
+
"\n",
|
| 429 |
+
"# 添加标题和标签\n",
|
| 430 |
+
"plt.title('Histogram of Two Data Sets')\n",
|
| 431 |
+
"plt.xlabel('Value')\n",
|
| 432 |
+
"plt.ylabel('Frequency')\n",
|
| 433 |
+
"\n",
|
| 434 |
+
"# 显示图形\n",
|
| 435 |
+
"plt.show()"
|
| 436 |
+
]
|
| 437 |
+
},
|
| 438 |
+
{
|
| 439 |
+
"cell_type": "code",
|
| 440 |
+
"execution_count": null,
|
| 441 |
+
"id": "f314d408-18ff-4e59-92bd-eb7a767ca262",
|
| 442 |
+
"metadata": {},
|
| 443 |
+
"outputs": [],
|
| 444 |
+
"source": []
|
| 445 |
+
}
|
| 446 |
+
],
|
| 447 |
+
"metadata": {
|
| 448 |
+
"kernelspec": {
|
| 449 |
+
"display_name": "Python 3 (ipykernel)",
|
| 450 |
+
"language": "python",
|
| 451 |
+
"name": "python3"
|
| 452 |
+
},
|
| 453 |
+
"language_info": {
|
| 454 |
+
"codemirror_mode": {
|
| 455 |
+
"name": "ipython",
|
| 456 |
+
"version": 3
|
| 457 |
+
},
|
| 458 |
+
"file_extension": ".py",
|
| 459 |
+
"mimetype": "text/x-python",
|
| 460 |
+
"name": "python",
|
| 461 |
+
"nbconvert_exporter": "python",
|
| 462 |
+
"pygments_lexer": "ipython3",
|
| 463 |
+
"version": "3.12.3"
|
| 464 |
+
}
|
| 465 |
+
},
|
| 466 |
+
"nbformat": 4,
|
| 467 |
+
"nbformat_minor": 5
|
| 468 |
+
}
|
best_model/vect_sim_protein_rand_test.ipynb
ADDED
|
@@ -0,0 +1,423 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "c0314d29-7fc8-4c11-8bfc-5440a442629a",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"name": "stdout",
|
| 11 |
+
"output_type": "stream",
|
| 12 |
+
"text": [
|
| 13 |
+
"https://hf-mirror.com\n"
|
| 14 |
+
]
|
| 15 |
+
}
|
| 16 |
+
],
|
| 17 |
+
"source": [
|
| 18 |
+
"# import subprocess\n",
|
| 19 |
+
"# import os\n",
|
| 20 |
+
"\n",
|
| 21 |
+
"# result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 22 |
+
"# output = result.stdout\n",
|
| 23 |
+
"# for line in output.splitlines():\n",
|
| 24 |
+
"# if '=' in line:\n",
|
| 25 |
+
"# var, value = line.split('=', 1)\n",
|
| 26 |
+
"# os.environ[var] = value\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"import os\n",
|
| 30 |
+
"\n",
|
| 31 |
+
"# 设置环境变量\n",
|
| 32 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"# 打印环境变量以确认设置成功\n",
|
| 35 |
+
"print(os.environ.get('HF_ENDPOINT'))"
|
| 36 |
+
]
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"cell_type": "code",
|
| 40 |
+
"execution_count": 2,
|
| 41 |
+
"id": "1a09a2f5-dda6-4d86-badd-60bf2fda3983",
|
| 42 |
+
"metadata": {},
|
| 43 |
+
"outputs": [
|
| 44 |
+
{
|
| 45 |
+
"name": "stderr",
|
| 46 |
+
"output_type": "stream",
|
| 47 |
+
"text": [
|
| 48 |
+
"2025-02-10 09:46:42.348539: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 49 |
+
"2025-02-10 09:46:42.362158: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 50 |
+
"2025-02-10 09:46:42.378104: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 51 |
+
"2025-02-10 09:46:42.382810: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 52 |
+
"2025-02-10 09:46:42.394903: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 53 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 54 |
+
"2025-02-10 09:46:43.362404: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 55 |
+
]
|
| 56 |
+
}
|
| 57 |
+
],
|
| 58 |
+
"source": [
|
| 59 |
+
"from transformers import GPT2Tokenizer, GPT2Model,AutoModel\n",
|
| 60 |
+
"import torch\n",
|
| 61 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 62 |
+
"from datasets import load_dataset\n",
|
| 63 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 64 |
+
"from transformers import Trainer\n",
|
| 65 |
+
"import evaluate\n",
|
| 66 |
+
"import numpy as np\n",
|
| 67 |
+
"from transformers import TrainingArguments\n",
|
| 68 |
+
"from transformers import AutoModelForSequenceClassification"
|
| 69 |
+
]
|
| 70 |
+
},
|
| 71 |
+
{
|
| 72 |
+
"cell_type": "code",
|
| 73 |
+
"execution_count": 3,
|
| 74 |
+
"id": "7c5ab8f5-b8a9-4930-ac30-49d0bf26d579",
|
| 75 |
+
"metadata": {},
|
| 76 |
+
"outputs": [],
|
| 77 |
+
"source": [
|
| 78 |
+
"model_name=\"gpt2_gene_multi_v2_ft\"\n",
|
| 79 |
+
"device=\"cuda\"\n",
|
| 80 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"gpt2_gene_multi_v2_ft\")\n",
|
| 81 |
+
"model = AutoModel.from_pretrained(model_name)\n",
|
| 82 |
+
"model.to(device)\n",
|
| 83 |
+
"\n",
|
| 84 |
+
"def get_text_embedding(text):\n",
|
| 85 |
+
" \"\"\"\n",
|
| 86 |
+
" 使用 GPT-2 模型获取文本的向量表示。\n",
|
| 87 |
+
" \n",
|
| 88 |
+
" 参数:\n",
|
| 89 |
+
" text (str): 输入文本。\n",
|
| 90 |
+
" model_name (str): 预训练 GPT-2 模型名称,默认为 \"gpt2\"。\n",
|
| 91 |
+
" device (str): 设备名称(\"cpu\" 或 \"cuda\")。\n",
|
| 92 |
+
" \n",
|
| 93 |
+
" 返回:\n",
|
| 94 |
+
" torch.Tensor: 文本的向量表示,维度为 [hidden_size]。\n",
|
| 95 |
+
" \"\"\"\n",
|
| 96 |
+
"\n",
|
| 97 |
+
" # 将文本编码为输入 ID 并添加批量维度\n",
|
| 98 |
+
" inputs = tokenizer(text, return_tensors=\"pt\", truncation=True, max_length=256)\n",
|
| 99 |
+
" input_ids = inputs[\"input_ids\"].to(device)\n",
|
| 100 |
+
" attention_mask = inputs[\"attention_mask\"].to(device)\n",
|
| 101 |
+
" \n",
|
| 102 |
+
" # 获取模型的隐藏层输出\n",
|
| 103 |
+
" with torch.no_grad():\n",
|
| 104 |
+
" outputs = model(input_ids, attention_mask=attention_mask)\n",
|
| 105 |
+
" hidden_states = outputs.last_hidden_state # [batch_size, seq_length, hidden_size]\n",
|
| 106 |
+
" \n",
|
| 107 |
+
" # 平均池化:获取序列中所有词向量的平均值\n",
|
| 108 |
+
" embeddings = hidden_states.mean(dim=1).squeeze() # [hidden_size]\n",
|
| 109 |
+
" \n",
|
| 110 |
+
" return embeddings"
|
| 111 |
+
]
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"cell_type": "code",
|
| 115 |
+
"execution_count": 4,
|
| 116 |
+
"id": "76ff7fed-fc17-421e-8a57-2a5de33d4ba6",
|
| 117 |
+
"metadata": {},
|
| 118 |
+
"outputs": [
|
| 119 |
+
{
|
| 120 |
+
"data": {
|
| 121 |
+
"text/plain": [
|
| 122 |
+
"39.938614"
|
| 123 |
+
]
|
| 124 |
+
},
|
| 125 |
+
"execution_count": 4,
|
| 126 |
+
"metadata": {},
|
| 127 |
+
"output_type": "execute_result"
|
| 128 |
+
}
|
| 129 |
+
],
|
| 130 |
+
"source": [
|
| 131 |
+
"from sklearn.metrics.pairwise import cosine_similarity\n",
|
| 132 |
+
"\n",
|
| 133 |
+
"def get_sim_score(s1, s2):\n",
|
| 134 |
+
" v1 = get_text_embedding(s1)\n",
|
| 135 |
+
" v2 = get_text_embedding(s2)\n",
|
| 136 |
+
" \n",
|
| 137 |
+
" # 假设dna_embedding和protein_embedding为numpy数组\n",
|
| 138 |
+
" #similarity = cosine_similarity([v1.cpu().numpy()], [v2.cpu().numpy()])[0][0]\n",
|
| 139 |
+
" A = v1.cpu().numpy()\n",
|
| 140 |
+
" B = v2.cpu().numpy()\n",
|
| 141 |
+
" #similarity = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))\n",
|
| 142 |
+
" similarity = np.linalg.norm(A - B)\n",
|
| 143 |
+
" return similarity\n",
|
| 144 |
+
"\n",
|
| 145 |
+
"s1 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 146 |
+
"s2 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 147 |
+
"s1 = \"ATGTCTCTACAGATGATAACGGTCAGTAATAACGTAACTTTAATTCAACCAGGCTTCTCACTGATGAATTTTGATGGACAAGTTTTCTTCTTTGGTCAAAAAGGCTGGCCCAAGAGATCCTGCCCCACAGGAGTTTTCCATTTTGATGTAAAGCATAACCATCTCAAACTGAAGCCTACAGTTTTCTCAAAGGATTCCTGCTACCTTCCTCCTCTTCGCTATCCAGCCACTTGCATATTTAAAGGCAACTTCGAGTCTGAAAAGCATCAGTATATCATCCATGGAGGGAAAACACCAAACAATGAACTTTCAGATAAGATGTATGTCATGTCTATTGTTTGCAAAAACAACAAAAAATTTACTTTTCGCTGCACGGAGAAAGACTTGGTAGGTGATGTTCCTGAAGGCAGATATGGCCATTCCATTGATGTAGTGTATAGTCGAGGGAAAAGTATGGGCGTTCTCTTTGGAGGACGATCTTACATGCCTTCTGCCCAAAGAACCACAGAAAAATGGAACAGTGTAGTTGACTGCTTGCCCCATCTCTTCTTGGTGGATTTTGAATTTGGGTGTTCTACATCCTACATTCTTCCCGAACTTCAGGATGGGATATCTTTTCATGTCTCCATTGCCAGAAATGATACCATTTATATTTTAGGAGGTCATTCACTCACCAATAACATCCGCCCTGCCAATCTGTTCAGAGTAAGGGTTGATCTCCCCCTGGGTAGCCCAGCTGTGAGTTGCACGGTCTTATCAGGAGGAATCTCTGTCTCCAGTGCAATCTTGACTCAAACTAATAATGATGAATTTGTCATTGTTGGTGGCTATCAGCTTGAAAATCAAAAAAGAATGGTCTGCAACATTGTCACTTTAGATGACAACAAGATAGATATTCGTGAGATGGAGGCACCAGATTGGACCCCAGATATTAAGCACAGCAAGGTATGGTTTGGAAACAACATGGGAAATGGGAGTGTTTTCCTTGGAATACCAGGAGACAATAAGCAGGCTGTTTCAGAAGCATTCTATTTCTATATGTTGAAATGTGCTGAAGATGATATAAATGAAGATGAGAAAACATTGATGAACAGTCAGACATCAACAGAAGATCCAGGAGACTCCACACCCTTTGAAGACTCGGAAGAATTTTGCTTCAGTGCAGAAGCAAATAGTTTTGGTGGGGATGATGAATTTGACACCTATAATGAAGATGATGAGGAAGATGAGTCTGAGACAGGCTACTGGATTACGTGTTGCCTTACTTGTAATGTGGATATCAACACTTGGGTACCATTCTACTCAACTGAGCTCAACAAACCTGCTATGATCTACTGCTCTCATGAGGACGGGCACTGGGTCCATGCTCAGTGCATGGATCTGGCAGAGCGCACGCTCATCCATCTGTCAGAAGGAAGCAACAAGTATTATTGCAATGAGCATGTGGAGATAGCAAGAGCACTACAAACCCCCAAAAGAGCCATGCCCTTGAAAAAGCCCCCACTGAAATCCCTCCGCAAAAAAGGCCCTGCAAAAATCTTGACTCCTGCCAAGAAATCCTTCCTTAGAAGATTGTTTGAT\"\n",
|
| 148 |
+
"s2 = \"MSLQMITVSNNVTLIQPGFSLMNFDGQVFFFGQKGWPKRSCPTGVFHFDVKHNHLKLKPTVFSKDSCYLPPLRYPATCIFKGNFESEKHQYIIHGGKTPNNELSDKMYVMSIVCKNNKKFTFRCTEKDLVGDVPEGRYGHSIDVVYSRGKSMGVLFGGRSYMPSAQRTTEKWNSVVDCLPHLFLVDFEFGCSTSYILPELQDGISFHVSIARNDTIYILGGHSLTNNIRPANLFRVRVDLPLGSPAVSCTVLSGGISVSSAILTQTNNDEFVIVGGYQLENQKRMVCNIVTLDDNKIDIREMEAPDWTPDIKHSKVWFGNNMGNGSVFLGIPGDNKQAVSEAFYFYMLKCAEDDINEDEKTLMNSQTSTEDPGDSTPFEDSEEFCFSAEANSFGGDDEFDTYNEDDEEDESETGYWITCCLTCNVDINTWVPFYSTELNKPAMIYCSHEDGHWVHAQCMDLAERTLIHLSEGSNKYYCNEHVEIARALQTPKRAMPLKKPPLKSLRKKGPAKILTPAKKSFLRRLFD\"\n",
|
| 149 |
+
"get_sim_score(s1, s2)"
|
| 150 |
+
]
|
| 151 |
+
},
|
| 152 |
+
{
|
| 153 |
+
"cell_type": "code",
|
| 154 |
+
"execution_count": 5,
|
| 155 |
+
"id": "2116f787-781f-4bfc-b12d-c36efe26cfa9",
|
| 156 |
+
"metadata": {},
|
| 157 |
+
"outputs": [
|
| 158 |
+
{
|
| 159 |
+
"data": {
|
| 160 |
+
"text/plain": [
|
| 161 |
+
"DatasetDict({\n",
|
| 162 |
+
" train: Dataset({\n",
|
| 163 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 164 |
+
" num_rows: 8000\n",
|
| 165 |
+
" })\n",
|
| 166 |
+
" test: Dataset({\n",
|
| 167 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 168 |
+
" num_rows: 8000\n",
|
| 169 |
+
" })\n",
|
| 170 |
+
"})"
|
| 171 |
+
]
|
| 172 |
+
},
|
| 173 |
+
"execution_count": 5,
|
| 174 |
+
"metadata": {},
|
| 175 |
+
"output_type": "execute_result"
|
| 176 |
+
}
|
| 177 |
+
],
|
| 178 |
+
"source": [
|
| 179 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 180 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 181 |
+
"raw_datasets_dna_protein"
|
| 182 |
+
]
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"cell_type": "code",
|
| 186 |
+
"execution_count": 6,
|
| 187 |
+
"id": "6e6b1d3d-3d05-40b0-a96a-537a4dc324d6",
|
| 188 |
+
"metadata": {},
|
| 189 |
+
"outputs": [],
|
| 190 |
+
"source": [
|
| 191 |
+
"sim_score = []\n",
|
| 192 |
+
"dif_score = []\n",
|
| 193 |
+
"\n",
|
| 194 |
+
"for item in raw_datasets_dna_protein[\"train\"]:\n",
|
| 195 |
+
" #print(item)\n",
|
| 196 |
+
" sentence1 = item[\"sentence1\"]\n",
|
| 197 |
+
" sentence2 = item[\"sentence2\"]\n",
|
| 198 |
+
" label = item[\"label\"]\n",
|
| 199 |
+
" score = get_sim_score(sentence1, sentence2)\n",
|
| 200 |
+
"\n",
|
| 201 |
+
" if 1 == label:\n",
|
| 202 |
+
" sim_score.append(score)\n",
|
| 203 |
+
" else:\n",
|
| 204 |
+
" dif_score.append(score)"
|
| 205 |
+
]
|
| 206 |
+
},
|
| 207 |
+
{
|
| 208 |
+
"cell_type": "code",
|
| 209 |
+
"execution_count": 7,
|
| 210 |
+
"id": "a515f319-254b-4675-9ca5-fb15da6a62e5",
|
| 211 |
+
"metadata": {},
|
| 212 |
+
"outputs": [
|
| 213 |
+
{
|
| 214 |
+
"name": "stdout",
|
| 215 |
+
"output_type": "stream",
|
| 216 |
+
"text": [
|
| 217 |
+
"38.87972 37.672188\n"
|
| 218 |
+
]
|
| 219 |
+
}
|
| 220 |
+
],
|
| 221 |
+
"source": [
|
| 222 |
+
"import numpy as np\n",
|
| 223 |
+
"print(np.mean(sim_score), np.mean(dif_score))"
|
| 224 |
+
]
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"cell_type": "code",
|
| 228 |
+
"execution_count": 8,
|
| 229 |
+
"id": "4417c7b5-8019-4a53-968a-4dee311acef3",
|
| 230 |
+
"metadata": {},
|
| 231 |
+
"outputs": [
|
| 232 |
+
{
|
| 233 |
+
"name": "stdout",
|
| 234 |
+
"output_type": "stream",
|
| 235 |
+
"text": [
|
| 236 |
+
"4047 3953\n"
|
| 237 |
+
]
|
| 238 |
+
}
|
| 239 |
+
],
|
| 240 |
+
"source": [
|
| 241 |
+
"print(len(sim_score),len(dif_score))"
|
| 242 |
+
]
|
| 243 |
+
},
|
| 244 |
+
{
|
| 245 |
+
"cell_type": "code",
|
| 246 |
+
"execution_count": 9,
|
| 247 |
+
"id": "adc022c4-7bec-4381-b80b-6ac1b18be00c",
|
| 248 |
+
"metadata": {},
|
| 249 |
+
"outputs": [
|
| 250 |
+
{
|
| 251 |
+
"name": "stderr",
|
| 252 |
+
"output_type": "stream",
|
| 253 |
+
"text": [
|
| 254 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 39057 (\\N{CJK UNIFIED IDEOGRAPH-9891}) missing from font(s) DejaVu Sans.\n",
|
| 255 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 256 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
|
| 257 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 258 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans.\n",
|
| 259 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 260 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.\n",
|
| 261 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 262 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24067 (\\N{CJK UNIFIED IDEOGRAPH-5E03}) missing from font(s) DejaVu Sans.\n",
|
| 263 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 264 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 30452 (\\N{CJK UNIFIED IDEOGRAPH-76F4}) missing from font(s) DejaVu Sans.\n",
|
| 265 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 266 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.\n",
|
| 267 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 268 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22270 (\\N{CJK UNIFIED IDEOGRAPH-56FE}) missing from font(s) DejaVu Sans.\n",
|
| 269 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 270 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21306 (\\N{CJK UNIFIED IDEOGRAPH-533A}) missing from font(s) DejaVu Sans.\n",
|
| 271 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 272 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.\n",
|
| 273 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n"
|
| 274 |
+
]
|
| 275 |
+
},
|
| 276 |
+
{
|
| 277 |
+
"data": {
|
| 278 |
+
"image/png": "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",
|
| 279 |
+
"text/plain": [
|
| 280 |
+
"<Figure size 800x600 with 1 Axes>"
|
| 281 |
+
]
|
| 282 |
+
},
|
| 283 |
+
"metadata": {},
|
| 284 |
+
"output_type": "display_data"
|
| 285 |
+
}
|
| 286 |
+
],
|
| 287 |
+
"source": [
|
| 288 |
+
"import matplotlib.pyplot as plt\n",
|
| 289 |
+
"import numpy as np\n",
|
| 290 |
+
"\n",
|
| 291 |
+
"# 示例数据(Python list,float 类型)\n",
|
| 292 |
+
"#data = np.random.normal(loc=50, scale=15, size=200) # 生成200个服从正态分布的随机数\n",
|
| 293 |
+
"data = sim_score\n",
|
| 294 |
+
"\n",
|
| 295 |
+
"# 计算直方图并自动确定分区数\n",
|
| 296 |
+
"plt.figure(figsize=(8, 6)) # 设置图像大小\n",
|
| 297 |
+
"plt.hist(data, bins='auto', edgecolor='black', alpha=0.7)\n",
|
| 298 |
+
"\n",
|
| 299 |
+
"# 添加标题和标签\n",
|
| 300 |
+
"plt.xlabel('数值区间', fontsize=12)\n",
|
| 301 |
+
"plt.ylabel('频数', fontsize=12)\n",
|
| 302 |
+
"plt.title('数值分布直方图', fontsize=14)\n",
|
| 303 |
+
"\n",
|
| 304 |
+
"# 显示网格\n",
|
| 305 |
+
"plt.grid(axis='y', linestyle='--', alpha=0.7)\n",
|
| 306 |
+
"\n",
|
| 307 |
+
"# 显示直方图\n",
|
| 308 |
+
"plt.show()"
|
| 309 |
+
]
|
| 310 |
+
},
|
| 311 |
+
{
|
| 312 |
+
"cell_type": "code",
|
| 313 |
+
"execution_count": 10,
|
| 314 |
+
"id": "71ff0b65-1ced-49de-8bf3-60c9715916db",
|
| 315 |
+
"metadata": {},
|
| 316 |
+
"outputs": [
|
| 317 |
+
{
|
| 318 |
+
"data": {
|
| 319 |
+
"image/png": "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Luo5mZmZmjt3btznDCc9t1EsgUBAPp9PHk/f91b529/+pry8PJ199tlatWqV6uvrT8WUT6t42+epp57SuHHj9KlPfUp33HGHmpub465jpL+Htm7dqm3btum6667rd12mvYdWr16tpUuXRr32ktgXdRNvG8UyEvdF/W0f9kUDfw+N5H3RQBl5BzVTvffeeyotLVVra6tGjx6tZ555RtOnT9e2bduUmpqqrKysqPH5+fmqq6uLua6ues+7yvX1nOEg3jbq6fDhw/re976nlStX9rm+xYsXa9myZZo4caL27NmjO++8U0uWLFFZWZncbvepauOU6Wv7fO1rX1NJSYkKCwu1fft23X777aqoqNAf/vCHmOsa6e+hhx9+WNOmTdNnPvOZPtdn2nvoN7/5jd599139/e9/77Wsrq6OfZH63kY9jcR9UX/bh33R4N5DI3VfNBiE3WHk7LPP1rZt2xQIBPTf//3fuuaaa7Rp06ZETyupxNtG3cNKMBjU0qVLNX36dK1Zs6bP9V1xxRXO/59zzjmaMWOGJk+erL/97W9asGDBqWrjlOlr+3T/YXvOOedo/PjxWrBggfbs2aPJkycncNan10DeQy0tLdqwYYO++93v9rs+k95D1dXV+rd/+ze98sorGjVqVKKnk5QGs41G4r5oINtnpO+LBvMeGqn7okFL9HkUOHkLFiywV65caW/cuNGWZB85ciRqeXFxsf2Tn/wk5nP37NljS7LLy8uj6vPnz7e/9a1vnaIZn35d26hLMBi0S0tL7QULFpz0BxfGjRtnP/jgg0M1xYTquX26a2pqsiXZL730UszlI/U9ZNu2/cQTT9gpKSn2oUOHTmqdw/U99Mwzz9iSbLfb7Twk2ZZl2W6323711VdH/L6ov20UDodt2x65+6KBbp/uRtq+aDDbaKTuiwaLc3aHsUgkora2Ns2aNUspKSnauHGjs6yiokL79u2Le77qxIkTVVBQEPWcYDCot99+O+5zhqOubSR19nfxxRcrNTVVf/rTn07qyFRNTY3q6+s1fvz4oZ5qQnTfPj1t27ZNkuL2OhLfQ10efvhhffGLX1Rubu6g1zec30MLFizQe++9p23btjmP2bNn68orr3T+f6Tvi/rbRm63e0TviwayfXoaafuiwWyjkbovGrREp20MzHe+8x1706ZNdmVlpb19+3b7O9/5jm1Zlv2Xv/zFtu3Oy/0UFxfbr732mr1lyxa7tLTULi0tjVrH2Wefbf/hD39wvr7vvvvsrKws+9lnn7W3b99uX3bZZcP6Ui19baNAIGDPnTvXPuecc+zdu3dHXXql+2/J3bdRY2Oj/e1vf9suKyuzKysr7VdffdX+9Kc/bU+ZMsVubW1NVJsnra/ts3v3bvvee++1t2zZYldWVtrPPvusPWnSJHv+/PlR6xjJ76EuH374oW1Zlv3iiy/GXIfJ76FYen5KnH1Rb923Efui3rpvH/ZFscW6GgP7ooEj7A4T//Iv/2KXlJTYqampdm5urr1gwYKoH8AtLS32v/7rv9pjx46109PT7S996Ut2bW1t1Dok2Y8++qjzdSQSsb/73e/a+fn5ttfrtRcsWGBXVFScrpaGXF/b6K9//astKeajsrLSWUf3bdTc3GxffPHFdm5urp2SkmKXlJTYK1assOvq6hLQ3cfX1/bZt2+fPX/+fDs7O9v2er32WWedZd922229rm05kt9DXe644w57woQJdkdHR8x1mPweiqXnD2H2Rb1130bsi3rrvn3YF8UWK+yyLxo4y7Zt+/QeSwYAAABOD87ZBQAAgLEIuwAAADAWYRcAAADGIuwCAADAWIRdAAAAGIuwCwAAAGMRdgEAAGAswi4AAACMRdgFAACAsQi7AAAAMJYn0RMAAMS2c+dOnXfeeUpNTY25vL29XeXl5f2Oef/999Xa2jqk4yZPnnxyTQHAaUbYBYAkZdu2zj//fL355psxl8+bN2/AY4Z6HAAMF5zGAAAAAGMRdgEAAGAswi4AAACMRdgFAACAsQi7AAAAMBZhFwAAAMYi7AIAAMBYhF0AAAAYi7ALAAAAYxF2AQAAYCzCLgAAAIxF2AUAAICxPImeAAAgvrfeektZWVkxlzU1NQ14zKkYBwDDgWXbtp3oSQAAAACnAqcxAAAAwFiEXQAAABiLsAsAAABjEXYBAABgLMIuAAAAjEXYBQAAgLEIuwAAADAWYRcAAADGIuwCAADAWP8/SmluBIeZ2rYAAAAASUVORK5CYII=",
|
| 320 |
+
"text/plain": [
|
| 321 |
+
"<Figure size 800x600 with 1 Axes>"
|
| 322 |
+
]
|
| 323 |
+
},
|
| 324 |
+
"metadata": {},
|
| 325 |
+
"output_type": "display_data"
|
| 326 |
+
}
|
| 327 |
+
],
|
| 328 |
+
"source": [
|
| 329 |
+
"import matplotlib.pyplot as plt\n",
|
| 330 |
+
"import numpy as np\n",
|
| 331 |
+
"\n",
|
| 332 |
+
"# 示例数据(Python list,float 类型)\n",
|
| 333 |
+
"#data = np.random.normal(loc=50, scale=15, size=200) # 生成200个服从正态分布的随机数\n",
|
| 334 |
+
"data = dif_score\n",
|
| 335 |
+
"\n",
|
| 336 |
+
"# 计算直方图并自动确定分区数\n",
|
| 337 |
+
"plt.figure(figsize=(8, 6)) # 设置图像大小\n",
|
| 338 |
+
"plt.hist(data, bins='auto', edgecolor='black', alpha=0.7)\n",
|
| 339 |
+
"\n",
|
| 340 |
+
"# 添加标题和标签\n",
|
| 341 |
+
"plt.xlabel('数值区间', fontsize=12)\n",
|
| 342 |
+
"plt.ylabel('频数', fontsize=12)\n",
|
| 343 |
+
"plt.title('数值分布直方图', fontsize=14)\n",
|
| 344 |
+
"\n",
|
| 345 |
+
"# 显示网格\n",
|
| 346 |
+
"plt.grid(axis='y', linestyle='--', alpha=0.7)\n",
|
| 347 |
+
"\n",
|
| 348 |
+
"# 显示直方图\n",
|
| 349 |
+
"plt.show()"
|
| 350 |
+
]
|
| 351 |
+
},
|
| 352 |
+
{
|
| 353 |
+
"cell_type": "code",
|
| 354 |
+
"execution_count": 11,
|
| 355 |
+
"id": "f314d408-18ff-4e59-92bd-eb7a767ca262",
|
| 356 |
+
"metadata": {},
|
| 357 |
+
"outputs": [
|
| 358 |
+
{
|
| 359 |
+
"data": {
|
| 360 |
+
"image/png": "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",
|
| 361 |
+
"text/plain": [
|
| 362 |
+
"<Figure size 640x480 with 1 Axes>"
|
| 363 |
+
]
|
| 364 |
+
},
|
| 365 |
+
"metadata": {},
|
| 366 |
+
"output_type": "display_data"
|
| 367 |
+
}
|
| 368 |
+
],
|
| 369 |
+
"source": [
|
| 370 |
+
"import matplotlib.pyplot as plt\n",
|
| 371 |
+
"import numpy as np\n",
|
| 372 |
+
"\n",
|
| 373 |
+
"# 示例数据\n",
|
| 374 |
+
"data1 = sim_score # 生成 1000 个符合正态分布的随机数\n",
|
| 375 |
+
"data2 = dif_score # 生成 1000 个偏移的随机数\n",
|
| 376 |
+
"\n",
|
| 377 |
+
"# 绘制直方图\n",
|
| 378 |
+
"plt.hist(data1, bins=30, alpha=0.5, label='Data 1', color='blue', edgecolor='black')\n",
|
| 379 |
+
"plt.hist(data2, bins=30, alpha=0.5, label='Data 2', color='red', edgecolor='black')\n",
|
| 380 |
+
"\n",
|
| 381 |
+
"# 添加图例\n",
|
| 382 |
+
"plt.legend()\n",
|
| 383 |
+
"\n",
|
| 384 |
+
"# 添加标题和标签\n",
|
| 385 |
+
"plt.title('Histogram of Two Data Sets')\n",
|
| 386 |
+
"plt.xlabel('Value')\n",
|
| 387 |
+
"plt.ylabel('Frequency')\n",
|
| 388 |
+
"\n",
|
| 389 |
+
"# 显示图形\n",
|
| 390 |
+
"plt.show()\n"
|
| 391 |
+
]
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"cell_type": "code",
|
| 395 |
+
"execution_count": null,
|
| 396 |
+
"id": "ff7610d0-0487-418b-905e-969f4cd4f321",
|
| 397 |
+
"metadata": {},
|
| 398 |
+
"outputs": [],
|
| 399 |
+
"source": []
|
| 400 |
+
}
|
| 401 |
+
],
|
| 402 |
+
"metadata": {
|
| 403 |
+
"kernelspec": {
|
| 404 |
+
"display_name": "Python 3 (ipykernel)",
|
| 405 |
+
"language": "python",
|
| 406 |
+
"name": "python3"
|
| 407 |
+
},
|
| 408 |
+
"language_info": {
|
| 409 |
+
"codemirror_mode": {
|
| 410 |
+
"name": "ipython",
|
| 411 |
+
"version": 3
|
| 412 |
+
},
|
| 413 |
+
"file_extension": ".py",
|
| 414 |
+
"mimetype": "text/x-python",
|
| 415 |
+
"name": "python",
|
| 416 |
+
"nbconvert_exporter": "python",
|
| 417 |
+
"pygments_lexer": "ipython3",
|
| 418 |
+
"version": "3.12.3"
|
| 419 |
+
}
|
| 420 |
+
},
|
| 421 |
+
"nbformat": 4,
|
| 422 |
+
"nbformat_minor": 5
|
| 423 |
+
}
|
best_model/vect_sim_protein_test.ipynb
ADDED
|
@@ -0,0 +1,423 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "c0314d29-7fc8-4c11-8bfc-5440a442629a",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"name": "stdout",
|
| 11 |
+
"output_type": "stream",
|
| 12 |
+
"text": [
|
| 13 |
+
"https://hf-mirror.com\n"
|
| 14 |
+
]
|
| 15 |
+
}
|
| 16 |
+
],
|
| 17 |
+
"source": [
|
| 18 |
+
"# import subprocess\n",
|
| 19 |
+
"# import os\n",
|
| 20 |
+
"\n",
|
| 21 |
+
"# result = subprocess.run('bash -c \"source /etc/network_turbo && env | grep proxy\"', shell=True, capture_output=True, text=True)\n",
|
| 22 |
+
"# output = result.stdout\n",
|
| 23 |
+
"# for line in output.splitlines():\n",
|
| 24 |
+
"# if '=' in line:\n",
|
| 25 |
+
"# var, value = line.split('=', 1)\n",
|
| 26 |
+
"# os.environ[var] = value\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"import os\n",
|
| 30 |
+
"\n",
|
| 31 |
+
"# 设置环境变量\n",
|
| 32 |
+
"os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"# 打印环境变量以确认设置成功\n",
|
| 35 |
+
"print(os.environ.get('HF_ENDPOINT'))"
|
| 36 |
+
]
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"cell_type": "code",
|
| 40 |
+
"execution_count": 2,
|
| 41 |
+
"id": "1a09a2f5-dda6-4d86-badd-60bf2fda3983",
|
| 42 |
+
"metadata": {},
|
| 43 |
+
"outputs": [
|
| 44 |
+
{
|
| 45 |
+
"name": "stderr",
|
| 46 |
+
"output_type": "stream",
|
| 47 |
+
"text": [
|
| 48 |
+
"2025-02-09 17:52:09.693182: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
| 49 |
+
"2025-02-09 17:52:09.706600: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
| 50 |
+
"2025-02-09 17:52:09.722220: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
| 51 |
+
"2025-02-09 17:52:09.726994: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
| 52 |
+
"2025-02-09 17:52:09.739072: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
| 53 |
+
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI AVX512_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
| 54 |
+
"2025-02-09 17:52:10.723436: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
|
| 55 |
+
]
|
| 56 |
+
}
|
| 57 |
+
],
|
| 58 |
+
"source": [
|
| 59 |
+
"from transformers import GPT2Tokenizer, GPT2Model,AutoModel\n",
|
| 60 |
+
"import torch\n",
|
| 61 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 62 |
+
"from datasets import load_dataset\n",
|
| 63 |
+
"from transformers import AutoTokenizer, DataCollatorWithPadding\n",
|
| 64 |
+
"from transformers import Trainer\n",
|
| 65 |
+
"import evaluate\n",
|
| 66 |
+
"import numpy as np\n",
|
| 67 |
+
"from transformers import TrainingArguments\n",
|
| 68 |
+
"from transformers import AutoModelForSequenceClassification"
|
| 69 |
+
]
|
| 70 |
+
},
|
| 71 |
+
{
|
| 72 |
+
"cell_type": "code",
|
| 73 |
+
"execution_count": 3,
|
| 74 |
+
"id": "7c5ab8f5-b8a9-4930-ac30-49d0bf26d579",
|
| 75 |
+
"metadata": {},
|
| 76 |
+
"outputs": [],
|
| 77 |
+
"source": [
|
| 78 |
+
"model_name=\"gpt2_gene_multi_v1_ft\"\n",
|
| 79 |
+
"device=\"cuda\"\n",
|
| 80 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"gpt2_gene_multi_v1_ft\")\n",
|
| 81 |
+
"model = AutoModel.from_pretrained(model_name)\n",
|
| 82 |
+
"model.to(device)\n",
|
| 83 |
+
"\n",
|
| 84 |
+
"def get_text_embedding(text):\n",
|
| 85 |
+
" \"\"\"\n",
|
| 86 |
+
" 使用 GPT-2 模型获取文本的向量表示。\n",
|
| 87 |
+
" \n",
|
| 88 |
+
" 参数:\n",
|
| 89 |
+
" text (str): 输入文本。\n",
|
| 90 |
+
" model_name (str): 预训练 GPT-2 模型名称,默认为 \"gpt2\"。\n",
|
| 91 |
+
" device (str): 设备名称(\"cpu\" 或 \"cuda\")。\n",
|
| 92 |
+
" \n",
|
| 93 |
+
" 返回:\n",
|
| 94 |
+
" torch.Tensor: 文本的向量表示,维度为 [hidden_size]。\n",
|
| 95 |
+
" \"\"\"\n",
|
| 96 |
+
"\n",
|
| 97 |
+
" # 将文本编码为输入 ID 并添加批量维度\n",
|
| 98 |
+
" inputs = tokenizer(text, return_tensors=\"pt\", truncation=True, max_length=256)\n",
|
| 99 |
+
" input_ids = inputs[\"input_ids\"].to(device)\n",
|
| 100 |
+
" attention_mask = inputs[\"attention_mask\"].to(device)\n",
|
| 101 |
+
" \n",
|
| 102 |
+
" # 获取模型的隐藏层输出\n",
|
| 103 |
+
" with torch.no_grad():\n",
|
| 104 |
+
" outputs = model(input_ids, attention_mask=attention_mask)\n",
|
| 105 |
+
" hidden_states = outputs.last_hidden_state # [batch_size, seq_length, hidden_size]\n",
|
| 106 |
+
" \n",
|
| 107 |
+
" # 平均池化:获取序列中所有词向量的平均值\n",
|
| 108 |
+
" embeddings = hidden_states.mean(dim=1).squeeze() # [hidden_size]\n",
|
| 109 |
+
" \n",
|
| 110 |
+
" return embeddings"
|
| 111 |
+
]
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"cell_type": "code",
|
| 115 |
+
"execution_count": 4,
|
| 116 |
+
"id": "76ff7fed-fc17-421e-8a57-2a5de33d4ba6",
|
| 117 |
+
"metadata": {},
|
| 118 |
+
"outputs": [
|
| 119 |
+
{
|
| 120 |
+
"data": {
|
| 121 |
+
"text/plain": [
|
| 122 |
+
"0.3379075"
|
| 123 |
+
]
|
| 124 |
+
},
|
| 125 |
+
"execution_count": 4,
|
| 126 |
+
"metadata": {},
|
| 127 |
+
"output_type": "execute_result"
|
| 128 |
+
}
|
| 129 |
+
],
|
| 130 |
+
"source": [
|
| 131 |
+
"from sklearn.metrics.pairwise import cosine_similarity\n",
|
| 132 |
+
"\n",
|
| 133 |
+
"def get_sim_score(s1, s2):\n",
|
| 134 |
+
" v1 = get_text_embedding(s1)\n",
|
| 135 |
+
" v2 = get_text_embedding(s2)\n",
|
| 136 |
+
" \n",
|
| 137 |
+
" # 假设dna_embedding和protein_embedding为numpy数组\n",
|
| 138 |
+
" #similarity = cosine_similarity([v1.cpu().numpy()], [v2.cpu().numpy()])[0][0]\n",
|
| 139 |
+
" A = v1.cpu().numpy()\n",
|
| 140 |
+
" B = v2.cpu().numpy()\n",
|
| 141 |
+
" similarity = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))\n",
|
| 142 |
+
" #similarity = np.linalg.norm(A - B)\n",
|
| 143 |
+
" return similarity\n",
|
| 144 |
+
"\n",
|
| 145 |
+
"s1 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 146 |
+
"s2 = \"ATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\"\n",
|
| 147 |
+
"s1 = \"ATGTCTCTACAGATGATAACGGTCAGTAATAACGTAACTTTAATTCAACCAGGCTTCTCACTGATGAATTTTGATGGACAAGTTTTCTTCTTTGGTCAAAAAGGCTGGCCCAAGAGATCCTGCCCCACAGGAGTTTTCCATTTTGATGTAAAGCATAACCATCTCAAACTGAAGCCTACAGTTTTCTCAAAGGATTCCTGCTACCTTCCTCCTCTTCGCTATCCAGCCACTTGCATATTTAAAGGCAACTTCGAGTCTGAAAAGCATCAGTATATCATCCATGGAGGGAAAACACCAAACAATGAACTTTCAGATAAGATGTATGTCATGTCTATTGTTTGCAAAAACAACAAAAAATTTACTTTTCGCTGCACGGAGAAAGACTTGGTAGGTGATGTTCCTGAAGGCAGATATGGCCATTCCATTGATGTAGTGTATAGTCGAGGGAAAAGTATGGGCGTTCTCTTTGGAGGACGATCTTACATGCCTTCTGCCCAAAGAACCACAGAAAAATGGAACAGTGTAGTTGACTGCTTGCCCCATCTCTTCTTGGTGGATTTTGAATTTGGGTGTTCTACATCCTACATTCTTCCCGAACTTCAGGATGGGATATCTTTTCATGTCTCCATTGCCAGAAATGATACCATTTATATTTTAGGAGGTCATTCACTCACCAATAACATCCGCCCTGCCAATCTGTTCAGAGTAAGGGTTGATCTCCCCCTGGGTAGCCCAGCTGTGAGTTGCACGGTCTTATCAGGAGGAATCTCTGTCTCCAGTGCAATCTTGACTCAAACTAATAATGATGAATTTGTCATTGTTGGTGGCTATCAGCTTGAAAATCAAAAAAGAATGGTCTGCAACATTGTCACTTTAGATGACAACAAGATAGATATTCGTGAGATGGAGGCACCAGATTGGACCCCAGATATTAAGCACAGCAAGGTATGGTTTGGAAACAACATGGGAAATGGGAGTGTTTTCCTTGGAATACCAGGAGACAATAAGCAGGCTGTTTCAGAAGCATTCTATTTCTATATGTTGAAATGTGCTGAAGATGATATAAATGAAGATGAGAAAACATTGATGAACAGTCAGACATCAACAGAAGATCCAGGAGACTCCACACCCTTTGAAGACTCGGAAGAATTTTGCTTCAGTGCAGAAGCAAATAGTTTTGGTGGGGATGATGAATTTGACACCTATAATGAAGATGATGAGGAAGATGAGTCTGAGACAGGCTACTGGATTACGTGTTGCCTTACTTGTAATGTGGATATCAACACTTGGGTACCATTCTACTCAACTGAGCTCAACAAACCTGCTATGATCTACTGCTCTCATGAGGACGGGCACTGGGTCCATGCTCAGTGCATGGATCTGGCAGAGCGCACGCTCATCCATCTGTCAGAAGGAAGCAACAAGTATTATTGCAATGAGCATGTGGAGATAGCAAGAGCACTACAAACCCCCAAAAGAGCCATGCCCTTGAAAAAGCCCCCACTGAAATCCCTCCGCAAAAAAGGCCCTGCAAAAATCTTGACTCCTGCCAAGAAATCCTTCCTTAGAAGATTGTTTGAT\"\n",
|
| 148 |
+
"s2 = \"MSLQMITVSNNVTLIQPGFSLMNFDGQVFFFGQKGWPKRSCPTGVFHFDVKHNHLKLKPTVFSKDSCYLPPLRYPATCIFKGNFESEKHQYIIHGGKTPNNELSDKMYVMSIVCKNNKKFTFRCTEKDLVGDVPEGRYGHSIDVVYSRGKSMGVLFGGRSYMPSAQRTTEKWNSVVDCLPHLFLVDFEFGCSTSYILPELQDGISFHVSIARNDTIYILGGHSLTNNIRPANLFRVRVDLPLGSPAVSCTVLSGGISVSSAILTQTNNDEFVIVGGYQLENQKRMVCNIVTLDDNKIDIREMEAPDWTPDIKHSKVWFGNNMGNGSVFLGIPGDNKQAVSEAFYFYMLKCAEDDINEDEKTLMNSQTSTEDPGDSTPFEDSEEFCFSAEANSFGGDDEFDTYNEDDEEDESETGYWITCCLTCNVDINTWVPFYSTELNKPAMIYCSHEDGHWVHAQCMDLAERTLIHLSEGSNKYYCNEHVEIARALQTPKRAMPLKKPPLKSLRKKGPAKILTPAKKSFLRRLFD\"\n",
|
| 149 |
+
"get_sim_score(s1, s2)"
|
| 150 |
+
]
|
| 151 |
+
},
|
| 152 |
+
{
|
| 153 |
+
"cell_type": "code",
|
| 154 |
+
"execution_count": 5,
|
| 155 |
+
"id": "2116f787-781f-4bfc-b12d-c36efe26cfa9",
|
| 156 |
+
"metadata": {},
|
| 157 |
+
"outputs": [
|
| 158 |
+
{
|
| 159 |
+
"data": {
|
| 160 |
+
"text/plain": [
|
| 161 |
+
"DatasetDict({\n",
|
| 162 |
+
" train: Dataset({\n",
|
| 163 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 164 |
+
" num_rows: 2000\n",
|
| 165 |
+
" })\n",
|
| 166 |
+
" test: Dataset({\n",
|
| 167 |
+
" features: ['sentence1', 'sentence2', 'label'],\n",
|
| 168 |
+
" num_rows: 2000\n",
|
| 169 |
+
" })\n",
|
| 170 |
+
"})"
|
| 171 |
+
]
|
| 172 |
+
},
|
| 173 |
+
"execution_count": 5,
|
| 174 |
+
"metadata": {},
|
| 175 |
+
"output_type": "execute_result"
|
| 176 |
+
}
|
| 177 |
+
],
|
| 178 |
+
"source": [
|
| 179 |
+
"#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似\n",
|
| 180 |
+
"raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.5) #默认已经shuffle\n",
|
| 181 |
+
"raw_datasets_dna_protein"
|
| 182 |
+
]
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"cell_type": "code",
|
| 186 |
+
"execution_count": 6,
|
| 187 |
+
"id": "6e6b1d3d-3d05-40b0-a96a-537a4dc324d6",
|
| 188 |
+
"metadata": {},
|
| 189 |
+
"outputs": [],
|
| 190 |
+
"source": [
|
| 191 |
+
"sim_score = []\n",
|
| 192 |
+
"dif_score = []\n",
|
| 193 |
+
"\n",
|
| 194 |
+
"for item in raw_datasets_dna_protein[\"train\"]:\n",
|
| 195 |
+
" #print(item)\n",
|
| 196 |
+
" sentence1 = item[\"sentence1\"]\n",
|
| 197 |
+
" sentence2 = item[\"sentence2\"]\n",
|
| 198 |
+
" label = item[\"label\"]\n",
|
| 199 |
+
" score = get_sim_score(sentence1, sentence2)\n",
|
| 200 |
+
"\n",
|
| 201 |
+
" if 1 == label:\n",
|
| 202 |
+
" sim_score.append(score)\n",
|
| 203 |
+
" else:\n",
|
| 204 |
+
" dif_score.append(score)"
|
| 205 |
+
]
|
| 206 |
+
},
|
| 207 |
+
{
|
| 208 |
+
"cell_type": "code",
|
| 209 |
+
"execution_count": 7,
|
| 210 |
+
"id": "a515f319-254b-4675-9ca5-fb15da6a62e5",
|
| 211 |
+
"metadata": {},
|
| 212 |
+
"outputs": [
|
| 213 |
+
{
|
| 214 |
+
"name": "stdout",
|
| 215 |
+
"output_type": "stream",
|
| 216 |
+
"text": [
|
| 217 |
+
"0.34443858 0.3725082\n"
|
| 218 |
+
]
|
| 219 |
+
}
|
| 220 |
+
],
|
| 221 |
+
"source": [
|
| 222 |
+
"import numpy as np\n",
|
| 223 |
+
"print(np.mean(sim_score), np.mean(dif_score))"
|
| 224 |
+
]
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"cell_type": "code",
|
| 228 |
+
"execution_count": 8,
|
| 229 |
+
"id": "4417c7b5-8019-4a53-968a-4dee311acef3",
|
| 230 |
+
"metadata": {},
|
| 231 |
+
"outputs": [
|
| 232 |
+
{
|
| 233 |
+
"name": "stdout",
|
| 234 |
+
"output_type": "stream",
|
| 235 |
+
"text": [
|
| 236 |
+
"983 1017\n"
|
| 237 |
+
]
|
| 238 |
+
}
|
| 239 |
+
],
|
| 240 |
+
"source": [
|
| 241 |
+
"print(len(sim_score),len(dif_score))"
|
| 242 |
+
]
|
| 243 |
+
},
|
| 244 |
+
{
|
| 245 |
+
"cell_type": "code",
|
| 246 |
+
"execution_count": 9,
|
| 247 |
+
"id": "adc022c4-7bec-4381-b80b-6ac1b18be00c",
|
| 248 |
+
"metadata": {},
|
| 249 |
+
"outputs": [
|
| 250 |
+
{
|
| 251 |
+
"name": "stderr",
|
| 252 |
+
"output_type": "stream",
|
| 253 |
+
"text": [
|
| 254 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 39057 (\\N{CJK UNIFIED IDEOGRAPH-9891}) missing from font(s) DejaVu Sans.\n",
|
| 255 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 256 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
|
| 257 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 258 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans.\n",
|
| 259 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 260 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.\n",
|
| 261 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 262 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24067 (\\N{CJK UNIFIED IDEOGRAPH-5E03}) missing from font(s) DejaVu Sans.\n",
|
| 263 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 264 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 30452 (\\N{CJK UNIFIED IDEOGRAPH-76F4}) missing from font(s) DejaVu Sans.\n",
|
| 265 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 266 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.\n",
|
| 267 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 268 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22270 (\\N{CJK UNIFIED IDEOGRAPH-56FE}) missing from font(s) DejaVu Sans.\n",
|
| 269 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 270 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21306 (\\N{CJK UNIFIED IDEOGRAPH-533A}) missing from font(s) DejaVu Sans.\n",
|
| 271 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 272 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.\n",
|
| 273 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n"
|
| 274 |
+
]
|
| 275 |
+
},
|
| 276 |
+
{
|
| 277 |
+
"data": {
|
| 278 |
+
"image/png": "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JUm2bWv16tV6+umn1dDQoIULF+rxxx/XtGnTEtw5cObw+Xy6btkNqm9q6beurbVFh2qOaFIwGKfOAABnmqQKu8ePH9fChQt12WWX6fe//71yc3P1t7/9TWPHjnVq1q9fr0ceeUTPP/+8iouLdeedd2rRokX661//qvT09AR2D5w5/H6/6ptalFuyWBk5+X3WHf1gj6qqn1U4RNgFAAyPpAq7DzzwgIqKirRp0yZnrbi42Plv27a1YcMG3XHHHbryyislSS+88ILy8/P16quv6tprr417z8CZLCMnX968wj6fbz5WG8duAABnoqQKu7/+9a+1aNEiffWrX9Xrr7+us846SzfffLOWL18uSaqsrFRtba1KS0ud12RlZemiiy5SWVlZn2E3EAgoEAg4jzvPMwyFQgqFOs4ndLlccrlcikQiikQiTm3nejgclm3bA6673W5ZluVst+u6JIXD4ajWPR6PbNvutm5Zltxu92k99rXOTMw0XDNFIhF5PB65rJPPy5ZLp3qJyJItSy5LSk1JkduS3IqcWpctq0e9JKV4PE6tJIVlSbKcxz11rT1VL7lPbtvjspSaknLyWdtZ73hkKSLL6b2z1j3EM3V+3Tr3C997zMRMzMRM0c3Us74vSRV2Dxw4oMcff1yrVq3S7bffrrffflvf/e53lZqaqqVLl6q2tuMoUX5+9382zc/Pd57rzbp167RmzZrT1svLy5WRkSFJys3N1dSpU1VZWSmfz+fUFBYWqrCwUPv371djY6OzPmXKFOXl5WnPnj1qbW111qdPn67s7GyVl5d323kzZ85UamqqduzY0a2HuXPnqr29Xbt373bW3G635s2bp8bGRu3bt89ZHzVqlGbNmqWPPvpIBw4ccNazsrI0Y8YMHT58WIcOHXLWmYmZhmumlpYWXX3FIrVlWTooqSClVWelnurFF0pTZWCMzs/P0LzlS5UzOV1po46rpn2UaoKjNS29SVnuU6c2VAYyVCPpG1+9StPO7qiVpIq2TDWGUzU7o6FbUD2e6lZqSoou71IrSTtPjFWqFdEFozu+Xm3njtUF3/qGdkvKcgd1XnqTU9sacevd1myN9wRUnHZCbeeO1ZzlS2XnperQEM3UKOnzn71E1dXVOnbsWNz3UyeTvveYiZmY6cyZqby8XNGw7K7ReoRLTU3V3LlztW3bNmftu9/9rt5++22V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6a677lJtba1mz56tLVu2KD+//zc3wPBJS0vT6tWr+32XICQP9qd52KdmYX+ahf358Vi2/THvXQEAAACMUMadswsAAAB0IuwCAADAWIRdAAAAGIuwCwAAAGMRdjFkNm7cqLPPPlvp6em66KKL9NZbb/VZ+/TTT+vTn/60xo4dq7Fjx6q0tLTfesRfLPvzP//zPzV37lxlZ2crIyNDs2fP1n/8x3/EsVtEI5Z92tVLL70ky7J01VVXDW+DiEks+/O5556TZVndPtLT0+PYLQYS689nQ0ODVqxYoYkTJyotLU3nnnuufve738Wp2+RC2MWQePnll7Vq1SqtXr1a77zzjmbNmqVFixbp6NGjvdb/+c9/1te//nX96U9/UllZmYqKivSFL3xBNTU1ce4cvYl1f+bk5Ojf/u3fVFZWpt27d2vZsmVatmyZXnvttTh3jr7Euk87HTx4UP/6r/+qT3/603HqFNEYzP70er06cuSI81FVVRXHjtGfWPdne3u7Pv/5z+vgwYP65S9/qYqKCj399NM666yz4tx5krCBITB//nx7xYoVzuNwOGwXFBTY69ati+r1oVDIzszMtJ9//vnhahEx+Lj707Zt+1Of+pR9xx13DEd7GITB7NNQKGRffPHF9jPPPGMvXbrUvvLKK+PQKaIR6/7ctGmTnZWVFafuEKtY9+fjjz9uT5kyxW5vb49Xi0mNI7v42Nrb27Vz506VlpY6ay6XS6WlpSorK4tqGy0tLQoGg8rJyRmuNhGlj7s/bdvW1q1bVVFRoc985jPD2SqiNNh9unbtWuXl5en666+PR5uI0mD3Z3NzsyZPnqyioiJdeeWV2rt3bzzaxQAGsz9//etfq6SkRCtWrFB+fr4++clP6r777lM4HI5X20nFyHdQQ3x99NFHCofDp71DXX5+vvbt2xfVNm677TYVFBR0+2FHYgx2fzY2Nuqss85SIBCQ2+3WY489ps9//vPD3S6iMJh9+sYbb+inP/2pdu3aFYcOEYvB7M/zzjtPzz77rGbOnKnGxkY9+OCDuvjii7V3714VFhbGo230YTD788CBA/rjH/+oJUuW6He/+53ef/993XzzzQoGg1q9enU82k4qhF0k3P3336+XXnpJf/7zn7lgIollZmZq165dam5u1tatW7Vq1SpNmTJFl156aaJbQ4yampr0zW9+U08//bTGjx+f6HYwBEpKSlRSUuI8vvjiizVjxgw9+eSTuueeexLYGQYjEokoLy9PTz31lNxut+bMmaOamhr95Cc/Iez2grCLj238+PFyu92qq6vrtl5XV6cJEyb0+9oHH3xQ999/v/7nf/5HM2fOHM42EaXB7k+Xy6VzzjlHkjR79my99957WrduHWF3BIh1n37wwQc6ePCgvvKVrzhrkUhEkuTxeFRRUaGpU6cOb9Po08f5ndspJSVFn/rUp/T+++8PR4uIwWD258SJE5WSkiK32+2szZgxQ7W1tWpvb1dqauqw9pxsOGcXH1tqaqrmzJmjrVu3OmuRSERbt27tdiShp/Xr1+uee+7Rli1bNHfu3Hi0iigMdn/2FIlEFAgEhqNFxCjWfTp9+nS9++672rVrl/Px93//97rsssu0a9cuFRUVxbN99DAUP6PhcFjvvvuuJk6cOFxtIkqD2Z8LFy7U+++/7/wRKkn79+/XxIkTCbq9SfQVcjDDSy+9ZKelpdnPPfec/de//tW+8cYb7ezsbLu2tta2bdv+5je/af/whz906u+//347NTXV/uUvf2kfOXLE+WhqakrUCOgi1v1533332f/93/9tf/DBB/Zf//pX+8EHH7Q9Ho/99NNPJ2oE9BDrPu2JuzGMLLHuzzVr1tivvfaa/cEHH9g7d+60r732Wjs9Pd3eu3dvokZAF7Huzw8//NDOzMy0b7nlFruiosL+7W9/a+fl5dn33ntvokYY0TiNAUPia1/7mnw+n+666y7V1tZq9uzZ2rJli3PC/YcffiiX69Q/JDz++ONqb2/XP/7jP3bbzurVq3X33XfHs3X0Itb9eeLECd188806dOiQRo0apenTp+vFF1/U1772tUSNgB5i3acY2WLdn8ePH9fy5ctVW1ursWPHas6cOdq2bZvOP//8RI2ALmLdn0VFRXrttdd06623aubMmTrrrLP0ve99T7fddluiRhjRLNu27UQ3AQAAAAwH/owHAACAsQi7AAAAMBZhFwAAAMYi7AIAAMBYhF0AAAAYi7ALAAAAYxF2AQAAYCzCLgAAAIxF2AUAAICxCLsAAAAwlifRDQAAerd371596lOfUmpqaq/Pt7e3q7y8fMCa9957T21tbUNaN3Xq1MENBQBxRtgFgBHKtm3Nnz9fb7zxRq/PL1iwIOqaoa4DgGTBaQwAAAAwFmEXAAAAxiLsAgAAwFiEXQAAABiLsAsAAABjEXYBAABgLMIuAAAAjEXYBQAAgLEIuwAAADAWYRcAAADGIuwCAADAWIRdAAAAGMuT6AYAAH178803lZ2d3etzzc3NUdcMRx0AJAPLtm070U0AAAAAw4HTGAAAAGAswi4AAACMRdgFAACAsQi7AAAAMBZhFwAAAMYi7AIAAMBYhF0AAAAYi7ALAAAAYxF2AQAAYKz/D0x6WSjiTaWQAAAAAElFTkSuQmCC",
|
| 279 |
+
"text/plain": [
|
| 280 |
+
"<Figure size 800x600 with 1 Axes>"
|
| 281 |
+
]
|
| 282 |
+
},
|
| 283 |
+
"metadata": {},
|
| 284 |
+
"output_type": "display_data"
|
| 285 |
+
}
|
| 286 |
+
],
|
| 287 |
+
"source": [
|
| 288 |
+
"import matplotlib.pyplot as plt\n",
|
| 289 |
+
"import numpy as np\n",
|
| 290 |
+
"\n",
|
| 291 |
+
"# 示例数据(Python list,float 类型)\n",
|
| 292 |
+
"#data = np.random.normal(loc=50, scale=15, size=200) # 生成200个服从正态分布的随机数\n",
|
| 293 |
+
"data = sim_score\n",
|
| 294 |
+
"\n",
|
| 295 |
+
"# 计算直方图并自动确定分区数\n",
|
| 296 |
+
"plt.figure(figsize=(8, 6)) # 设置图像大小\n",
|
| 297 |
+
"plt.hist(data, bins='auto', edgecolor='black', alpha=0.7)\n",
|
| 298 |
+
"\n",
|
| 299 |
+
"# 添加标题和标签\n",
|
| 300 |
+
"plt.xlabel('数值区间', fontsize=12)\n",
|
| 301 |
+
"plt.ylabel('频数', fontsize=12)\n",
|
| 302 |
+
"plt.title('数值分布直方图', fontsize=14)\n",
|
| 303 |
+
"\n",
|
| 304 |
+
"# 显示网格\n",
|
| 305 |
+
"plt.grid(axis='y', linestyle='--', alpha=0.7)\n",
|
| 306 |
+
"\n",
|
| 307 |
+
"# 显示直方图\n",
|
| 308 |
+
"plt.show()"
|
| 309 |
+
]
|
| 310 |
+
},
|
| 311 |
+
{
|
| 312 |
+
"cell_type": "code",
|
| 313 |
+
"execution_count": 10,
|
| 314 |
+
"id": "71ff0b65-1ced-49de-8bf3-60c9715916db",
|
| 315 |
+
"metadata": {},
|
| 316 |
+
"outputs": [
|
| 317 |
+
{
|
| 318 |
+
"data": {
|
| 319 |
+
"image/png": "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fLtgAAPffffdp+eff16vv/76SfMkCtMMGTJE7777rlpaWrR69WotWLBAY8aM0cUXX5zuraEXmpub9Y1vfEOPP/64hg0blu7toI+mT5+u6dOnRz+/4IILNGHCBP3qV7/S3XffncadnXiEXWSUYcOGyel0qqmpKa7e1NTEk88GmL4cywcffFD33Xef/v73v2vixIkncpvohWSPpcPh0Cc+8QlJ0uTJk/X+++9ryZIlhN00SfQ4btu2TTt27NAVV1wRrYXDYUmSy+VSbW2txo4de2I3jW6l4t/KrKwsnX322frwww9PxBYzCg9jQEbJzs7Wueeeq9WrV0dr4XBYq1evjvuNFJkv2WP5wAMP6O6779aqVas0ZcqU/tgqjiNV98twOCy/338itoheSPQ4jh8/Xu+9957efffd6McXv/hFXXLJJXr33Xc1cuTI/tw+YqTiPhkKhfTee+9pxIgRJ2qbmSPdz5ADjvb888/bOTk59lNPPWX/61//sufNm2cXFhbajY2Ntm3b9je+8Q37tttui673+/12TU2NXVNTY48YMcL+4Q9/aNfU1NgffPBBukbAYYkey/vuu8/Ozs62//u//9ves2dP9KO5uTldI+CwRI/lvffea//v//6vvW3bNvtf//qX/eCDD9oul8t+/PHH0zUC7MSP49F4NYbMkeixXLRokf23v/3N3rZtm71+/Xr72muvtXNzc+3Nmzena4R+w8MYkHG++tWvyuPx6M4771RjY6MmT56sVatWRR+I/9FHH8nhOPJHiYaGBp199tnRzx988EE9+OCDuuiii/T666/39/YRI9Fj+dhjj6mzs1Nf/vKX4/osXLhQd911V39uHUdJ9Fi2trbqu9/9rnbt2qW8vDyNHz9ezz77rL761a+mawQo8eOIzJXosTx48KDmzp2rxsZGDR06VOeee67WrFmjT37yk+kaod9Ytm3b6d4EAAAAcCLw6xsAAACMRdgFAACAsQi7AAAAMBZhFwAAAMYi7AIAAMBYhF0AAAAYi7ALAAAAYxF2AQAAYCzCLgAAAIxF2AUAAICxXOneAACge5s3b9bZZ5+t7Ozsbr/e2dmpmpqa4655//331dHRkdJ1Y8eOTW4oAOhnhF0AyFC2bWvatGl66623uv36+eef3+s1qV4HAAMFD2MAAACAsQi7AAAAMBZhFwAAAMYi7AIAAMBYhF0AAAAYi7ALAAAAYxF2AQAAYCzCLgAAAIxF2AUAAICxCLsAAAAwFmEXAAAAxiLsAgAAwFiudG8AANCzt99+W4WFhd1+raWlpddrTsQ6ABgILNu27XRvAgAAADgReBgDAAAAjEXYBQAAgLEIuwAAADAWYRcAAADGIuwCAADAWIRdAAAAGIuwCwAAAGMRdgEAAGAswi4AAACM9f8BxjYtnP/RFw8AAAAASUVORK5CYII=",
|
| 320 |
+
"text/plain": [
|
| 321 |
+
"<Figure size 800x600 with 1 Axes>"
|
| 322 |
+
]
|
| 323 |
+
},
|
| 324 |
+
"metadata": {},
|
| 325 |
+
"output_type": "display_data"
|
| 326 |
+
}
|
| 327 |
+
],
|
| 328 |
+
"source": [
|
| 329 |
+
"import matplotlib.pyplot as plt\n",
|
| 330 |
+
"import numpy as np\n",
|
| 331 |
+
"\n",
|
| 332 |
+
"# 示例数据(Python list,float 类型)\n",
|
| 333 |
+
"#data = np.random.normal(loc=50, scale=15, size=200) # 生成200个服从正态分布的随机数\n",
|
| 334 |
+
"data = dif_score\n",
|
| 335 |
+
"\n",
|
| 336 |
+
"# 计算直方图并自动确定分区数\n",
|
| 337 |
+
"plt.figure(figsize=(8, 6)) # 设置图像大小\n",
|
| 338 |
+
"plt.hist(data, bins='auto', edgecolor='black', alpha=0.7)\n",
|
| 339 |
+
"\n",
|
| 340 |
+
"# 添加标题和标签\n",
|
| 341 |
+
"plt.xlabel('数值区间', fontsize=12)\n",
|
| 342 |
+
"plt.ylabel('频数', fontsize=12)\n",
|
| 343 |
+
"plt.title('数值分布直方图', fontsize=14)\n",
|
| 344 |
+
"\n",
|
| 345 |
+
"# 显示网格\n",
|
| 346 |
+
"plt.grid(axis='y', linestyle='--', alpha=0.7)\n",
|
| 347 |
+
"\n",
|
| 348 |
+
"# 显示直方图\n",
|
| 349 |
+
"plt.show()"
|
| 350 |
+
]
|
| 351 |
+
},
|
| 352 |
+
{
|
| 353 |
+
"cell_type": "code",
|
| 354 |
+
"execution_count": 11,
|
| 355 |
+
"id": "f314d408-18ff-4e59-92bd-eb7a767ca262",
|
| 356 |
+
"metadata": {},
|
| 357 |
+
"outputs": [
|
| 358 |
+
{
|
| 359 |
+
"data": {
|
| 360 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABVV0lEQVR4nO3deVxU9f4/8NewDYwMg8MiUCjuWiouqbmv5ZKmaYuWC2qZXS2XrL5U5kJX1NLMpaxugZlmWWbdFstdS7NcUTRUXFCBUVCG5TALM+f3hz/mNrHMMAwzw+H1fDzOI+aczznnfQ4YL875fM6RiaIogoiIiEiivNxdABEREVFNYtghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CEiIiJJY9ghIiIiSWPYISIiIklj2CFyspiYGMTFxbm7DMl766230KRJE3h7e6N9+/buLoeIPBjDDlElkpOTIZPJcOTIkXKX9+3bF23atKn2fn788UcsWLCg2tupK3755Re8/PLL6NGjB5KSkrB48eIybfbu3QuZTGbX5EqXL1+22revry9CQ0PRvXt3vPrqq8jIyHB425mZmViwYAFOnDjhvIL/v8uXL2PSpElo2rQp/P39ERERgd69e2P+/PkObY8/8+RKPu4ugEhq0tLS4OVVtb8jfvzxR6xdu5b/87fT7t274eXlhY8//hh+fn7ltmndujU2bNhgNS8+Ph6BgYF47bXXXFFmpcaOHYuhQ4fCbDbj9u3b+PPPP7Fy5Uq8++67+PjjjzFmzJgqbzMzMxMLFy5ETEyMU692XbhwAZ07d0ZAQAAmT56MmJgYZGVl4dixY1i6dCkWLlxY5W3yZ55ciWGHyMnkcrm7S6iyoqIi1KtXz91l2O3GjRsICAioMOgAQIMGDTBu3DireUuWLEFoaGiZ+e7QsWPHMnVcuXIFDz74ICZOnIjWrVsjNjbWTdVZe+edd1BYWIgTJ06gUaNGVstu3LjhpqqI7MfbWERO9s8+O0ajEQsXLkTz5s3h7++PkJAQ9OzZEzt27AAAxMXFYe3atQBQ7q2VoqIivPjii4iOjoZcLkfLli3x9ttvQxRFq/0WFxfjhRdeQGhoKJRKJR5++GFcv34dMpnM6q/nBQsWQCaT4cyZM3jyySdRv3599OzZEwCQkpKCuLg4NGnSxHKrYvLkycjNzbXaV+k2zp07h3HjxkGlUiEsLAzz5s2DKIq4evUqRowYgaCgIERERGD58uV2nbuSkhIkJCSgadOmkMvliImJwauvvgq9Xm9pI5PJkJSUhKKiIsu5Sk5Otmv7fyeKIkJDQzFnzhzLPLPZjODgYHh7eyMvL88yf+nSpfDx8UFhYaFl3u7du9GrVy/Uq1cPwcHBGDFiBM6ePVvlOv6uUaNGSE5OhsFgwLJlyyzzb926hblz56Jt27YIDAxEUFAQhgwZgpMnT1ra7N27F507dwYATJo0qcy5OXDgAB577DE0bNgQcrkc0dHRmD17NoqLi23WlZ6ejrvvvrtM0AGA8PDwMvN++ukny7lRKpV46KGHkJqaallu62d+8+bN6NSpE5RKJYKCgtC2bVu8++67Nuskqgiv7BDZQavVIicnp8x8o9Foc90FCxYgMTERTz/9NLp06YL8/HwcOXIEx44dwwMPPIBnn30WmZmZ2LFjR5nbLqIo4uGHH8aePXswZcoUtG/fHj///DNeeuklXL9+He+8846lbVxcHL788kuMHz8e999/P/bt24eHHnqowroee+wxNG/eHIsXL7YEpx07duDixYuYNGkSIiIikJqaig8//BCpqan4/fffy/RveeKJJ9C6dWssWbIEP/zwA958802o1Wp88MEH6N+/P5YuXYqNGzdi7ty56Ny5M3r37l3puXr66aexfv16PProo3jxxRdx+PBhJCYm4uzZs/jmm28AABs2bMCHH36IP/74A//5z38AAN27d7f5ffgnmUyGHj16YP/+/ZZ5KSkp0Gq18PLywm+//WY5fwcOHECHDh0QGBgIANi5cyeGDBmCJk2aYMGCBSguLsbq1avRo0cPHDt2DDExMVWup1S3bt3QtGlTSxgGgIsXL2Lbtm147LHH0LhxY2g0GnzwwQfo06cPzpw5g6ioKLRu3RqLFi3CG2+8galTp6JXr15W52bLli0QBAHPPfccQkJC8Mcff2D16tW4du0atmzZUmlNjRo1ws6dO7F7927079+/0rYbNmzAxIkTMWjQICxduhSCIOD9999Hz549cfz4ccTExFT6M79jxw6MHTsWAwYMwNKlSwEAZ8+exW+//YaZM2dW+XwSAQBEIqpQUlKSCKDS6d5777Vap1GjRuLEiRMtn2NjY8WHHnqo0v1Mnz5dLO+f47Zt20QA4ptvvmk1/9FH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",
|
| 361 |
+
"text/plain": [
|
| 362 |
+
"<Figure size 640x480 with 1 Axes>"
|
| 363 |
+
]
|
| 364 |
+
},
|
| 365 |
+
"metadata": {},
|
| 366 |
+
"output_type": "display_data"
|
| 367 |
+
}
|
| 368 |
+
],
|
| 369 |
+
"source": [
|
| 370 |
+
"import matplotlib.pyplot as plt\n",
|
| 371 |
+
"import numpy as np\n",
|
| 372 |
+
"\n",
|
| 373 |
+
"# 示例数据\n",
|
| 374 |
+
"data1 = sim_score # 生成 1000 个符合正态分布的随机数\n",
|
| 375 |
+
"data2 = dif_score # 生成 1000 个偏移的随机数\n",
|
| 376 |
+
"\n",
|
| 377 |
+
"# 绘制直方图\n",
|
| 378 |
+
"plt.hist(data1, bins=30, alpha=0.5, label='Data 1', color='blue', edgecolor='black')\n",
|
| 379 |
+
"plt.hist(data2, bins=30, alpha=0.5, label='Data 2', color='red', edgecolor='black')\n",
|
| 380 |
+
"\n",
|
| 381 |
+
"# 添加图例\n",
|
| 382 |
+
"plt.legend()\n",
|
| 383 |
+
"\n",
|
| 384 |
+
"# 添加标题和标签\n",
|
| 385 |
+
"plt.title('Histogram of Two Data Sets')\n",
|
| 386 |
+
"plt.xlabel('Value')\n",
|
| 387 |
+
"plt.ylabel('Frequency')\n",
|
| 388 |
+
"\n",
|
| 389 |
+
"# 显示图形\n",
|
| 390 |
+
"plt.show()\n"
|
| 391 |
+
]
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"cell_type": "code",
|
| 395 |
+
"execution_count": null,
|
| 396 |
+
"id": "ff7610d0-0487-418b-905e-969f4cd4f321",
|
| 397 |
+
"metadata": {},
|
| 398 |
+
"outputs": [],
|
| 399 |
+
"source": []
|
| 400 |
+
}
|
| 401 |
+
],
|
| 402 |
+
"metadata": {
|
| 403 |
+
"kernelspec": {
|
| 404 |
+
"display_name": "Python 3 (ipykernel)",
|
| 405 |
+
"language": "python",
|
| 406 |
+
"name": "python3"
|
| 407 |
+
},
|
| 408 |
+
"language_info": {
|
| 409 |
+
"codemirror_mode": {
|
| 410 |
+
"name": "ipython",
|
| 411 |
+
"version": 3
|
| 412 |
+
},
|
| 413 |
+
"file_extension": ".py",
|
| 414 |
+
"mimetype": "text/x-python",
|
| 415 |
+
"name": "python",
|
| 416 |
+
"nbconvert_exporter": "python",
|
| 417 |
+
"pygments_lexer": "ipython3",
|
| 418 |
+
"version": "3.12.3"
|
| 419 |
+
}
|
| 420 |
+
},
|
| 421 |
+
"nbformat": 4,
|
| 422 |
+
"nbformat_minor": 5
|
| 423 |
+
}
|
finetune/2-gpt2-gene-multi-v2-instruction-ft.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
finetune/get_acc_stat_multiv1.ipynb
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv1_ft_en.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 10,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"en: 0.899\n",
|
| 39 |
+
"fr: 0.8245\n",
|
| 40 |
+
"de: 0.79\n",
|
| 41 |
+
"zh: 0.7395\n",
|
| 42 |
+
"dna_sim_pair_simple_150bp: 0.955\n",
|
| 43 |
+
"dna_sim_pair_150bp: 0.86975\n",
|
| 44 |
+
"dna_sim_pair_50bp: 0.8185\n",
|
| 45 |
+
"protein_sim_pair_150bp: 0.9738888888888889\n",
|
| 46 |
+
"protein_sim_pair_450bp: 0.975\n",
|
| 47 |
+
"dna_protein_pair: 0.5575\n",
|
| 48 |
+
"dna_protein_pair_100: 0.5725\n",
|
| 49 |
+
"dna_protein_pair_full: 0.7324999999999999\n",
|
| 50 |
+
"dna_protein_pair_rand: 0.6\n",
|
| 51 |
+
"dna_protein_pair_rand_100: 0.60375\n",
|
| 52 |
+
"dna_protein_pair_rand_full: 0.61125\n"
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
],
|
| 56 |
+
"source": [
|
| 57 |
+
"# 假设您的数据存储在一个名为data_list的列表中\n",
|
| 58 |
+
"# 初始化一个字典来保存每个键的最大accuracy值\n",
|
| 59 |
+
"max_accuracies = {}\n",
|
| 60 |
+
"\n",
|
| 61 |
+
"dna_protein_pair_full_list = []\n",
|
| 62 |
+
"\n",
|
| 63 |
+
"\n",
|
| 64 |
+
"# 遍历列表中的每个字典\n",
|
| 65 |
+
"for data in data_list:\n",
|
| 66 |
+
" for key, metrics in data.items():\n",
|
| 67 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 68 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 69 |
+
" accuracy = metrics['accuracy']\n",
|
| 70 |
+
" if accuracy<0.5:\n",
|
| 71 |
+
" accuracy = 1-accuracy\n",
|
| 72 |
+
"\n",
|
| 73 |
+
" if key==\"dna_protein_pair_full\":\n",
|
| 74 |
+
" dna_protein_pair_full_list.append(accuracy)\n",
|
| 75 |
+
" \n",
|
| 76 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 77 |
+
" max_accuracies[key] = accuracy\n",
|
| 78 |
+
"\n",
|
| 79 |
+
"# 打印每个键的最大accuracy值\n",
|
| 80 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 81 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 82 |
+
]
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
"cell_type": "code",
|
| 86 |
+
"execution_count": 9,
|
| 87 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 88 |
+
"metadata": {},
|
| 89 |
+
"outputs": [
|
| 90 |
+
{
|
| 91 |
+
"data": {
|
| 92 |
+
"text/plain": [
|
| 93 |
+
"[0.505,\n",
|
| 94 |
+
" 0.4975,\n",
|
| 95 |
+
" 0.575,\n",
|
| 96 |
+
" 0.5025,\n",
|
| 97 |
+
" 0.45,\n",
|
| 98 |
+
" 0.4775,\n",
|
| 99 |
+
" 0.515,\n",
|
| 100 |
+
" 0.505,\n",
|
| 101 |
+
" 0.475,\n",
|
| 102 |
+
" 0.515,\n",
|
| 103 |
+
" 0.5675,\n",
|
| 104 |
+
" 0.4275,\n",
|
| 105 |
+
" 0.4875,\n",
|
| 106 |
+
" 0.5125,\n",
|
| 107 |
+
" 0.505,\n",
|
| 108 |
+
" 0.5025,\n",
|
| 109 |
+
" 0.53,\n",
|
| 110 |
+
" 0.5425,\n",
|
| 111 |
+
" 0.51,\n",
|
| 112 |
+
" 0.49,\n",
|
| 113 |
+
" 0.3925,\n",
|
| 114 |
+
" 0.4825,\n",
|
| 115 |
+
" 0.5425,\n",
|
| 116 |
+
" 0.385,\n",
|
| 117 |
+
" 0.36,\n",
|
| 118 |
+
" 0.5125,\n",
|
| 119 |
+
" 0.535,\n",
|
| 120 |
+
" 0.4825,\n",
|
| 121 |
+
" 0.5025,\n",
|
| 122 |
+
" 0.485,\n",
|
| 123 |
+
" 0.5125,\n",
|
| 124 |
+
" 0.3325,\n",
|
| 125 |
+
" 0.6225,\n",
|
| 126 |
+
" 0.4975,\n",
|
| 127 |
+
" 0.5375,\n",
|
| 128 |
+
" 0.4975,\n",
|
| 129 |
+
" 0.5325,\n",
|
| 130 |
+
" 0.2925,\n",
|
| 131 |
+
" 0.4825,\n",
|
| 132 |
+
" 0.4875,\n",
|
| 133 |
+
" 0.4975,\n",
|
| 134 |
+
" 0.53,\n",
|
| 135 |
+
" 0.285,\n",
|
| 136 |
+
" 0.4625,\n",
|
| 137 |
+
" 0.4275,\n",
|
| 138 |
+
" 0.48,\n",
|
| 139 |
+
" 0.4225,\n",
|
| 140 |
+
" 0.55,\n",
|
| 141 |
+
" 0.385,\n",
|
| 142 |
+
" 0.5175,\n",
|
| 143 |
+
" 0.53,\n",
|
| 144 |
+
" 0.4375,\n",
|
| 145 |
+
" 0.495,\n",
|
| 146 |
+
" 0.485,\n",
|
| 147 |
+
" 0.3425,\n",
|
| 148 |
+
" 0.4875,\n",
|
| 149 |
+
" 0.5575,\n",
|
| 150 |
+
" 0.4825,\n",
|
| 151 |
+
" 0.2675,\n",
|
| 152 |
+
" 0.4975,\n",
|
| 153 |
+
" 0.5375,\n",
|
| 154 |
+
" 0.5375,\n",
|
| 155 |
+
" 0.475,\n",
|
| 156 |
+
" 0.3525,\n",
|
| 157 |
+
" 0.485,\n",
|
| 158 |
+
" 0.34,\n",
|
| 159 |
+
" 0.4625,\n",
|
| 160 |
+
" 0.5,\n",
|
| 161 |
+
" 0.505,\n",
|
| 162 |
+
" 0.5075,\n",
|
| 163 |
+
" 0.515,\n",
|
| 164 |
+
" 0.4925,\n",
|
| 165 |
+
" 0.445,\n",
|
| 166 |
+
" 0.3675,\n",
|
| 167 |
+
" 0.5125,\n",
|
| 168 |
+
" 0.495,\n",
|
| 169 |
+
" 0.4175,\n",
|
| 170 |
+
" 0.4725,\n",
|
| 171 |
+
" 0.5025,\n",
|
| 172 |
+
" 0.4875,\n",
|
| 173 |
+
" 0.53,\n",
|
| 174 |
+
" 0.5425,\n",
|
| 175 |
+
" 0.4175,\n",
|
| 176 |
+
" 0.34,\n",
|
| 177 |
+
" 0.5225,\n",
|
| 178 |
+
" 0.49,\n",
|
| 179 |
+
" 0.4125,\n",
|
| 180 |
+
" 0.3575,\n",
|
| 181 |
+
" 0.4925,\n",
|
| 182 |
+
" 0.535,\n",
|
| 183 |
+
" 0.51,\n",
|
| 184 |
+
" 0.49,\n",
|
| 185 |
+
" 0.535,\n",
|
| 186 |
+
" 0.4975,\n",
|
| 187 |
+
" 0.3825,\n",
|
| 188 |
+
" 0.48,\n",
|
| 189 |
+
" 0.485,\n",
|
| 190 |
+
" 0.5]"
|
| 191 |
+
]
|
| 192 |
+
},
|
| 193 |
+
"execution_count": 9,
|
| 194 |
+
"metadata": {},
|
| 195 |
+
"output_type": "execute_result"
|
| 196 |
+
}
|
| 197 |
+
],
|
| 198 |
+
"source": [
|
| 199 |
+
"dna_protein_pair_full_list"
|
| 200 |
+
]
|
| 201 |
+
},
|
| 202 |
+
{
|
| 203 |
+
"cell_type": "code",
|
| 204 |
+
"execution_count": null,
|
| 205 |
+
"id": "110b1efd-1ccb-43d1-9033-53cbf92146e2",
|
| 206 |
+
"metadata": {},
|
| 207 |
+
"outputs": [],
|
| 208 |
+
"source": []
|
| 209 |
+
}
|
| 210 |
+
],
|
| 211 |
+
"metadata": {
|
| 212 |
+
"kernelspec": {
|
| 213 |
+
"display_name": "Python 3 (ipykernel)",
|
| 214 |
+
"language": "python",
|
| 215 |
+
"name": "python3"
|
| 216 |
+
},
|
| 217 |
+
"language_info": {
|
| 218 |
+
"codemirror_mode": {
|
| 219 |
+
"name": "ipython",
|
| 220 |
+
"version": 3
|
| 221 |
+
},
|
| 222 |
+
"file_extension": ".py",
|
| 223 |
+
"mimetype": "text/x-python",
|
| 224 |
+
"name": "python",
|
| 225 |
+
"nbconvert_exporter": "python",
|
| 226 |
+
"pygments_lexer": "ipython3",
|
| 227 |
+
"version": "3.12.3"
|
| 228 |
+
}
|
| 229 |
+
},
|
| 230 |
+
"nbformat": 4,
|
| 231 |
+
"nbformat_minor": 5
|
| 232 |
+
}
|
finetune/get_acc_stat_multiv1_2.ipynb
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv1_ft_en2.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 3,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"dna_protein_pair_full: 0.7\n",
|
| 39 |
+
"dna_protein_pair_rand_full: 0.708375\n"
|
| 40 |
+
]
|
| 41 |
+
}
|
| 42 |
+
],
|
| 43 |
+
"source": [
|
| 44 |
+
"# 假设您的数据存储在一个名为data_list的列表中\n",
|
| 45 |
+
"# 初始化一个字典来保存每个键的最大accuracy值\n",
|
| 46 |
+
"max_accuracies = {}\n",
|
| 47 |
+
"dna_protein_pair_full_list = []\n",
|
| 48 |
+
"fr_list = []\n",
|
| 49 |
+
"zh_list = []\n",
|
| 50 |
+
"\n",
|
| 51 |
+
"# 遍历列表中的每个字典\n",
|
| 52 |
+
"for data in data_list:\n",
|
| 53 |
+
" for key, metrics in data.items():\n",
|
| 54 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 55 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 56 |
+
" accuracy = metrics['accuracy']\n",
|
| 57 |
+
" if accuracy<0.5:\n",
|
| 58 |
+
" accuracy = 1 - accuracy\n",
|
| 59 |
+
" if \"dna_protein_pair_full\"==key:\n",
|
| 60 |
+
" dna_protein_pair_full_list.append(accuracy)\n",
|
| 61 |
+
"\n",
|
| 62 |
+
" if \"fr\"==key:\n",
|
| 63 |
+
" fr_list.append(accuracy)\n",
|
| 64 |
+
"\n",
|
| 65 |
+
" if \"zh\"==key:\n",
|
| 66 |
+
" zh_list.append(accuracy)\n",
|
| 67 |
+
" \n",
|
| 68 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 69 |
+
" max_accuracies[key] = accuracy\n",
|
| 70 |
+
"\n",
|
| 71 |
+
"# 打印每个键的最大accuracy值\n",
|
| 72 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 73 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 74 |
+
]
|
| 75 |
+
},
|
| 76 |
+
{
|
| 77 |
+
"cell_type": "code",
|
| 78 |
+
"execution_count": 4,
|
| 79 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 80 |
+
"metadata": {},
|
| 81 |
+
"outputs": [],
|
| 82 |
+
"source": [
|
| 83 |
+
"#!pip install matplotlib seaborn"
|
| 84 |
+
]
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"cell_type": "code",
|
| 88 |
+
"execution_count": 5,
|
| 89 |
+
"id": "367b765c-ec8d-4cbb-a76c-d1e891816e14",
|
| 90 |
+
"metadata": {},
|
| 91 |
+
"outputs": [
|
| 92 |
+
{
|
| 93 |
+
"data": {
|
| 94 |
+
"text/plain": [
|
| 95 |
+
"Text(0, 0.5, 'Frequency')"
|
| 96 |
+
]
|
| 97 |
+
},
|
| 98 |
+
"execution_count": 5,
|
| 99 |
+
"metadata": {},
|
| 100 |
+
"output_type": "execute_result"
|
| 101 |
+
},
|
| 102 |
+
{
|
| 103 |
+
"data": {
|
| 104 |
+
"image/png": "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gIAAxcXF6fHHHz/qs/If//iHzjzzTIWHh8vPz08pKSnVnnd65Gf64cPFly5dqltuuUVRUVGKj493rU9JSVFYWNgxP9+ApoCRJKCRuuaaa/Tggw/q22+/1Q033FBtmw0bNuiCCy5Qz5499fjjj8tut2v79u368ccfJUldunTR448/rkceeUQ33nijzj77bEnSmWee6drGwYMHNXLkSI0bN07jx49XdHT0cev6+9//LovFogceeECZmZl68cUXNWzYMK1evdo14lUTNanNnWEYuuiii7R48WJNmjRJvXv31vz583Xfffdp//79Rx2S9MMPP+jzzz/XLbfcoqCgIP3zn//U2LFjlZqaqvDw8GPWVVJSosGDB2v79u269dZblZycrNmzZ2vixInKzc3VHXfcoS5duui9997TXXfdpfj4eN1zzz2STnwY1FdffaXCwkKNGzdOMTExGjx4sN5//31dddVVHu1mzpypP//5z+rWrZumTJmi0NBQ/f7775o3b56r7XfffacLLrhAsbGxuuOOOxQTE6NNmzbp66+/1h133HH8zj+GGTNmqLS0VDfeeKPsdrvCwsKUn5+vf//737ryyit1ww03qKCgQG+99ZaGDx+uX375xeNQrUmTJmnmzJkaOXKkrr/+elVWVmrZsmVasWKF+vXrp2uuuUY33HCD1q9fr+7du7se9+uvv2rr1q166KGHjllbQECAxowZo08//VQ5OTkKCwtzrfv444/lcDh09dVXS5Jmz56t4uJi/eUvf1F4eLh++eUXvfzyy9q3b59mz55dq745UkZGhs444wzXl/PIyEjNnTtXkyZNUn5+/gkn8fjpp5/Ut2/fk3pOp9Opiy66SD/88INuvPFGdenSRevWrdMLL7ygrVu36ssvv5RUN58LR1q3bp3OP/98RUZG6tFHH1VlZaWmTp16zM+Lmrz/fv31V/30008aN26c4uPjtXv3br322msaPHiwNm7cWO1hlcezdOlSffzxx7r99ttlt9v16quvasSIEfrll1889jdJuuyyy9ShQwc99dRTruBw/fXX65133tGf/vQn3XPPPfr55581bdo0bdq0SV988YUk6cUXX9Rtt92mwMBA/e1vf5MkVx8UFxdr0KBB2r9/v2666SYlJibqp59+0pQpU5SWlqYXX3zxhK/h8ssvV3JysqZNm6bffvtN//73vxUVFaVnnnnmpPrC4XBoxIgROuOMM/Tss89q3rx5mjp1qiorK/X444+72r300ku66KKLdPXVV6u8vFwfffSRLrvsMn399dc1GpW95ZZbFBkZqUceeURFRUUe6/r27eva54AmyQBgihkzZhiSjF9//fWYbUJCQow+ffq47k+dOtVwf9u+8MILhiQjKyvrmNv49ddfDUnGjBkzjlo3aNAgQ5Lx+uuvV7tu0KBBrvuLFy82JBmtW7c28vPzXcs/+eQTQ5Lx0ksvuZYlJSUZEyZMOOE2j1fbhAkTjKSkJNf9L7/80pBkPPnkkx7t/vSnPxkWi8XYvn27a5kkw8fHx2PZmjVrDEnGyy+/fNRzuXvxxRcNScasWbNcy8rLy40BAwYYgYGBHq89KSnJGD169HG35+6CCy4wBg4c6Lr/5ptvGl5eXkZmZqZrWW5urhEUFGT079/fKCkp8Xi80+k0DMMwKisrjeTkZCMpKck4dOhQtW0M4+j+PuzIvt21a5chyQgODvao5fBzlZWVeSw7dOiQER0dbfz5z392LVu0aJEhybj99tuPer7DNeXm5hq+vr7GAw884LH+9ttvNwICAozCwsKjHuvum2++MSQZb7zxhsfyM844w2jdurXhcDgMwzCM4uLiox47bdo0w2KxGHv27HEtO/L9dLgfqtsfJRlTp0513Z80aZIRGxtrZGdne7QbN26cERISUm0Nh1VUVBgWi8W45557jvt6R48e7fF7eu+99wyr1WosW7bMo93rr79uSDJ+/PFHwzBO/XOhOhdffLHh6+vr0X8bN240bDabceRXiZq+/6rro+XLlxuSjHfffbdGdbk/pyRj5cqVrmV79uwxfH19jUsuucS17PDv/Morr/R4/OrVqw1JxvXXX++x/N577zUkGYsWLXIt69atW7XvqyeeeMIICAgwtm7d6rH8r3/9q2Gz2YzU1FSPet33p8N1ub+nDMMwLrnkEiM8PPzEHeBmwoQJhiTjtttucy1zOp3G6NGjDR8fH4/94sjfQXl5udG9e3djyJAhHsuP/Ew//N+vs846y6isrKy2jhtvvNHw8/M7qdqBxoTD7YBGLDAw8Liz3IWGhkqS5syZU+tJDux2u6677roat7/22msVFBTkuv+nP/1JsbGx+u9//1ur56+p//73v7LZbLr99ts9lt9zzz0yDOOomeKGDRvmcShTz549FRwcrJ07d57weWJiYnTllVe6lnl7e+v2229XYWGhli5dWqv6Dx48qPnz53tsd+zYsbJYLPrkk09cy7777jsVFBTor3/961HnLRw+1PL333/Xrl27dOedd7r2gSPb1MbYsWOPGg2z2Wyu85KcTqdycnJUWVmpfv366bfffnO1++yzz2SxWKqdxOJwTSEhIRozZow+/PBD11/vHQ6HPv74Y1188cUnPC/k8EiG+yF3u3bt0ooVK3TllVe6Tix3H9EsKipSdna2zjzzTBmGod9///1kuqRahmHos88+04UXXijDMJSdne26DR8+XHl5eR59c6ScnBwZhqFWrVqd1PPOnj1bXbp0UefOnT2e8/A5H4cPgayLzwV3DodD8+fP18UXX6zExETX8i5duhzzEMmavP/cf08VFRU6ePCg2rdvr9DQ0OP237EMGDBAKSkprvuJiYkaM2aM5s+fL4fD4dH25ptv9rh/+PPr7rvv9lh+eJT4m2++OeHzz549W2effbZatWrl8fsZNmyYHA7HUYf+VefIus4++2wdPHhQ+fn5J3zskW699VbXz4dHPMvLy7VgwQLXcvffwaFDh5SXl6ezzz67xv1/ww03yGazVbuuVatWKikpOenDBYHGgpAENGKFhYUegeRIV1xxhQYOHKjrr79e0dHRGjdunD755JOT+mLUunXrkzo5v0OHDh73LRaL2rdvXyfTEh/Pnj17FBcXd1R/dOnSxbXenfuXucNatWqlQ4cOnfB5OnTocNRMTsd6npr6+OOPVVFRoT59+mj79u3avn27cnJy1L9/f4/r5OzYsUOSjjo8yF1N2tRGcnJytcvfeecd9ezZU76+vgoPD1dkZKS++eYb5eXledQUFxfncRhcda699lqlpqZq2bJlkqQFCxYoIyOjRtOne3l56YorrtCyZcu0f/9+SXIFpsOH2klSamqqJk6cqLCwMAUGBioyMlKDBg2SJI+aaysrK0u5ubl68803FRkZ6XE7/AeHzMzME27HOOL8kBPZtm2bNmzYcNRzduzY0eM56+JzwV1WVpZKSkqOeu9LVeeSVacm77+SkhI98sgjrvN3IiIiFBkZqdzc3Fr9nqqrr2PHjiouLlZWVpbH8iP39T179shqtap9+/Yey2NiYhQaGlqj9/22bds0b968o34/w4YNk1SzfeLIfjscpE/0uXUkq9Wqtm3beiw7vJ+4f1Z//fXXOuOMM+Tr66uwsDBFRkbqtddeq3H/H+szQ/rf/s3sdmiqOCcJaKT27dunvLy8o/6j7c7Pz0/ff/+9Fi9erG+++Ubz5s3Txx9/rCFDhujbb7895l/4jtxGXTvWfxQdDkeNaqoLx3qek/1iWlcOB6GBAwdWu37nzp1Hfak5VRaLpdrXe+Rf1Q+rbl+YNWuWJk6cqIsvvlj33XefoqKiZLPZNG3aNFdYOxnDhw9XdHS0Zs2apXPOOUezZs1STEyM64vkiYwfP17/+te/9OGHH+ree+/Vhx9+qK5du7rOjXI4HDrvvPOUk5OjBx54QJ07d1ZAQID279+viRMnHjcoHG+/dXd4G+PHj9eECROqfYz71P1HCgsLk8ViOekvvk6nUz169ND06dOrXZ+QkCCpbj4XTlVN3n+33XabZsyYoTvvvFMDBgxQSEiILBaLxo0bV+/T/x/rc+9UvtA7nU6dd955uv/++6tdfzikHE9Dfm4tW7ZMF110kc455xy9+uqrio2Nlbe3t2bMmFHtBCnVOd5/Pw4dOiR/f/96+W8M0BAISUAjdfiaKceb8Uuq+ovh0KFDNXToUE2fPl1PPfWU/va3v2nx4sUaNmxYnf8Vb9u2bR73DcPQ9u3bPb4UtmrVSrm5uUc9ds+ePR5B4GRqS0pK0oIFC1RQUOAxmrR582bX+rqQlJSktWvXyul0eowmncrz7Nq1Sz/99JNuvfVW14jGYU6nU9dcc40++OADPfTQQ65DlNavX3/MgOze5njholWrVtUeXngyo2Gffvqp2rZtq88//9zj93XkYXXt2rXT/Pnzj5pU4Ug2m01XXXWVZs6cqWeeeUZffvnlcQ/ZOVL//v3Vrl07ffDBBzrvvPO0YcMG/f3vf3etX7dunbZu3ap33nlH1157rWv5d999d8JtH/6r/ZH77pH9FRkZqaCgIDkcjhqHO3deXl5q166ddu3adVKPa9eundasWaOhQ4ee8L1Tl58LkZGR8vPzO+q9L1VdP6e2Pv30U02YMEHPP/+8a1lpaWm1nx01UV19W7dulb+//wknVUlKSpLT6dS2bdtco8ZS1QQdubm5Hu/7Y/Vdu3btVFhYWKt9oq45nU7t3LnTI5ht3bpVklwzW3722Wfy9fXV/PnzPab4njFjRp3UsGvXLo++BJoaDrcDGqFFixbpiSeeUHJyssdhREfKyck5atnhv6gfnrb28Hketf3icaR3333X4zypTz/9VGlpaR4XRW3Xrp1WrFih8vJy17Kvv/76qKnCT6a2UaNGyeFw6F//+pfH8hdeeEEWi6XOLso6atQopaen6+OPP3Ytq6ys1Msvv6zAwMCjQk5NHB5Fuv/++/WnP/3J43b55Zdr0KBBrjbnn3++goKCNG3aNJWWlnps5/Bfk/v27avk5GS9+OKLR/Wd+1+c27Vrp82bN3scarRmzZqTmnHqcHhx3+7PP/+s5cuXe7QbO3asDMPQY489dtQ2jvwr+DXXXKNDhw7ppptuUmFh4UlfB+jqq6/W77//rqlTp8pisXjMDlhdvYZheEyNfizBwcGKiIg46tyRV1991eO+zWbT2LFj9dlnn2n9+vVHbefIQ7uqM2DAANfU6DV1+eWXa//+/fq///u/o9aVlJS4Zher688Fm82m4cOH68svv1Rqaqpr+aZNmzR//vyTeg1HbvfIfePll18+5kjniSxfvtzjXJq9e/dqzpw5Ov/8808YwkeNGiVJR81Ad3jUzn2mt4CAgGr77fLLL9fy5cur7ZPc3FxVVlbW9KXUCffPSsMw9K9//Uve3t4aOnSopKr+t1gsHv29e/du1yyJp+q333477oyJQGPHSBJgsrlz52rz5s2qrKxURkaGFi1apO+++05JSUn66quvjnvRwccff1zff/+9Ro8eraSkJGVmZurVV19VfHy869of7dq1U2hoqF5//XUFBQUpICBA/fv3P+6x5McTFhams846S9ddd50yMjL04osvqn379h7TlF9//fX69NNPNWLECF1++eXasWOHZs2addQ1YU6mtgsvvFDnnnuu/va3v2n37t3q1auXvv32W82ZM0d33nnnSV9v5lhuvPFGvfHGG5o4caJWrVqlNm3a6NNPP9WPP/6oF1988bjniB3L+++/r969e7sOhzrSRRddpNtuu02//fab+vbtqxdeeEHXX3+9TjvtNNe1XNasWaPi4mK98847slqteu2113ThhReqd+/euu666xQbG6vNmzdrw4YNri9pf/7znzV9+nQNHz5ckyZNUmZmpl5//XV169atxieCX3DBBfr88891ySWXaPTo0dq1a5def/11de3aVYWFha525557rq655hr985//1LZt2zRixAg5nU4tW7ZM5557rsdJ5H369FH37t1dExGc7FTY48eP1+OPP645c+Zo4MCBHtd86ty5s9q1a6d7771X+/fvV3BwsD777LMaH9p2/fXX6+mnn9b111+vfv366fvvv3f9Bd7d008/rcWLF6t///664YYb1LVrV+Xk5Oi3337TggULqg0q7saMGaP33ntPW7durdFhWFJVuPzkk0908803a/HixRo4cKAcDoc2b96sTz75RPPnz1e/fv3q5XPhscce07x583T22Wfrlltucf3hoFu3blq7dm2N6j/SBRdcoPfee08hISHq2rWrli9frgULFhx3iv7j6d69u4YPH+4xBfjh2k+kV69emjBhgt58803l5uZq0KBB+uWXX/TOO+/o4osv1rnnnutqm5KSotdee01PPvmk2rdvr6ioKA0ZMkT33XefvvrqK11wwQWaOHGiUlJSVFRUpHXr1unTTz/V7t27FRERUavXdrJ8fX01b948TZgwQf3799fcuXP1zTff6MEHH3SNqo0ePVrTp0/XiBEjdNVVVykzM1OvvPKK2rdvX+vf6WGrVq1STk6OxowZUxcvBzBHQ06lB+B/Dk+hevjm4+NjxMTEGOedd57x0ksveUw1fdiRUxYvXLjQGDNmjBEXF2f4+PgYcXFxxpVXXnnUFLRz5swxunbtanh5eXlM+zto0CCjW7du1dZ3rCnAP/zwQ2PKlClGVFSU4efnZ4wePdpjWuDDnn/+eaN169aG3W43Bg4caKxcubLaKamPVduR01QbhmEUFBQYd911lxEXF2d4e3sbHTp0MJ577jmPaa8No2p63cmTJx9V07GmJj9SRkaGcd111xkRERGGj4+P0aNHj2qnSq7JFOCrVq0yJBkPP/zwMdvs3r3bkGTcddddrmVfffWVceaZZxp+fn5GcHCwcfrppxsffvihx+N++OEH47zzzjOCgoKMgIAAo2fPnkdNcT5r1iyjbdu2ho+Pj9G7d29j/vz5x5wC/LnnnjuqNqfTaTz11FNGUlKSYbfbjT59+hhff/11tb+fyspK47nnnjM6d+5s+Pj4GJGRkcbIkSONVatWHbXdZ5991pBkPPXUU8frvmM67bTTDEnGq6++etS6jRs3GsOGDTMCAwONiIgI44YbbnBNQe3+ezzy/WQYVVMiT5o0yQgJCTGCgoKMyy+/3MjMzDxqymbDqNpPJk+ebCQkJBje3t5GTEyMMXToUOPN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uvTSSz2Wsw9X3787d+7UokWLdPXVV+u///2vtm/frltuuUUVFRWaOnVqjbaZnp4uHx+fo/6w4v453RzUR/8eyel06s4779TAgQPVvXt31/KrrrpKSUlJiouL09q1a/XAAw9oy5Yt+vzzz+v2RZqovvq3f//+mjlzpjp16qS0tDQ99thjOvvss7V+/XoFBQWx/9bh/vvll18qNzdXEydO9FjO/lt9/7r75ZdftH79er311luuZU3lOzAhqZ4MGDBAAwYMcN0/88wz1aVLF73xxht64oknTKyseTiZ/q2oqNDll18uwzD02muveay7++67XT/37NlTPj4+uummmzRt2jTZ7fb6fRGNWE36d9y4ca71PXr0UM+ePdWuXTstWbJEQ4cObfCam5qT/Yx4++23dfXVVx81uQP7cPWcTqeioqL05ptvymazKSUlRfv379dzzz1X7ZcgnJyT7d/Jkydr/fr1+uGHHzyW33jjja6fe/ToodjYWA0dOlQ7duxQu3bt6v11NFY16d+RI0e62vfs2VP9+/dXUlKSPvnkk2pHnPE/J7v/vvXWWxo5cqTi4uI8lrP/nthbb72lHj166PTTTze7lJPG4XY1EBERIZvNdtSMMBkZGYqJianRNry9vdWnTx9t375dklyPO942Y2JilJmZ6bG+srJSOTk5NX7epqA++vewwwFpz549+u677zxGkarTv39/VVZWavfu3Sf1Ghqz+uxfd23btlVERITHPt4S9l+p/vt42bJl2rJli66//voTbod9uEpsbKw6duwom83mWtalSxelp6ervLy8RtuMiYlReXm5cnNza/y8TVF99K+7W2+9VV9//bUWL15c7Sipu/79+0vScT9rmpr67t/DQkND1bFjR4/PYPbfU+/fPXv2aMGCBTX+/JXYfw8rKirSRx99dFRobyrfgQlJNeDj46OUlBQtXLjQtczpdGrhwoUefwk+HofDoXXr1ik2NlaSlJycrJiYGI9t5ufn6+eff3Ztc8CAAcrNzdWqVatcbRYtWiSn0+l6IzYH9dG/0v8C0rZt27RgwQKFh4efcDurV6+W1Wo9aoi3Kauv/j3Svn37dPDgQVeblrL/SvXfx2+99ZZSUlLUq1evE26HfbjKwIEDtX37djmdTteyrVu3KjY2Vj4+PjXaZkpKiry9vT3abNmyRampqTX+vTYF9dG/UtUUv7feequ++OILLVq0SMnJySesZfXq1ZJ03M+apqa++vdIhYWF2rFjh6vv2H/rpn9nzJihqKgoj+mrj4X919Ps2bNVVlam8ePHeyxvMt+BG2R6iGbgo48+Mux2uzFz5kxj48aNxo033miEhoa6puy95pprjL/+9a+u9o899pgxf/58Y8eOHcaqVauMcePGGb6+vsaGDRtcbZ5++mkjNDTUmDNnjrF27VpjzJgx1U5/2KdPH+Pnn382fvjhB6NDhw7Ncgrluu7f8vJy46KLLjLi4+ON1atXe0xFWVZWZhiGYfz000/GCy+8YKxevdrYsWOHMWvWLCMyMtK49tprG74D6lld929BQYFx7733GsuXLzd27dplLFiwwOjbt6/RoUMHo7S01LWdlrL/Gkb9fEYYhmHk5eUZ/v7+xmuvvXbUc7IPH7t/U1NTjaCgIOPWW281tmzZYnz99ddGVFSU8eSTT9Z4m4ZRNYVyYmKisWjRImPlypXGgAEDjAEDBjTcC28g9dG/f/nLX4yQkBBjyZIlHp/BxcXFhmEYxvbt243HH3/cWLlypbFr1y5jzpw5Rtu2bY1zzjmnYV98A6iP/r3nnnuMJUuWGLt27TJ+/PFHY9iwYUZERISRmZnpasP+W/v+NYyqWdwSExONBx544KjnZP89dv8edtZZZxlXXHFFtdtsCt+BCUkn4eWXXzYSExMNHx8f4/TTTzdWrFjhWjdo0CBjwoQJrvt33nmnq210dLQxatQo47fffvPYntPpNB5++GEjOjrasNvtxtChQ40tW7Z4tDl48KBx5ZVXGoGBgUZwcLBx3XXXGQUFBfX6Os1Sl/27a9cuQ1K1t8PXOFi1apXRv39/IyQkxPD19TW6dOliPPXUUx5f8puTuuzf4uJi4/zzzzciIyMNb29vIykpybjhhhuOus5PS9p/DaPuPyMMwzDeeOMNw8/Pz8jNzT1qHfvwsfvXMKpCZP/+/Q273W60bdvW+Pvf/25UVlbWeJuGYRglJSXGLbfcYrRq1crw9/c3LrnkEiMtLa3eXqOZ6rp/j/UZfPhaKampqcY555xjhIWFGXa73Wjfvr1x3333NcvrzBhG3ffvFVdcYcTGxho+Pj5G69atjSuuuMLYvn27xzbYf6vU9vNh/vz5hqSjvpsZBvvvifp38+bNhiTj22+/rXZ7TeE7sMUwDKNhxqwAAAAAoPHjnCQAAAAAcENIAgAAAAA3hCQAAAAAcENIAgAAAAA3hCQAAAAAcENIAgAAAAA3hCQAAAAAcENIAgAAAAA3hCQAQLMzePBg3XnnnWaXAQBooghJAIBG5cILL9SIESOqXbds2TJZLBatXbu2gasCALQkhCQAQKMyadIkfffdd9q3b99R62bMmKF+/fqpZ8+eJlQGAGgpCEkAgEblggsuUGRkpGbOnOmxvLCwULNnz9bFF1+sK6+8Uq1bt5a/v7969OihDz/88LjbtFgs+vLLLz2WhYaGejzH3r17dfnllys0NFRhYWEaM2aMdv9/+/YSCm0bx3H8N09sxu3QhKRQTlEkhyxIZHNbEFGUUzI1lFhNacrOUhbKUshCIUsLLAwTIymHFBnykJKVRJLjs9A7jadeC48n0/t+P3Ut7vu6uq77v/z1v+6fP/3zbrdbhYWFCgsLU1RUlIqLi3V6evqH1QIAghEhCQAQVEJCQtTa2qrx8XG9vr7638/MzOj5+VnNzc3Kz8/X3Nyc9vb25HA41NLSoo2NjU+f+fj4KNM0FR4eLo/Ho9XVVRmGoYqKCj08POjp6Uk1NTUqLS3V7u6uvF6vHA6HLBbLV5QMAAgyId/9AQAA/K69vV0DAwNaXl5WWVmZpLerdnV1dUpKSpLT6fSv7e7u1vz8vKanp1VYWPip86ampvTy8qKRkRF/8BkbG1NUVJTcbrcKCgp0fX2tyspKpaSkSJIyMzP/rEgAQNCikwQACDoZGRkqKirS6OioJOno6Egej0d2u13Pz8/q7+9Xdna2bDabDMPQ/Py8zs7OPn3ezs6Ojo6OFB4eLsMwZBiGbDab7u/vdXx8LJvNpra2NpmmqaqqKg0NDeni4uKrygUABBlCEgAgKNntds3Ozurm5kZjY2NKSUlRaWmpBgYGNDQ0pN7eXi0tLWl7e1umaerh4eFf97JYLO+u7klvV+z+cXt7q/z8fG1vb78bh4eHamxslPTWWfJ6vSoqKtLU1JTS09O1vr7+d4oHAHwrQhIAICjV19frx48fmpyc1MTEhNrb22WxWLS6uqrq6mo1NzcrJydHycnJOjw8/HCvmJiYd50fn8+nu7s7/3NeXp58Pp9iY2OVmpr6bkRGRvrX5ebmyuVyaW1tTVlZWZqcnPz6wgEA346QBAAISoZhqKGhQS6XSxcXF2pra5MkpaWlaXFxUWtra9rf31dHR4cuLy8/3Ku8vFzDw8Pa2trS5uamOjs7FRoa6p9vampSdHS0qqur5fF4dHJyIrfbrZ6eHp2fn+vk5EQul0ter1enp6daWFiQz+fjvyQA+I8iJAEAgpbdbtfV1ZVM01R8fLwkqa+vT3l5eTJNU2VlZYqLi1NNTc2H+wwODiohIUElJSVqbGyU0+mU1Wr1z1utVq2srCgxMVG1tbXKzMyU3W7X/f29IiIiZLVadXBwoLq6OqWnp8vhcKirq0sdHR1/s3wAwDexvP5+SRsAAAAA/sfoJAEAAABAAEISAAAAAAQgJAEAAABAAEISAAAAAAQgJAEAAABAAEISAAAAAAQgJAEAAABAAEISAAAAAAQgJAEAAABAAEISAAAAAAQgJAEAAABAgF9vwAiiSnBhygAAAABJRU5ErkJggg==",
|
| 105 |
+
"text/plain": [
|
| 106 |
+
"<Figure size 1000x600 with 1 Axes>"
|
| 107 |
+
]
|
| 108 |
+
},
|
| 109 |
+
"metadata": {},
|
| 110 |
+
"output_type": "display_data"
|
| 111 |
+
}
|
| 112 |
+
],
|
| 113 |
+
"source": [
|
| 114 |
+
"import numpy as np\n",
|
| 115 |
+
"import matplotlib.pyplot as plt\n",
|
| 116 |
+
"import seaborn as sns\n",
|
| 117 |
+
"\n",
|
| 118 |
+
"# 假设这是你的列表\n",
|
| 119 |
+
"#dna_protein_pair_rand_full_list = [0.1, 0.2, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] # 示例数据\n",
|
| 120 |
+
"\n",
|
| 121 |
+
"# 使用Freedman-Diaconis规则自动确定bin的数量\n",
|
| 122 |
+
"bins = np.histogram_bin_edges(dna_protein_pair_full_list, bins='fd')\n",
|
| 123 |
+
"\n",
|
| 124 |
+
"# 设置图形大小\n",
|
| 125 |
+
"plt.figure(figsize=(10, 6))\n",
|
| 126 |
+
"\n",
|
| 127 |
+
"# 使用seaborn绘制直方图\n",
|
| 128 |
+
"sns.histplot(data=dna_protein_pair_full_list, bins=bins, kde=True)\n",
|
| 129 |
+
"\n",
|
| 130 |
+
"# 添加标题和轴标签\n",
|
| 131 |
+
"plt.title('Distribution of Accuracy Value (Test dna_protein_pair)')\n",
|
| 132 |
+
"plt.xlabel('Values')\n",
|
| 133 |
+
"plt.ylabel('Frequency')\n",
|
| 134 |
+
"\n",
|
| 135 |
+
"# 显示图形"
|
| 136 |
+
]
|
| 137 |
+
},
|
| 138 |
+
{
|
| 139 |
+
"cell_type": "code",
|
| 140 |
+
"execution_count": 8,
|
| 141 |
+
"id": "094948c7-3797-46ef-96cb-8a784ec937b5",
|
| 142 |
+
"metadata": {},
|
| 143 |
+
"outputs": [
|
| 144 |
+
{
|
| 145 |
+
"name": "stdout",
|
| 146 |
+
"output_type": "stream",
|
| 147 |
+
"text": [
|
| 148 |
+
"平均值: 0.542962962962963\n",
|
| 149 |
+
"方差: 0.0017891375171467762\n",
|
| 150 |
+
"标准差: 0.04229819756380614\n"
|
| 151 |
+
]
|
| 152 |
+
}
|
| 153 |
+
],
|
| 154 |
+
"source": [
|
| 155 |
+
"import numpy as np\n",
|
| 156 |
+
"\n",
|
| 157 |
+
"# 示例数据(Python list,包含 float 类型的数值)\n",
|
| 158 |
+
"data = dna_protein_pair_full_list\n",
|
| 159 |
+
"\n",
|
| 160 |
+
"# 计算平均值\n",
|
| 161 |
+
"mean_value = np.mean(data)\n",
|
| 162 |
+
"\n",
|
| 163 |
+
"# 计算方差(注意:np.var默认计算总体方差,如果需要样本方差,请设置ddof=1)\n",
|
| 164 |
+
"variance_value = np.var(data)\n",
|
| 165 |
+
"\n",
|
| 166 |
+
"# 计算标准差\n",
|
| 167 |
+
"std_value = np.std(data)\n",
|
| 168 |
+
"\n",
|
| 169 |
+
"print(\"平均值:\", mean_value)\n",
|
| 170 |
+
"print(\"方差:\", variance_value)\n",
|
| 171 |
+
"print(\"标准差:\", std_value)"
|
| 172 |
+
]
|
| 173 |
+
},
|
| 174 |
+
{
|
| 175 |
+
"cell_type": "code",
|
| 176 |
+
"execution_count": 9,
|
| 177 |
+
"id": "8ce7f481-1753-4682-960f-9cd459b6a383",
|
| 178 |
+
"metadata": {},
|
| 179 |
+
"outputs": [
|
| 180 |
+
{
|
| 181 |
+
"name": "stderr",
|
| 182 |
+
"output_type": "stream",
|
| 183 |
+
"text": [
|
| 184 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 39057 (\\N{CJK UNIFIED IDEOGRAPH-9891}) missing from font(s) DejaVu Sans.\n",
|
| 185 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 186 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
|
| 187 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 188 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans.\n",
|
| 189 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 190 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.\n",
|
| 191 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 192 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24067 (\\N{CJK UNIFIED IDEOGRAPH-5E03}) missing from font(s) DejaVu Sans.\n",
|
| 193 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 194 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 30452 (\\N{CJK UNIFIED IDEOGRAPH-76F4}) missing from font(s) DejaVu Sans.\n",
|
| 195 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 196 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.\n",
|
| 197 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 198 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22270 (\\N{CJK UNIFIED IDEOGRAPH-56FE}) missing from font(s) DejaVu Sans.\n",
|
| 199 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 200 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21306 (\\N{CJK UNIFIED IDEOGRAPH-533A}) missing from font(s) DejaVu Sans.\n",
|
| 201 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n",
|
| 202 |
+
"/root/miniconda3/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.\n",
|
| 203 |
+
" fig.canvas.print_figure(bytes_io, **kw)\n"
|
| 204 |
+
]
|
| 205 |
+
},
|
| 206 |
+
{
|
| 207 |
+
"data": {
|
| 208 |
+
"image/png": "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vl1bt2516/157jETMzETMzETM9k6U3V1tXrDMV1jcwr51re+pddff13vvfeeSksPBpLFixfr1ltvjbnCKkmTJ0/WxRdfrJ/97GfdthPvimxZWZn27t2rQCAgqX9/6wgGg7rhG3dpxJV3aUhhSUxvqXL1MlF9R2213n3m5/ryN3+kkvKTe9l7aszUULddm15boOcWLtCIESP4jZeZmImZmImZmMmimfbv36/8/HyFQiE3r8WTkldk7777br366qt699133RArSUVFRWpra1N9fX3MVdldu3apqKgo7rb8fr/8fn+3us/nk88XO37nQThc507tbb3rdrturyPBe+s6w18sJ27dHKN6VI7UQz0SNe7J2Lfekz9Th5Hbe2+O09HWHceJW090LvW1/kXOvaOtMxMzScyUqMe+1pmJmSRmStTj0dS79derVQPEGKO7775bL730kt5++22NHDky5vEJEyZo0KBBWrp0qVurra3Vli1bVFlZOdDtAgAAIIlS6orsrFmztHjxYr3yyivKzs52X/eak5OjjIwM5eTk6LbbbtPs2bOVl5enQCCgb3/726qsrOQTCwAAAE4wKRVkFyxYIEm66KKLYuqLFi3SLbfcIkl67LHH5PF4NHPmTIXDYV1++eX61a9+NcCdAgAAINlSKsj25n1n6enpmj9/vubPnz8AHQEAACBVpdRrZAEAAIDeIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACs1OeP3woGg736mKx4Ro0adVTPAwAAAA7X5yA7btw4nXPOOX0Os1VVVWpra+vrlwMAAADi6nOQHTRokN5///0+f6EhQ4b0+TkAAABAIn1+jazjOEf1hY72eQAAAEA8vNkLAAAAViLIAgAAwEoEWQAAAFiJIAsAAAAr9flTC1pbW3XBBRf06TnGGB04cKCvXwoAAABIqM9BdvXq1Uf1BxH41AIAAAAcS30Osuecc47OOeecPj3HGKO//OUvCofDff1yAAAAQFz8QQQAAABYiT+IAAAAACvxqQUAAACwEkEWAAAAViLIAgAAwEoEWQAAAFipz59aEA6Hj+oPIjQ2Nvb1SwEAAAAJ9TnIVldXH9UfRAAAAACOpT4H2dNOO60/+gAAAAD6hNfIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALAS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iVmzb98+3XjjjQoEAsrNzdVtt92mxsbGfpnviziW+6a9vV333XefzjzzTGVlZamkpEQ33XSTtm/fHrOdESNGdNvOI4880m8zHo1jfc7ccsst3dZMmzYtZs2JeM5I6vZ45+3RRx911xxv54wk1dfXa9asWSouLpbf79epp56qP/3pT33aZmtrq2bNmqX8/HwNHjxYM2fO7PbHZpLtWO+XefPmadKkScrOzlZhYaGuueYa1dbWxmzjoosu6na+3Hnnnf0y3xdxrPfNQw891G3usWPHxmzjRDxn4v38cBxHs2bNctccj+dMvJkcx9GVV17prkmZPHPEP2B7gnv++edNWlqaeeqpp8zatWvN7bffbnJzc82uXbvirl+0aJEJBAJmx44d7m3nzp0xax555BGTk5NjXn75ZfO///u/5qtf/aoZOXKkaWlpcddMmzbNjB8/3qxcudL8+c9/NieffLK5/vrr+3XWvjrW+6a+vt5MnTrV/P73vzfr1q0zK1asMJMnTzYTJkyI2U55ebl5+OGHY7bT2NjYr7P2RX+cMzfffLOZNm1azJp9+/bFrDkRzxljTMxjO3bsME899ZRxHMds3LjRXXO8nTPhcNhMnDjRXHHFFea9994zwWDQLFu2zKxevbpP27zzzjtNWVmZWbp0qVm1apU599xzzZe+9KV+n7e3+mO/XH755WbRokVmzZo1ZvXq1eaKK64ww4cPjzkfLrzwQnP77bfHnC+hUKjf5+2L/tg3c+bMMaeffnrM3HV1dTHbORHPmd27d8fskzfffNNIMu+884675ng8Z/bu3Rszz5o1a4zX6zWLFi1y16RKniHIHsHkyZPNrFmz3PsdHR2mpKTEzJs3L+76RYsWmZycnITbi0ajpqioyDz66KNurb6+3vj9fvPcc88ZY4z561//aiSZjz76yF3z+uuvG8dxzLZt277gRMfOsd438Xz44YdGktm8ebNbKy8vN4899tjRtDwg+mO/3Hzzzebqq69O+DjnzCFXX321ueSSS2Jqx9s5s2DBAjNq1CjT1tZ21Nusr683gwYNMi+88IK75m9/+5uRZFasWPFFRzom+mO/HG737t1Gklm+fLlbu/DCC813vvOdo+57IPTHvpkzZ44ZP358wsc5Zw76zne+Y0aPHm2i0ahbOx7PmcM99thjJjs72/2lL5XyDC8tSKCtrU1VVVWa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",
|
| 209 |
+
"text/plain": [
|
| 210 |
+
"<Figure size 800x600 with 1 Axes>"
|
| 211 |
+
]
|
| 212 |
+
},
|
| 213 |
+
"metadata": {},
|
| 214 |
+
"output_type": "display_data"
|
| 215 |
+
}
|
| 216 |
+
],
|
| 217 |
+
"source": [
|
| 218 |
+
"import matplotlib.pyplot as plt\n",
|
| 219 |
+
"import numpy as np\n",
|
| 220 |
+
"\n",
|
| 221 |
+
"# 示例数据(Python list,float 类型)\n",
|
| 222 |
+
"#data = np.random.normal(loc=50, scale=15, size=200) # 生成200个服从正态分布的随机数\n",
|
| 223 |
+
"data = dna_protein_pair_full_list\n",
|
| 224 |
+
"\n",
|
| 225 |
+
"# 计算直方图并自动确定分区数\n",
|
| 226 |
+
"plt.figure(figsize=(8, 6)) # 设置图像大小\n",
|
| 227 |
+
"plt.hist(data, bins='auto', edgecolor='black', alpha=0.7)\n",
|
| 228 |
+
"\n",
|
| 229 |
+
"# 添加标题和标签\n",
|
| 230 |
+
"plt.xlabel('数值区间', fontsize=12)\n",
|
| 231 |
+
"plt.ylabel('频数', fontsize=12)\n",
|
| 232 |
+
"plt.title('数值分布直方图', fontsize=14)\n",
|
| 233 |
+
"\n",
|
| 234 |
+
"# 显示网格\n",
|
| 235 |
+
"plt.grid(axis='y', linestyle='--', alpha=0.7)\n",
|
| 236 |
+
"\n",
|
| 237 |
+
"# 显示直方图\n",
|
| 238 |
+
"plt.show()\n"
|
| 239 |
+
]
|
| 240 |
+
},
|
| 241 |
+
{
|
| 242 |
+
"cell_type": "code",
|
| 243 |
+
"execution_count": 10,
|
| 244 |
+
"id": "8d9c667f-2620-4039-85b5-fa8b24a8e14f",
|
| 245 |
+
"metadata": {},
|
| 246 |
+
"outputs": [
|
| 247 |
+
{
|
| 248 |
+
"name": "stdout",
|
| 249 |
+
"output_type": "stream",
|
| 250 |
+
"text": [
|
| 251 |
+
"大于0.7的元素个数: 1\n"
|
| 252 |
+
]
|
| 253 |
+
}
|
| 254 |
+
],
|
| 255 |
+
"source": [
|
| 256 |
+
"count = sum(1 for x in dna_protein_pair_full_list if x >= 0.7)\n",
|
| 257 |
+
"print(\"大于0.7的元素个数:\", count)"
|
| 258 |
+
]
|
| 259 |
+
},
|
| 260 |
+
{
|
| 261 |
+
"cell_type": "code",
|
| 262 |
+
"execution_count": null,
|
| 263 |
+
"id": "276f8fe0-7227-4c12-999b-8c025cb963cb",
|
| 264 |
+
"metadata": {},
|
| 265 |
+
"outputs": [],
|
| 266 |
+
"source": []
|
| 267 |
+
},
|
| 268 |
+
{
|
| 269 |
+
"cell_type": "code",
|
| 270 |
+
"execution_count": 12,
|
| 271 |
+
"id": "b550e6b5-a89f-48e7-95ca-7b6097867d0b",
|
| 272 |
+
"metadata": {},
|
| 273 |
+
"outputs": [
|
| 274 |
+
{
|
| 275 |
+
"data": {
|
| 276 |
+
"text/plain": [
|
| 277 |
+
"108"
|
| 278 |
+
]
|
| 279 |
+
},
|
| 280 |
+
"execution_count": 12,
|
| 281 |
+
"metadata": {},
|
| 282 |
+
"output_type": "execute_result"
|
| 283 |
+
}
|
| 284 |
+
],
|
| 285 |
+
"source": [
|
| 286 |
+
"len(dna_protein_pair_full_list)"
|
| 287 |
+
]
|
| 288 |
+
},
|
| 289 |
+
{
|
| 290 |
+
"cell_type": "code",
|
| 291 |
+
"execution_count": null,
|
| 292 |
+
"id": "35e0c7c6-bb4b-4333-8dae-1536f545f421",
|
| 293 |
+
"metadata": {},
|
| 294 |
+
"outputs": [],
|
| 295 |
+
"source": []
|
| 296 |
+
}
|
| 297 |
+
],
|
| 298 |
+
"metadata": {
|
| 299 |
+
"kernelspec": {
|
| 300 |
+
"display_name": "Python 3 (ipykernel)",
|
| 301 |
+
"language": "python",
|
| 302 |
+
"name": "python3"
|
| 303 |
+
},
|
| 304 |
+
"language_info": {
|
| 305 |
+
"codemirror_mode": {
|
| 306 |
+
"name": "ipython",
|
| 307 |
+
"version": 3
|
| 308 |
+
},
|
| 309 |
+
"file_extension": ".py",
|
| 310 |
+
"mimetype": "text/x-python",
|
| 311 |
+
"name": "python",
|
| 312 |
+
"nbconvert_exporter": "python",
|
| 313 |
+
"pygments_lexer": "ipython3",
|
| 314 |
+
"version": "3.12.3"
|
| 315 |
+
}
|
| 316 |
+
},
|
| 317 |
+
"nbformat": 4,
|
| 318 |
+
"nbformat_minor": 5
|
| 319 |
+
}
|
finetune/get_acc_stat_multiv1_3.ipynb
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 5,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv1_ft_en3.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 6,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"en: 0.9015\n",
|
| 39 |
+
"fr: 0.827\n",
|
| 40 |
+
"de: 0.791\n",
|
| 41 |
+
"zh: 0.731\n",
|
| 42 |
+
"dna_sim_pair_simple_150bp: 0.955\n",
|
| 43 |
+
"dna_sim_pair_150bp: 0.8715\n",
|
| 44 |
+
"dna_sim_pair_50bp: 0.813\n",
|
| 45 |
+
"protein_sim_pair_150bp: 0.9705555555555555\n",
|
| 46 |
+
"protein_sim_pair_450bp: 0.9738888888888889\n",
|
| 47 |
+
"dna_protein_pair: 0.585\n",
|
| 48 |
+
"dna_protein_pair_100: 0.5925\n",
|
| 49 |
+
"dna_protein_pair_full: 0.69\n",
|
| 50 |
+
"dna_protein_pair_rand: 0.580625\n",
|
| 51 |
+
"dna_protein_pair_rand_100: 0.5775\n",
|
| 52 |
+
"dna_protein_pair_rand_full: 0.6\n"
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
],
|
| 56 |
+
"source": [
|
| 57 |
+
"# 假设您的数据存储在一个名为data_list的列表中\n",
|
| 58 |
+
"# 初始化一个字典来保存每个键的最大accuracy值\n",
|
| 59 |
+
"max_accuracies = {}\n",
|
| 60 |
+
"\n",
|
| 61 |
+
"# 遍历列表中的每个字典\n",
|
| 62 |
+
"for data in data_list:\n",
|
| 63 |
+
" for key, metrics in data.items():\n",
|
| 64 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 65 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 66 |
+
" accuracy = metrics['accuracy']\n",
|
| 67 |
+
" if accuracy<0.5:\n",
|
| 68 |
+
" accuracy = 1 - accuracy\n",
|
| 69 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 70 |
+
" max_accuracies[key] = accuracy\n",
|
| 71 |
+
"\n",
|
| 72 |
+
"# 打印每个键的最大accuracy值\n",
|
| 73 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 74 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 75 |
+
]
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"cell_type": "code",
|
| 79 |
+
"execution_count": 7,
|
| 80 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 81 |
+
"metadata": {},
|
| 82 |
+
"outputs": [
|
| 83 |
+
{
|
| 84 |
+
"data": {
|
| 85 |
+
"text/plain": [
|
| 86 |
+
"72"
|
| 87 |
+
]
|
| 88 |
+
},
|
| 89 |
+
"execution_count": 7,
|
| 90 |
+
"metadata": {},
|
| 91 |
+
"output_type": "execute_result"
|
| 92 |
+
}
|
| 93 |
+
],
|
| 94 |
+
"source": [
|
| 95 |
+
"len(data_list)"
|
| 96 |
+
]
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"cell_type": "code",
|
| 100 |
+
"execution_count": null,
|
| 101 |
+
"id": "99f4b3d1-a96c-4ac8-88c4-72f9e3302c8e",
|
| 102 |
+
"metadata": {},
|
| 103 |
+
"outputs": [],
|
| 104 |
+
"source": []
|
| 105 |
+
}
|
| 106 |
+
],
|
| 107 |
+
"metadata": {
|
| 108 |
+
"kernelspec": {
|
| 109 |
+
"display_name": "Python 3 (ipykernel)",
|
| 110 |
+
"language": "python",
|
| 111 |
+
"name": "python3"
|
| 112 |
+
},
|
| 113 |
+
"language_info": {
|
| 114 |
+
"codemirror_mode": {
|
| 115 |
+
"name": "ipython",
|
| 116 |
+
"version": 3
|
| 117 |
+
},
|
| 118 |
+
"file_extension": ".py",
|
| 119 |
+
"mimetype": "text/x-python",
|
| 120 |
+
"name": "python",
|
| 121 |
+
"nbconvert_exporter": "python",
|
| 122 |
+
"pygments_lexer": "ipython3",
|
| 123 |
+
"version": "3.12.3"
|
| 124 |
+
}
|
| 125 |
+
},
|
| 126 |
+
"nbformat": 4,
|
| 127 |
+
"nbformat_minor": 5
|
| 128 |
+
}
|
finetune/get_acc_stat_multiv2.ipynb
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv2_ft_en.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 3,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"en: 0.9045\n",
|
| 39 |
+
"fr: 0.8145\n",
|
| 40 |
+
"de: 0.7875\n",
|
| 41 |
+
"zh: 0.744\n",
|
| 42 |
+
"dna_sim_pair_simple_150bp: 0.9583333333333334\n",
|
| 43 |
+
"dna_sim_pair_150bp: 0.87725\n",
|
| 44 |
+
"dna_sim_pair_50bp: 0.8295\n",
|
| 45 |
+
"protein_sim_pair_150bp: 0.9855555555555555\n",
|
| 46 |
+
"protein_sim_pair_450bp: 0.9727777777777777\n",
|
| 47 |
+
"dna_protein_pair: 0.58\n",
|
| 48 |
+
"dna_protein_pair_100: 0.57\n",
|
| 49 |
+
"dna_protein_pair_full: 0.665\n",
|
| 50 |
+
"dna_protein_pair_rand: 0.59375\n",
|
| 51 |
+
"dna_protein_pair_rand_100: 0.55875\n",
|
| 52 |
+
"dna_protein_pair_rand_full: 0.66625\n"
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
],
|
| 56 |
+
"source": [
|
| 57 |
+
"max_accuracies = {}\n",
|
| 58 |
+
"dna_protein_pair_rand_full_list = []\n",
|
| 59 |
+
"fr_list = []\n",
|
| 60 |
+
"zh_list = []\n",
|
| 61 |
+
"\n",
|
| 62 |
+
"# 遍历列表中的每个字典\n",
|
| 63 |
+
"for data in data_list:\n",
|
| 64 |
+
" for key, metrics in data.items():\n",
|
| 65 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 66 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 67 |
+
" accuracy = metrics['accuracy']\n",
|
| 68 |
+
" if accuracy<0.5:\n",
|
| 69 |
+
" accuracy = 1 - accuracy\n",
|
| 70 |
+
" if \"dna_protein_pair_rand_full\"==key:\n",
|
| 71 |
+
" dna_protein_pair_rand_full_list.append(accuracy)\n",
|
| 72 |
+
"\n",
|
| 73 |
+
" if \"fr\"==key:\n",
|
| 74 |
+
" fr_list.append(accuracy)\n",
|
| 75 |
+
"\n",
|
| 76 |
+
" if \"zh\"==key:\n",
|
| 77 |
+
" zh_list.append(accuracy)\n",
|
| 78 |
+
" \n",
|
| 79 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 80 |
+
" max_accuracies[key] = accuracy\n",
|
| 81 |
+
"\n",
|
| 82 |
+
"# 打印每个键的最大accuracy值\n",
|
| 83 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 84 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 85 |
+
]
|
| 86 |
+
},
|
| 87 |
+
{
|
| 88 |
+
"cell_type": "code",
|
| 89 |
+
"execution_count": 6,
|
| 90 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 91 |
+
"metadata": {},
|
| 92 |
+
"outputs": [
|
| 93 |
+
{
|
| 94 |
+
"data": {
|
| 95 |
+
"text/plain": [
|
| 96 |
+
"Text(0, 0.5, 'Frequency')"
|
| 97 |
+
]
|
| 98 |
+
},
|
| 99 |
+
"execution_count": 6,
|
| 100 |
+
"metadata": {},
|
| 101 |
+
"output_type": "execute_result"
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"data": {
|
| 105 |
+
"image/png": "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HTu2wmfLsmXLIAhCped4/vz5EAQBf/75Jy5fvgxPT08AwLx5825pNzK9Xo958+ahefPmsLOzg7u7O7p3747t27dXyG+5/q59zqxevRphYWHQaDS4++67ceLECQDAV199hWbNmsHOzg69e/eu9PlwK8dhJiQk4Mknn0TLli2h0Wjg7u6OBx54oNKyru3K/ddff+HJJ5+El5cXAgICbrjsm9m8eTN69OgBBwcHODk5YciQITh16lSFeVJTUzFlyhQEBARArVbD19cXI0aMMOcLCQnBqVOn8Ndff5nXxfWfSV5eXoiIiKj2c5DIFnGLEpENmDhxIl555RVs27YN06dPr3KeU6dOYejQoYiIiMBbb70FtVqNCxcu4O+//wYAtG7dGm+99RZef/11PProo+jRowcAoGvXruZlZGVlYdCgQRg7diwmTJgAb2/vG+Z69913IQgCXnrpJaSnp2PRokXo168fYmNjzVu+bsWtZLueKIoYPnw4du/ejWnTpiEqKgpbt27F7NmzkZSUhE8++aTC/Pv378fatWvx5JNPwsnJCZ9++inuv/9+JCYmwt3dvdpcJSUl6N27Ny5cuICnnnoKTZo0werVqzF58mTk5ubi2WefRevWrfHjjz9i5syZCAgIwPPPPw8A5j/QqrNx40YUFhZi7Nix8PHxQe/evbFy5Uo89NBDFeZbvnw5pk6divDwcMyZMwcuLi44evQotmzZYp53+/btGDp0KHx9ffHss8/Cx8cHcXFx+OOPP/Dss8/e+MmvxrJly1BaWopHH30UarUabm5uyM/Px//+9z+MGzcO06dPR0FBAb799lsMGDAAhw4dqrDL5LRp07B8+XIMGjQIjzzyCAwGA/bt24eDBw+iY8eOmDhxIqZPn46TJ0+iTZs25vsdPnwY586dw6uvvlptNgcHB4wYMQJr1qxBdnY23NzczLetWrUKRqPRXCJWr16N4uJiPPHEE3B3d8ehQ4fw2Wef4erVq1i9enWNnhtLaWlpuOuuu8x/LHt6emLz5s2YNm0a8vPzzQN7JCUlITExEe3bt69yOUajsVIRsbOzg6OjI4DyLXsDBgxA9+7d8eGHH5p3O3zsscewfPlyTJkyBc888wzi4+Px+eef4+jRo/j7778rbK24cOECRo8ejWnTpmHSpEn47rvvMHnyZHTo0AHh4eEAygcm6dGjB+Li4jB16lS0b98emZmZ2LhxI65evQoPDw/z8t577z3IZDK88MILyMvLw/vvv4/x48fj33//rfb5GjVqFM6dO4eff/4Zn3zyiXl5194z7777Ll577TWMGTMGjzzyCDIyMvDZZ5+hZ8+eOHr0KFxcXDBlyhSsXbsWs2bNQv/+/REYGIgTJ05g3rx5mDZtGgYPHoyioiIsWbIETzzxBEaOHGk+Zu1Gu5G9+eabWLBgAR555BF07twZ+fn5OHLkCGJiYiptfbG0b98+bNy4ETNmzAAALFiwAEOHDsWLL76IL7/8Ek8++SRycnLw/vvvY+rUqdi1a9cNl2fp8OHDOHDgAMaOHYuAgABcvnwZS5YsQe/evXH69OlKu6E++eST8PT0xOuvv46ioqLbeqzr/fjjj5g0aRIGDBiAhQsXori4GEuWLEH37t1x9OhRc8G7//77cerUKTz99NMICQlBeno6tm/fjsTERISEhGDRokV4+umn4ejoiLlz5wJApd8xHTp0wPr162uclajOiURU65YtWyYCEA8fPlztPFqtVmzXrp35+htvvCFe/xb95JNPRABiRkZGtcs4fPiwCEBctmxZpdt69eolAhCXLl1a5W29evUyX9+9e7cIQPT39xfz8/PN03/99VcRgLh48WLztODgYHHSpEk3XeaNsk2aNEkMDg42X1+/fr0IQHznnXcqzDd69GhREATxwoUL5mkARJVKVWHasWPHRADiZ599Vumxrrdo0SIRgLhixQrztLKyMvHuu+8WHR0dK/zswcHB4pAhQ264vOsNHTpU7Natm/n6119/LSoUCjE9Pd08LTc3V3RychK7dOkilpSUVLi/yWQSRVEUDQaD2KRJEzE4OFjMycmpch5RrPx8X2P53MbHx4sARGdn5wpZrj2WTqerMC0nJ0f09vYWp06dap62a9cuEYD4zDPPVHq8a5lyc3NFOzs78aWXXqpw+zPPPCM6ODiIhYWFle57vU2bNokAxK+++qrC9Lvuukv09/cXjUajKIqiWFxcXOm+CxYsEAVBEBMSEszTLN9P156Hql6PAMQ33njDfH3atGmir6+vmJmZWWG+sWPHilqt1pxhx44dIgDx999/r7TMa+8/y8u1986kSZNEAOLLL79c4X779u0TAYgrV66sMH3Lli2VpgcHB4sAxL1795qnpaeni2q1Wnz++efN015//XURgLh2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j5uHVyeqF+podD2iRu3acK7XLiqVSvTx8RH79+8vLl68uMLQstdYDlG7c+dOccSIEaKfn5+oUqlEPz8/cdy4ceK5c+cq3G/Dhg1iWFiYqFAoKgx/3KtXLzE8PLzKfNUND/7zzz+Lc+bMEb28vESNRiMOGTKkwpDL13z00Ueiv7+/qFarxW7duolHjhypcrjq6rJVNXRuQUGBOHPmTNHPz09UKpVi8+bNxQ8++KDCkNiiWD7E7owZMyplqm7YcktpaWnilClTRA8PD1GlUolt27atcsjoWxkePDo6WgQgvvbaa9XOc/nyZRGAOHPmTPO0jRs3il27dhU1Go3o7Owsdu7cWfz5558r3G///v1i//79RScnJ9HBwUGMiIioNPz5ihUrxKZNm4oqlUqMiooSt27dWu3w4FUN82symcT58+eLwcHBolqtFtu1ayf+8ccfVa4fg8EgfvDBB2KrVq1ElUolenp6ioMGDRKjo6MrLff9998XAYjz58+/0dNXrU6dOokAxC+//LLSbadPnxb79esnOjo6ih4eHuL06dPNw8Nfvx6rGvK5uLhYnDZtmqjVakUnJydxzJgxYnp6epXDTaelpYkzZswQAwMDRaVSKfr4+Ih9+/YVv/766wrzxcTEiADEffv2VZh+o/efKJa/BxwcHKq9/euvvxY7dOggajQa0cnJSWzbtq344osvisnJyeZ5qnuNVvVezMrKEp966inR399fVKlUYkBAgDhp0iTzEOjXPgNWr15d4X43Glbd0ttvvy36+/uLMpms0nDZv/32m9i9e3fRwcFBdHBwEFu1aiXOmDFDPHv2rCiKojhq1CjRyclJvHz5coVlbtiwQQQgLly40DztwIEDYocOHUSVSnXTocLfeecdsXPnzqKLi4uo0WjEVq1aie+++65YVlZmnqe64cEtP2eqey9V9dzdyvDgOTk55s8iR0dHccCAAeKZM2cqfZbdyukmqmM5PPj1mQcMGCBqtVrRzs5ODA0NFSdPniweOXJEFEVRzMzMFGfMmCG2atVKdHBwELVardilSxfx119/rbCc1NRUcciQIaKTk5MIoMLrbsmSJaK9vX2Vv++IbJUgihId7UxERI3C4sWLMXPmTFy+fLnKUdkamr59+8LPz8987CERlW9d7t27d6UThhPZMhYlIiKqNaIoIjIyEu7u7pXO+dNQ/fvvv+jRowfOnz9vtYFHiOqzLVu2YPTo0bh06RK8vLykjkN0y1iUiIjI6oqKirBx40bs3r0b33zzDTZs2IDhw4dLHYuIiOiWsSgREZHVXb58GU2aNIGLiwuefPLJCsN6ExER1QcsSkRERERERBZ4HiUiIiIiIiILLEpEREREREQWGvwJZ00mE5KTk+Hk5GSVk/8REREREVH9JIoiCgoK4OfnB5nsxtuMGnxRSk5ORmBgoNQxiIiIiIjIRly5cgUBAQE3nKfBFyUnJycA5U+Gs7OzxGmIiIiIiEgq+fn5CAwMNHeEG2nwRena7nbOzs4sSkREREREdEuH5HAwByIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVlgUSIiIiIiIrLAokRERERERGSBRYmIiIiIiMgCixIREREREZEFFiUiIiIiIiILLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIgqRFae/evRg2bBj8/PwgCALWr19faZ64uDgMHz4cWq0WDg4O6NSpExITE+s+LBERERERNRqSFqWioiJERkbiiy++qPL2ixcvonv37mjVqhX27NmD48eP47XXXoOdnV0dJyUiIiIiosZEEEVRlDoEAAiCgHXr1uG+++4zTxs7diyUSiV+/PHHGi83Pz8fWq0WeXl5cHZ2tkJSIiIiIiKqj26nGyjqKNNtM5lM2LRpE1588UUMGDAAR48eRZMmTTBnzpwKZcqSTqeDTqczX8/Pz6+DtERERJSYmIjMzEypYzRYHh4eCAoKkjoGUaNhs0UpPT0dhYWFeO+99/DOO+9g4cKF2LJlC0aNGoXdu3ejV69eVd5vwYIFmDdvXh2nJSIiatwSExPRqnVrlBQXSx2lwdLY2+NMXBzLElEdsdmiZDKZAAAjRozAzJkzAQBRUVE4cOAAli5dWm1RmjNnDmbNmmW+np+fj8DAwNoPTERE1IhlZmaipLgY41/6AN5BoVLHaXDSEi9i5cLZyMzMZFEiqiM2W5Q8PDygUCgQFhZWYXrr1q2xf//+au+nVquhVqtrOx4RERFVwTsoFAHNw6WOQUR0x2z2PEoqlQqdOnXC2bNnK0w/d+4cgoODJUpFRERERESNgaRblAoLC3HhwgXz9fj4eMTGxsLNzQ1BQUGYPXs2HnzwQfTs2RN9+vTBli1b8Pvvv2PPnj3ShSYiIiIiogZP0qJ05MgR9OnTx3z92rFFkyZNwvLlyzFy5EgsXboUCxYswDPPPIOWLVvit99+Q/fu3aWKTEREREREjYCkRal379642Wmcpk6diqlTp9ZRIiIiIiIiIhs+RomIiIiIiEgqLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIAosSERERERGRBRYlIiIiIiIiCyxKREREREREFliUiIiIiIiILLAoERERERERWWBRIiIiIiIissCiREREREREZIFFiYiIiIiIyAKLEhERERERkQUWJSIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVlgUSIiIiIiIrLAokRERERERGSBRYmIiIiIiMgCixIREREREZEFFiUiIiIiIiILLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIAosSERERERGRBRYlIiIiIiIiCyxKREREREREFliUiIiIiIiILLAoERERERERWWBRIiIiIiIissCiREREREREZIFFiYiIiIiIyAKLEhERERERkQUWJSIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVmQtCjt3bsXw4YNg5+fHwRBwPr166ud9/HHH4cgCFi0aFGd5SMiIiIiosZJ0qJUVFSEyMhIfPHFFzecb926dTh48CD8/PzqKBkRERERETVmCikffNCgQRg0aNAN50lKSsLTTz+NrVu3YsiQIXWUjIiIiIiIGjNJi9LNmEwmTJw4EbNnz0Z4ePgt3Uen00Gn05mv5+fn11Y8IiIiIiJqoGx6MIeFCxdCoVDgmWeeueX7LFiwAFqt1nwJDAysxYRERERERNQQ2WxRio6OxuLFi7F8+XIIgnDL95szZw7y8vLMlytXrtRiSiIiIiIiaohstijt27cP6enpCAoKgkKhgEKhQEJCAp5//nmEhIRUez+1Wg1nZ+cKFyIiIiIiotths8coTZw4Ef369aswbcCAAZg4cSKmTJkiUSoiIiIiImoMJC1KhYWFuHDhgvl6fHw8YmNj4ebmhqCgILi7u1eYX6lUwsfHBy1btqzrqERERERE1IhIWpSOHDmCPn36mK/PmjULADBp0iQsX75colRERERERNTYSVqUevfuDVEUb3n+y5cv114YIiIiIiKi/9jsYA5ERERERERSYVEiIiIiIiKywKJERERERERkgUWJiIiIiIjIAosSERERERGRBRYlIiIiIiIiCyxKREREREREFliUiIiIiIiILLAoERERERERWWBRIiIiIiIissCiREREREREZIFFiYiIiIiIyAKLEhERERERkQUWJSIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVlgUSIiIiIiIrLAokRERERERGSBRYmIiIiIiMgCixIREREREZEFFiUiIiIiIiILLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIAosSERERERGRBYXUAYiIiIhuh8kkIq9Uj5ziMuQW61FQYkBxmQHFZUYU640wGE0wiiKMJhEQAYVcBoVcgFIug71SDkc7BRzVCjjZKeDuqIaHgwoKOb87JqKKWJSIiIjIZomiiNwSPVJyS5GWX4q0glJkFpTBKIq3vhCD6YY3CwBc7JXwcbZDgKs9Alw1cNYo7yw4EdV7LEpERERkU0rKjEjIKkJiTjGuZJegUGeoNI9CJsDFXglXexWcNUo4qOSwVymgUcmhlAuQywTIBQGCIEBvNMFgFKE3mlBUZkChrvySV6xHZmEZSvRG5BTrkVOsR1xqAQBAq1Ei1NMBzbwc4eNsB0EQ6vppICKJsSgRERGR5PJL9biYXoiLGUVIzi3B9duL5IIAb2c1fLR28HYuvzjbKaxSXkRRRHGZERmFOiTllOBqTgnSCkqRV6JHTGIuYhJz4ahWoIW3I9r4a+Fqr7rjxySi+oFFiYiIiCRRqjfifHohzqTmIzm3tMJtHo4qBLs7INBVAz8XDZS1dAyRIAhwUCvgoFYgxN0BAFBmMCExuxgX0gtxKbMQhTqDuTQFuGoQ4a9FqKcjZDJuZSJqyFiUiIiIqM6IooirOSU4mZSHixlFFY418nfRINTTAaGejpIeI6RSyNDMyxHNvBxhMJqQkF2Mk0l5uJxVjKv/bXVytlOgY7AbWvs6cSAIogaKRYmIiIhqnU5vxKnkfJxIykNuid483cNRhVY+zmjh7QgnO9sbQEEhlyHU0xGhno7IL9Gbf4b8UgN2nU3Hv/FZ6BDsirYBWihk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Tz9hw4YNcHJyQmpqKgBAq9VCo9FInK72iaKIglIDckv0yP9v4IP8Uv1/xai8DN3KRiCZADioFXBQKeDwX9FxUP9/GbpWgjQqORQyWa3/XEREREREtszmi9KSJUsAAL17964wfdmyZZg8eXLdB6olZQYTsovLkFtUhpxiPXKKy5BTXIbcYj0MN9kfTi4T4GyngLOdEk4aBZzUyvIydF0xssYxQEREREREjYXNFyVRvM2DZmydIEOBHjifXoDMwjJkFeqQWViGvBJ9tXeRCYBWo4SzRglnO2V5Kfrv/0525VuCWIKIiIiIiKzH5otSQ/L23mwEzvwV21JUQEpqpdvtVXK42qvgaq+Eq70KLg7l/2rtlDwWiIiIiIioDrEo1SG9SYRMaQe5IMLd0Q4ejmp4OKrg4aiGu6MK9iquDiIiIiIiW8C/zOvQlChnjB09Ck+//TkCW7SQOg4REREREVWDw5vVoSYuShhyksHDiYiIiIiIbBuLEhERERERkQUWJSIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVlgUSIiIiIiIrLAokRERERERGSBRYmIiIiIiMgCixIREREREZEFFiUiIiIiIiILLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIAosSERERERGRBRYlIiIiIiIiCyxKREREREREFliUiIiIiIiILLAoERERERERWWBRIiIiIiIissCiREREREREZIFFiYiIiIiIyAKLEhERERERkQUWJSIiIiIiIgssSkRERERERBZYlIiIiIiIiCywKBEREREREVlgUSIiIiIiIrLAokRERERERGSBRYmIiIiIiMgCixIREREREZEFFiUiIiIiIiILLEpEREREREQWWJSIiIiIiIgssCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJiIiIiIjIQr0oSl988QVCQkJgZ2eHLl264NChQ1JHIiIiIiKiBszmi9KqVaswa9YsvPHGG4iJiUFkZCQGDBiA9PR0qaMREREREVEDZfNF6eOPP8b06dMxZcoUhIWFYenSpbC3t8d3330ndTQiIiIiImqgFFIHuJGysjJER0djzpw55mkymQz9+vXDP//8U+V9dDoddDqd+XpeXh4AID8/v3bD3oLCwkIAwNXzp6ArKZY4TcOTlngRAJB6+RwuOthLnKbh4fNbu/j81j4+x7WLz2/t4vNbu/j81q6Mq/EAyv8Wlvpv8muPL4riTecVxFuZSyLJycnw9/fHgQMHcPfdd5unv/jii/jrr7/w77//VrrPm2++iXnz5tVlTCIiIiIiqkeuXLmCgICAG85j01uUamLOnDmYNWuW+brJZEJ2djbc3d0hCIKEyQgob/GBgYG4cuUKnJ2dpY5DVsB12jBxvTY8XKcNE9drw8N1WrtEUURBQQH8/PxuOq9NFyUPDw/I5XKkpaVVmJ6WlgYfH58q76NWq6FWqytMc3Fxqa2IVEPOzs588zcwXKcNE9drw8N12jBxvTY8XKe1R6vV3tJ8Nj2Yg0qlQocOHbBz507zNJPJhJ07d1bYFY+IiIiIiMiabHqLEgDMmjULkyZNQseOHdG5c2csWrQIRUVFmDJlitTRiIiIiIiogbL5ovTggw8iIyMDr7/+OlJTUxEVFYUtW7bA29tb6mhUA2q1Gm+88Ual3SOp/uI6bZi4XhsertOGieu14eE6tR02PeodERERERGRFGz6GCUiIiIiIiIpsCgRERERERFZYFEiIiIiIiKywKJERERERERkgUWJ7sgXX3yBkJAQ2NnZoUuXLjh06FC18/bu3RuCIFS6DBkypMJ8cXFxGD58OLRaLRwcHNCpUyckJibW9o9C17H2eq3qdkEQ8MEHH9TFj0Ow/jotLCzEU089hYCAAGg0GoSFhWHp0qV18aPQday9XtPS0jB58mT4+fnB3t4eAwcOxPnz5+viR6H/3M46BYBFixahZcuW0Gg0CAwMxMyZM1FaWnpHyyTrsvY63bt3L4YNGwY/Pz8IgoD169fX8k/QiIlENfTLL7+IKpVK/O6778RTp06J06dPF11cXMS0tLQq58/KyhJTUlLMl5MnT4pyuVxctmyZeZ4LFy6Ibm5u4uzZs8WYmBjxwoUL4oYNG6pdJllfbazX629PSUkRv/vuO1EQBPHixYt19FM1brWxTqdPny6GhoaKu3fvFuPj48WvvvpKlMvl4oYNG+ropyJrr1eTySTeddddYo8ePcRDhw6JZ86cER999FExKChILCwsrMOfrPG63XW6cuVKUa1WiytXrhTj4+PFrVu3ir6+vuLMmTNrvEyyrtpYp3/++ac4d+5cce3atSIAcd26dXX00zQ+LEpUY507dxZnzJhhvm40GkU/Pz9xwYIFt3T/Tz75RHRycqrwC/jBBx8UJ0yYYPWsdOtqY71aGjFihHjPPffccVa6NbWxTsPDw8W33nqrwnzt27cX586da53QdFPWXq9nz54VAYgnT56ssExPT0/xm2++sW54qtLtrtMZM2ZU+iydNWuW2K1btxovk6yrNtbp9ViUahd3vaMaKSsrQ3R0NPr162eeJpPJ0K9fP/zzzz+3tIxvv/0WY8eOhYODAwDAZDJh06ZNaNGiBQYMGAAvLy906dKFm5TrUG2sV0tpaWnYtGkTpk2bZpXMdGO1tU67du2KjRs3IikpCaIoYvfu3Th37hzuvfdeq/8MVFltrFedTgcAsLOzq7BMtVqN/fv3WzE9VaUm67Rr166Ijo4278p16dIl/Pnnnxg8eHCNl0nWUxvrlOoWixLVSGZmJoxGI7y9vStM9/b2Rmpq6k3vf+jQIZw8eRKPPPKIeVp6ejoKCwvx3nvvYeDAgdi2bRtGjhyJUaNG4a+//rL6z0CV1cZ6tfT999/DyckJo0aNuuO8dHO1tU4/++wzhIWFISAgACqVCgMHDsQXX3yBnj17WjU/Va021murVq0QFBSEOXPmICcnB2VlZVi4cCGuXr2KlJQUq/8MVFFN1ulDDz2Et956C927d4dSqURoaCh69+6NV155pcbLJOupjXVKdYtFiSTx7bffom3btujcubN5mslkAgCMGDECM2fORFRUFF5++WUMHTqUB4nXE1WtV0vfffcdxo8fX+Fba7Jd1a3Tzz77DAcPHsTGjRsRHR2Njz76CDNmzMCOHTskSkq3o6r1qlQqsXbtWpw7dw5ubm6wt7fH7t27MWjQIMhk/HPBFu3Zswfz58/Hl19+iZiYGKxduxabNm3C22+/LXU0qiGuU9uikDoA1U8eHh6Qy+VIS0urMD0tLQ0+Pj43vG9RURF++eUXvPXWW5WWqVAoEBYWVmF669atudtHHamN9Xq9ffv24ezZs1i1apVV8tLN1cY6LSkpwSuvvIJ169aZR0yLiIhAbGwsPvzwwwq7mVDtqK33aocOHRAbG4u8vDyUlZXB09MTXbp0QceOHa2anyqryTp97bXXMHHiRPOWwbZt26KoqAiPPvoo5s6de0evE7pztbFO+aVF3eKzTTWiUqnQoUMH7Ny50zzNZDJh586duPvuu29439WrV0On02HChAmVltmpUyecPXu2wvRz584hODjYeuGpWrWxXq/37bffokOH/2vnfkKiWv84jn/mmmXTmINkhKVBliVlkooLK5Q200JRFJRMSxzQKIoWQglCQUsxEKMoKqWFplG4aZEutAb/EIImUeL4J0uwViaKmKbPXcTPfk4l96aTc+v9grPwPMfnPF++HuTDc2biFBMTs2JrxtK80dPZ2VnNzs5+8w/bz89vYWcY3uXtZzUoKEghISFyu93q7OxUWlraiq0d3/czPZ2amvrucyhJxphl/Z1g+bzRU/xiq/xlEvgPu3//vlm3bp2prq42r169MoWFhcZut5v3798bY4zJy8szFy9e/Ob3Dh06ZLKzs78756NHj4y/v7+5deuWcbvdprKy0vj5+RmXy+XVWvCVN/pqjDHj4+PGarWaGzdueG3t+D5v9DQpKcns3bvXNDc3m8HBQVNVVWUCAgLM9evXvVoLvvJGX+vr601zc7MZGBgwDQ0NZvv27SYjI8OrdeCrf9vTS5cumcDAQFNbW2sGBwdNY2OjiYiIMFlZWf94TniXN3o6MTFhurq6TFdXl5Fkrl69arq6uszw8PAvr+93R1DCslRWVprw8HCzdu1ak5CQYDo6OhbGkpKSzMmTJxdd39vbaySZxsbGH855584ds3PnThMQEGBiYmJMQ0ODt5aPH/BGX2/evGnWr19vPn786K1lYwkr3dPR0VGTn59vQkNDTUBAgNm9e7cpLy838/Pz3iwDHla6rxUVFWbbtm3G39/fhIeHm9LSUvPp0ydvlgAP/6ans7Oz5vLlyyYiIsIEBASYsLAwc/r0aTM2NvaP54T3rXRPm5ubjaRvDs/nHctnMYZ9PAAAAAD4f3xGCQAAAAA8EJQAAAAAwANBCQAAAAA8EJQAAAAAwANBCQAAAAA8EJQAAAAAwANBCQAAAAA8EJQAAAAAwANBCQDw20lOTtb58+dXexkAgP8wghIAwKekpqbq6NGj3x1zuVyyWCzq6en5xasCAPxpCEoAAJ/idDrV1NSkkZGRb8aqqqoUHx+v/fv3r8LKAAB/EoISAMCnpKSkKCQkRNXV1YvOT05O6sGDB0pPT9exY8e0detWWa1WRUdHq7a2dsk5LRaLGhoaFp2z2+2L7vHu3TtlZWXJbrcrODhYaWlpevPmzcJ4S0uLEhIStGHDBtntdh08eFDDw8PLrBYA4KsISgAAn7JmzRqdOHFC1dXVMsYsnH/w4IHm5uaUm5uruLg4PX78WC9fvlRhYaHy8vL0/Pnzn77n7OysHA6HAgMD5XK51NraKpvNpqNHj2pmZkafP39Wenq6kpKS1NPTo/b2dhUWFspisaxEyQAAH7RmtRcAAICngoIClZWV6enTp0pOTpb05bW7zMxMbd++XcXFxQvXnj17Vk+ePFF9fb0SEhJ+6n51dXWan5/X7du3F8JPVVWV7Ha7WlpaFB8fr/HxcaWkpCgiIkKSFBUVtbwiAQA+jR0lAIDP2bNnjxITE3X37l1JUn9/v1wul5xOp+bm5nTlyhVFR0crODhYNptNT5480du3b3/6fi9evFB/f78CAwNls9lks9kUHBys6elpDQwMKDg4WPn5+XI4HEpNTVVFRYVGR0dXqlwAgA8iKAEAfJLT6dTDhw81MTGhqqoqRUREKCkpSWVlZaqoqNCFCxfU3Nys7u5uORwOzczM/HAui8Wy6DU+6cvrdv8zOTmpuLg4dXd3Lzr6+vqUk5Mj6csOU3t7uxITE1VXV6fIyEh1dHR4p3gAwKojKAEAfFJWVpb++usv1dTU6N69eyooKJDFYlFra6vS0tKUm5urmJgY7dixQ319fUvOFRISsmgHyO12a2pqauHn2NhYud1ubd68WTt37lx0BAUFLVx34MABlZSUqK2tTfv27VNNTc3KFw4A8AkEJQCAT7LZbMrOzlZJSYlGR0eVn58vSdq1a5eamprU1tam169fq6ioSB8+fFhyriNHjujatWvq6upSZ2enTp06JX9//4Xx48ePa9OmTUpLS5PL5dLQ0JBaWlp07tw5jYyMaGhoSCUlJWpvb9fw8LAaGxvldrv5nBIA/MYISgAAn+V0OjU2NiaHw6HQ0FBJUmlpqWJjY+VwOJScnKwtW7YoPT19yXnKy8sVFhamw4cPKycnR8XFxbJarQvjVqtVz549U3h4uDIyMhQVFSWn06np6Wlt3LhRVqtVvb29yszMVGRkpAoLC3XmzBkVFRV5s3wAwCqyGM+XtgEAAADgD8eOEgAAAAB4ICgBAAAAgAeCEgAAAAB4ICgBAAAAgAeCEgAAAAB4ICgBAAAAgAeCEgAAAAB4ICgBAAAAgAeCEgAAAAB4ICgBAAAAgAeCEgAAAAB4+Buzj/c0PBklSQAAAABJRU5ErkJggg==",
|
| 106 |
+
"text/plain": [
|
| 107 |
+
"<Figure size 1000x600 with 1 Axes>"
|
| 108 |
+
]
|
| 109 |
+
},
|
| 110 |
+
"metadata": {},
|
| 111 |
+
"output_type": "display_data"
|
| 112 |
+
}
|
| 113 |
+
],
|
| 114 |
+
"source": [
|
| 115 |
+
"import numpy as np\n",
|
| 116 |
+
"import matplotlib.pyplot as plt\n",
|
| 117 |
+
"import seaborn as sns\n",
|
| 118 |
+
"\n",
|
| 119 |
+
"# 假设这是你的列表\n",
|
| 120 |
+
"data = fr_list \n",
|
| 121 |
+
"\n",
|
| 122 |
+
"# 使用Freedman-Diaconis规则自动确定bin的数量\n",
|
| 123 |
+
"bins = np.histogram_bin_edges(data, bins='fd')\n",
|
| 124 |
+
"\n",
|
| 125 |
+
"# 设置图形大小\n",
|
| 126 |
+
"plt.figure(figsize=(10, 6))\n",
|
| 127 |
+
"\n",
|
| 128 |
+
"# 使用seaborn绘制直方图\n",
|
| 129 |
+
"sns.histplot(data=data, bins=bins, kde=True)\n",
|
| 130 |
+
"\n",
|
| 131 |
+
"# 添加标题和轴标签\n",
|
| 132 |
+
"plt.title('Distribution of Accuracy Value(French text similar Test)')\n",
|
| 133 |
+
"plt.xlabel('Values')\n",
|
| 134 |
+
"plt.ylabel('Frequency')\n",
|
| 135 |
+
"\n",
|
| 136 |
+
"# 显示图形"
|
| 137 |
+
]
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"cell_type": "code",
|
| 141 |
+
"execution_count": 7,
|
| 142 |
+
"id": "b5daf611-35c4-4f16-bf95-089307a30128",
|
| 143 |
+
"metadata": {},
|
| 144 |
+
"outputs": [
|
| 145 |
+
{
|
| 146 |
+
"data": {
|
| 147 |
+
"text/plain": [
|
| 148 |
+
"Text(0, 0.5, 'Frequency')"
|
| 149 |
+
]
|
| 150 |
+
},
|
| 151 |
+
"execution_count": 7,
|
| 152 |
+
"metadata": {},
|
| 153 |
+
"output_type": "execute_result"
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"data": {
|
| 157 |
+
"image/png": "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evd74MAB3HbbbXBzc4OjoyOGDRuGv//+u9Y6xcXFeOqppxAWFgaNRmNs9Tt69Giz91XX9T4bmrLfmh+YZsyYUWvfe/bsgVKpxIIFCwBUf1adPn0aO3fubHI3su+++w69e/c2vje7detW633X0DlKNZ+1J06cwLBhw+Do6IgOHToYz/ncuXMn+vfvDwcHB3Tq1AlbtmypdZ8NnaNUV1Pfq9d6v7fU2bNncffdd8PT0xP29vbo06cPNmzYUGsdnU6HV199FZGRkbC3t4eXlxcGDx6MzZs3A6j+XProo48AoFa3vqvdcsst+PXXX+t95hOZAxZKRG2o5nyXa3WjOX36NG6//XZotVq89tprWLZsGSZMmGD8whAVFYXXXnsNAPDoo4/iq6++wldffYWhQ4ca95Gbm4sxY8agR48eWL58OUaMGHHNXIsWLcLvv/+OBQsWYM6cOdi8eTNGjRp13S+hdTUl29WEEJgwYQLee+893HbbbXj33XfRqVMnzJ8/H/Pmzau3/p49e/DEE09gypQpeOutt1BRUYG77roLubm518xVXl6O4cOH46uvvsLUqVPx9ttvw83NDQ888IDxy1BUVBS++uoreHt7o0ePHsbsPj4+19z3hg0bUFJSgilTpsDf3x/Dhw/H119/XW+91atXY9y4ccjLy8PChQuxZMkS9OjRo1aht3nzZgwdOhRnzpzB3LlzsWzZMowYMQK//fbbNTNcy+eff44PPvgAjz76KJYtWwZPT08UFRXhv//9L4YPH46lS5filVdeQXZ2NkaPHl3v/JGHHnoITz31FIKDg7F06VI899xzsLe3x/79+wFUH9MnTpzAqVOnam136NAhnD9//pq/UDs5OWHixInYtGkT8vLyat22du1a6PV6TJ06FQDwww8/oKysDI8//jg++OADjB49Gh988EG9L803IjMzEwMGDMCWLVvw5JNPYsWKFejQoQMeeughLF++3LheamoqkpKS0KtXr1rb79mzB3l5ebj//vub1VLwz3/+E8ePH8fLL7+Mxx9/HL/++iuefPLJJm27ZMkSrFu3Ds888wwWLlyI/fv3G5+zGtu2bcPQoUNRVFSEl19+GW+++SYKCgpw88034+DBg8b1/vGPf2DlypW466678PHHH+OZZ56Bg4MD4uLimr2vuq732dCU/UZFReH111/HV199ZfzCXlpaigceeACdO3c27n/58uUICgpC586djffzwgsvNJpt8+bNuO++++Dh4YGlS5diyZIlGD58+HWLPwDIz8/H7bffjv79++Ott96CRqPBlClTsHbtWkyZMgVjx47FkiVLUFpairvvvrvZ56k2570KNPx+b4nTp09jwIABiIuLw3PPPYdly5bByckJd9xxB9atW2dc75VXXsGrr76KESNG4MMPP8QLL7yAkJAQY3H92GOP4ZZbbgEA42vx1Vdf1bqv3r17o6CgAKdPn25RVqJWJYjIZD7//HMBQBw6dKjRddzc3ETPnj2N119++WVx9VvxvffeEwBEdnZ2o/s4dOiQACA+//zzercNGzZMABCrVq1q8LZhw4YZr2/fvl0AEO3atRNFRUXG5d9//70AIFasWGFcFhoaKmbOnHndfV4r28yZM0VoaKjx+vr16wUA8cYbb9Ra7+677xaSJIn4+HjjMgBCrVbXWnb8+HEBQHzwwQf17utqy5cvFwDEmjVrjMsqKyvFwIEDhbOzc63HHhoaKsaNG3fN/V3t9ttvF4MGDTJe//TTT4VKpRJZWVnGZQUFBcLFxUX0799flJeX19reYDAIIYSoqqoS4eHhIjQ0VOTn5ze4jhD1n+8adZ/bhIQEAUC4urrWylJzX1qtttay/Px84efnJx588EHjsm3btgkAYs6cOfXuryZTQUGBsLe3FwsWLKh1+5w5c4STk5MoKSmpt+3Vfv/9dwFAfPLJJ7WWDxgwQLRr107o9XohhBBlZWX1tl28eLGQJEkkJiYal9V9P9U8Dw0djwDEyy+/bLz+0EMPiYCAAJGTk1NrvSlTpgg3Nzdjhi1btggA4tdff6213ooVKwQAsW7dums+5ho1nxejRo2q9Ro//fTTQqlUioKCAuOyxt67UVFRtV7LmgwnT54UQlS/TpGRkWL06NG17qOsrEyEh4eLW265xbjMzc1NzJ49u9G8zdlXQxr7bGjOfvV6vRg8eLDw8/MTOTk5Yvbs2UKlUtX7zI2Ojm7wfdKQuXPnCldXV1FVVdXoOjXP9/bt243Laj5rv/nmG+Oys2fPCgBCoVCI/fv3G5dv2rSp3mOvef0TEhJq7fPq3E19r17r/X492dnZ9d4LI0eOFN26dRMVFRXGZQaDQdx0000iMjLSuCwmJua6n5ezZ88W1/q6uXfvXgFArF27tlm5idoCW5SI2pizs/M1f1V0d3cHAPzyyy8tHvhAo9Fg1qxZTV5/xowZcHFxMV6/++67ERAQ0OrDtv7xxx9QKpWYM2dOreX/+te/IISoN4LcqFGjEBERYbzevXt3uLq64tKlS9e9H39/f9x3333GZXZ2dpgzZw5KSkqwc+fOFuXPzc3Fpk2bau33rrvuMnaJqrF582YUFxcbW2OuVtMN5dixY0hISMBTTz1lPAbqrtMSd911V71WMaVSaTxvwWAwIC8vD1VVVejTp0+tblY//fQTJElqcGCLmkxubm6YOHEivv32W2PXGb1ej7Vr1+KOO+647rlat956K3x8fGp1v0tISMD+/ftx3333QaGo/jNVc04fUN2KkJOTg5tuuglCCBw7dqw5T0mDhBD46aefMH78eAghkJOTY7yMHj0ahYWFxuempgXTw8Oj1j6KiooAoNZ7qSkeffTRWq/xkCFDoNfrmzTs+KxZs2qdgzJkyBAAML4nYmNjceHCBdx///3Izc01PqbS0lKMHDkSu3btMn7OuLu748CBA0hLS2vwvpqzr+Zozn4VCgVWr16NkpISjBkzBh9//DEWLlxY65zQ5nJ3d0dpaamxu1hzODs71zq/rlOnTnB3d0dUVBT69+9vXF7z/+t9VtXV1PdqjYbe782Vl5eHbdu2YfLkySguLja+Hrm5uRg9ejQuXLiA1NRUANXP3enTp3HhwoUW31/N+ygnJ+eGchO1BhZKRG2spKTkml+k7r33XgwaNAgPP/ww/Pz8MGXKFHz//ffN+gLSrl27Zp38HRkZWeu6JEno0KHDdc/PuVGJiYkIDAys93xERUUZb79aSEhIvX14eHggPz//uvcTGRlp/NJ9vftpqrVr10Kn06Fnz56Ij49HfHw88vLy0L9//1rd7y5evAgA6Nq1a6P7aso6LREeHt7g8i+++ALdu3c3nlfg4+OD33//HYWFhbUyBQYGXrf7zowZM5CUlITdu3cDALZs2YLMzMwmDa2uUqlw7733Yvfu3cYvXzVF09VdyJKSkvDAAw/A09MTzs7O8PHxwbBhwwCgVuaWys7ORkFBAT799FP4+PjUutT86JCVlVVrG1HnnApXV1cAaHb3qrrHdc0Xx+sd103ZtuYL7MyZM+s9rv/+97/QarXG5++tt97CqVOnEBwcjH79+uGVV16p9cW+OftqjubuNyIiAq+88goOHTqE6OjoGx5e+oknnkDHjh0xZswYBAUF4cEHH2zyuY9BQUH1fshwc3NDcHBwvWVA017TupryXq3R2Pu9OeLj4yGEwIsvvljv9aj50aTmvfDaa6+hoKAAHTt2RLdu3TB//nycOHGiWfdX8z5qq/nPiJqDo94RtaGUlBQUFhbWGpq1LgcHB+zatQvbt2/H77//jj///BNr167FzTffjL/++qtJ5z5c/eu7qTT2R0yv17fqyE1Xa+x+6n5hbSs1xdCgQYMavP3SpUto3769Se9TkqQGH69er29w/YaOhTVr1uCBBx7AHXfcgfnz58PX1xdKpRKLFy82FmzNMXr0aPj5+WHNmjUYOnQo1qxZA39/f4waNapJ20+bNg0ffvghvv32WzzzzDP49ttv0aVLF+MQ0nq9Hrfccgvy8vKwYMECdO7cGU5OTkhNTcUDDzxwzR8RrnXcXq1mH9OmTcPMmTMb3KZmpDAvLy8A9b/0du7cGQBw8uRJ3HHHHdd+0Fe5keP6etvWPK6333670SG5nZ2dAQCTJ0/GkCFDsG7dOvz11194++23sXTpUvz8888YM2ZMs/bVHC3Zb815nmlpacjNzYW/v3+z77eGr68vYmNjsWnTJmzcuBEbN27E559/jhkzZtQa8KUhjT3/pvqsau571RSf/TWvxzPPPNPoYCw1f8OGDh2Kixcv4pdffsFff/2F//73v3jvvfewatUqPPzww026v5r3kbe39w1nJzI1FkpEbajmJNZrjQQGVHcvGTlyJEaOHIl3330Xb775Jl544QVs374do0aNMvkvb3W7TQghEB8fX2sIWQ8PDxQUFNTbNjExsVYx0JxsoaGh2LJlC4qLi2u1Kp09e9Z4uymEhobixIkTMBgMtVqVbuR+EhISsHfvXjz55JPGlo0aBoMB06dPxzfffIN///vfxu6Cp06darRIvnqdaxUYHh4eDXbfaU6r2I8//oj27dvj559/rvV61e1iFxERYRxo4VqtSkqlEvfffz9Wr16NpUuXYv369XjkkUeaXED3798fERER+Oabb3DLLbfg9OnTWLRokfH2kydP4vz58/jiiy9qDd7QlK5SNS0sdY/dus+Xj48PXFxcoNfrr1vg1RRECQkJtZYPHjwYHh4e+Pbbb/H888+32Q8I11JzXLm6ujapcA0ICMATTzyBJ554AllZWejVqxcWLVqEMWPGNHtfdTX22dDc/a5atQqbN2/GokWLsHjxYjz22GP1Rpps7mekWq3G+PHjMX78eBgMBjzxxBP45JNP8OKLL17zh63W1tT3qinVfJ7b2dk16fXw9PTErFmzMGvWLJSUlGDo0KF45ZVXjIXS9V6LmvdRTQs/kTlh1zuiNrJt2za8/vrrCA8Przcq1dXqjv4FwPgrq1arBQDjeR8NFS4t8eWXX9bqLvTjjz8iPT291sSpERER2L9/PyorK43Lfvvtt3rDiDcn29ixY6HX6/Hhhx/WWv7ee+9BkiSTTdw6duxYZGRkYO3atcZlVVVV+OCDD+Ds7Fyv0GmKmtakZ599FnfffXety+TJkzFs2DDjOrfeeitcXFywePFiVFRU1NpPzS/MvXr1Qnh4OJYvX17vubv6V+iIiAicPXu21vDRx48fb9IIXTVqvsBfvd8DBw5g3759tda76667IITAq6++Wm8fdX8Znz59OvLz8/HYY4+hpKSk2fOxTJ06FceOHcPLL78MSZJw//33XzOvEKLW8M2NcXV1hbe3N3bt2lVr+ccff1zrulKpxF133YWffvqp3gh+AGo93+3atUNwcLBxiPQajo6OWLBgAeLi4rBgwYIGWw/WrFlzzdHhTK13796IiIjAO++8g5KSknq31zwuvV5fryuXr68vAgMDjZ87Td1XYxr7bGjOfhMSEjB//nzcddddeP755/HOO+9gw4YN+PLLL+vdV1M/H+uOmqlQKIw/EtU8drk09b1qSr6+vhg+fDg++eQTpKen17v96tej7nPn7OyMDh061Hrervc34ciRI3Bzc0N0dLQJ0hOZFluUiFrBxo0bcfbsWVRVVSEzMxPbtm3D5s2bERoaig0bNlxz4sLXXnsNu3btwrhx4xAaGoqsrCx8/PHHCAoKwuDBgwFUf1l2d3fHqlWr4OLiAicnJ/Tv37/F/dM9PT0xePBgzJo1C5mZmVi+fDk6dOiARx55xLjOww8/jB9//BG33XYbJk+ejIsXL2LNmjW1Bldobrbx48djxIgReOGFF3D58mXExMTgr7/+wi+//IKnnnqq3r5b6tFHH8Unn3yCBx54AEeOHEFYWBh+/PFH/P3331i+fHmzT74HqgulHj161DsXocaECRPwz3/+E0ePHkWvXr3w3nvv4eGHH0bfvn1x//33w8PDA8ePH0dZWRm++OILKBQKrFy5EuPHj0ePHj0wa9YsBAQE4OzZszh9+jQ2bdoEAHjwwQfx7rvvYvTo0XjooYeQlZWFVatWITo62jiYwPXcfvvt+PnnnzFp0iSMGzcOCQkJWLVqFbp06VLri+qIESMwffp0vP/++7hw4QJuu+02GAwG7N69GyNGjKg1hHXPnj3RtWtX/PDDD4iKiqo3dPb1TJs2Da+99hp++eUXDBo0qNacUJ07d0ZERASeeeYZpKamwtXVFT/99FOTz/d4+OGHsWTJEjz88MPo06cPdu3ahfPnz9dbb8mSJdi+fTv69++PRx55BF26dEFeXh6OHj2KLVu21PoRY+LEiVi3bh2EELV+MZ8/fz5Onz6NZcuWYfv27bj77rvh7++PjIwMrF+/HgcPHsTevXub9dzcCIVCgf/+978YM2YMoqOjMWvWLLRr1w6pqanYvn07XF1d8euvv6K4uBhBQUG4++67ERMTA2dnZ2zZsgWHDh3CsmXLmrWvxlzrs6Ep+xVC4MEHH4SDgwNWrlwJoHr46Z9++glz587FqFGjEBgYCKC6+Fq5ciXeeOMNdOjQAb6+vo1OaPrwww8jLy8PN998M4KCgpCYmIgPPvgAPXr0kL2Vo6nvVVP76KOPMHjwYHTr1g2PPPII2rdvj8zMTOzbtw8pKSk4fvw4AKBLly4YPnw4evfuDU9PTxw+fBg//vhjrc+G3r17AwDmzJmD0aNHQ6lU1hoAY/PmzRg/fjzPUSLz1Gbj6xHZgJrhXmsuarVa+Pv7i1tuuUWsWLGi1jDUNeoOZ7x161YxceJEERgYKNRqtQgMDBT33XefOH/+fK3tfvnlF9GlSxehUqlqDTs7bNgwER0d3WC+xoYY/vbbb8XChQuFr6+vcHBwEOPGjas15HKNZcuWiXbt2gmNRiMGDRokDh8+3OBw1Y1lqzuEtRBCFBcXi6effloEBgYKOzs7ERkZKd5+++1awwQLUT2Uc0NDFzc2bHldmZmZYtasWcLb21uo1WrRrVu3BoeMbsrw4EeOHBEAxIsvvtjoOpcvXxYAxNNPP21ctmHDBnHTTTcJBwcH4erqKvr16ye+/fbbWtvt2bNH3HLLLcLFxUU4OTmJ7t271xv+fM2aNaJ9+/ZCrVaLHj16iE2bNjU6PPjbb79dL5vBYBBvvvmmCA0NFRqNRvTs2VP89ttvDb4+VVVV4u233xadO3cWarVa+Pj4iDFjxogjR47U2+9bb70lAIg333zzWk9fo/r27SsAiI8//rjebWfOnBGjRo0Szs7OwtvbWzzyyCPG4eGvfh3rvp+EqB5m+qGHHhJubm7CxcVFTJ48WWRlZdUbElmI6uNk9uzZIjg4WNjZ2Ql/f38xcuRI8emnn9Za7+jRowKA2L17d4OP5ccffxS33nqr8PT0FCqVSgQEBIh7771X7Nixw7hOY9MJNDYUdUPv3R9++KHWto0Nh37s2DFx5513Ci8vL6HRaERoaKiYPHmy2Lp1qxBCCK1WK+bPny9iYmKMx15MTEyDr8X19nUtjX02NGW/NUOf//TTT7X2mZSUJFxdXcXYsWONyzIyMsS4ceOEi4uLAHDNocJrXitfX1+hVqtFSEiIeOyxx0R6erpxncZek4Y+axv7DKn7GdaU4cGb+l691vv9ehoaHlwIIS5evChmzJgh/P39hZ2dnWjXrp24/fbbxY8//mhc54033hD9+vUT7u7uwsHBQXTu3FksWrRIVFZWGtepqqoS//znP4WPj4+QJKnW+zMuLk4AEFu2bGl2bqK2IAnBqZCJiOjGrVixAk8//TQuX77c4AiF1mbkyJEIDAysN4EmETXNU089hV27duHIkSNsUSKzxEKJiIhumBACMTEx8PLywvbt2+WO0yYOHDiAIUOG4MKFCyYbeITIVuTm5iI0NBTff/89xo4dK3ccogbxHCUiImqx0tJSbNiwAdu3b8fJkyfrjT5mzfr3719rcBMiajovL69WPc+KyBTYokRERC12+fJlhIeHw93dHU888UStYb2JiIgsGQslIiIiIiKiOjiPEhERERERUR0slIiIiIiIiOqw+sEcDAYD0tLS4OLiwqEniYiIiIhsmBACxcXFCAwMhEJx7TYjqy+U0tLSEBwcLHcMIiIiIiIyE8nJyQgKCrrmOlZfKLm4uACofjJcXV1lTkNERERERHIpKipCcHCwsUa4FqsvlGq627m6urJQIiIiIiKiJp2Sw8EciIiIiIiI6mChREREREREVAcLJSIiIiIiojpYKBEREREREdXBQomIiIiIiKgOFkpERERERER1sFAiIiIiIiKqg4USERERERFRHSyUiIiIiIiI6mChREREREREVAcLJSIiIiIiojpYKBEREREREdXBQomIiIiIiKgOFkpERERERER1sFAiIiIiIiKqg4USERERERFRHSyUiIiIiIiI6mChREREREREVIdK7gBERERELZWUlIScnBy5Y7SIt7c3QkJC5I5BRI1goUREREQWKSkpCZ2jolBeViZ3lBZxcHTE2bg4FktEZoqFEhEREVmknJwclJeVYeqCt+EXEiF3nGbJTLqIr5fOR05ODgslIjPFQomIiIgsml9IBIIio+WOQURWhoM5EBERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHXIWijt2rUL48ePR2BgICRJwvr16+utExcXhwkTJsDNzQ1OTk7o27cvkpKS2j4sERERERHZDFkLpdLSUsTExOCjjz5q8PaLFy9i8ODB6Ny5M3bs2IETJ07gxRdfhL29fRsnJSIiIiIiW6KS887HjBmDMWPGNHr7Cy+8gLFjx+Ktt94yLouIiGiLaEREREREZMPM9hwlg8GA33//HR07dsTo0aPh6+uL/v37N9g972parRZFRUW1LkRERERERM1htoVSVlYWSkpKsGTJEtx2223466+/MGnSJNx5553YuXNno9stXrwYbm5uxktwcHAbpiYiIiIiImtgtoWSwWAAAEycOBFPP/00evTogeeeew633347Vq1a1eh2CxcuRGFhofGSnJzcVpGJiIiIiMhKyHqO0rV4e3tDpVKhS5cutZZHRUVhz549jW6n0Wig0WhaOx4REREREVkxs21RUqvV6Nu3L86dO1dr+fnz5xEaGipTKiIiIiIisgWytiiVlJQgPj7eeD0hIQGxsbHw9PRESEgI5s+fj3vvvRdDhw7FiBEj8Oeff+LXX3/Fjh075AtNRERERERWT9ZC6fDhwxgxYoTx+rx58wAAM2fOxOrVqzFp0iSsWrUKixcvxpw5c9CpUyf89NNPGDx4sFyRiYiIiIjIBshaKA0fPhxCiGuu8+CDD+LBBx9so0RERERERERmfI4SERERERGRXFgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUh6yF0q5duzB+/HgEBgZCkiSsX7++0XX/8Y9/QJIkLF++vM3yERERERGRbZK1UCotLUVMTAw++uija663bt067N+/H4GBgW2UjIiIiIiIbJlKzjsfM2YMxowZc811UlNT8c9//hObNm3CuHHj2igZERERERHZMlkLpesxGAyYPn065s+fj+jo6CZto9VqodVqjdeLiopaKx4REREREVkpsx7MYenSpVCpVJgzZ06Tt1m8eDHc3NyMl+Dg4FZMSERERERE1shsC6UjR45gxYoVWL16NSRJavJ2CxcuRGFhofGSnJzciimJiIiIiMgamW2htHv3bmRlZSEkJAQqlQoqlQqJiYn417/+hbCwsEa302g0cHV1rXUhIiIiIiJqDrM9R2n69OkYNWpUrWWjR4/G9OnTMWvWLJlSERERERGRLZC1UCopKUF8fLzxekJCAmJjY+Hp6YmQkBB4eXnVWt/Ozg7+/v7o1KlTW0clIiIiIiIbImuhdPjwYYwYMcJ4fd68eQCAmTNnYvXq1TKlIiIiIiIiWydroTR8+HAIIZq8/uXLl1svDBERERER0RVmO5gDERERERGRXFgoERERERER1cFCiYiIiIiIqA4WSkRERERERHWwUCIiIiIiIqqDhRIREREREVEdLJSIiIiIiIjqYKFERERERERUBwslIiIiIiKiOlgoERERERER1cFCiYiIiIiIqA6V3AGIiIiIbFW5zoBDl/NwNqMYVXoDVAoJSoUCLvYqxAS5I9jTAZIkyR2T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",
|
| 158 |
+
"text/plain": [
|
| 159 |
+
"<Figure size 1000x600 with 1 Axes>"
|
| 160 |
+
]
|
| 161 |
+
},
|
| 162 |
+
"metadata": {},
|
| 163 |
+
"output_type": "display_data"
|
| 164 |
+
}
|
| 165 |
+
],
|
| 166 |
+
"source": [
|
| 167 |
+
"import numpy as np\n",
|
| 168 |
+
"import matplotlib.pyplot as plt\n",
|
| 169 |
+
"import seaborn as sns\n",
|
| 170 |
+
"\n",
|
| 171 |
+
"# 假设这是你的列表\n",
|
| 172 |
+
"data = zh_list \n",
|
| 173 |
+
"\n",
|
| 174 |
+
"# 使用Freedman-Diaconis规则自动确定bin的数量\n",
|
| 175 |
+
"bins = np.histogram_bin_edges(data, bins='fd')\n",
|
| 176 |
+
"\n",
|
| 177 |
+
"# 设置图形大小\n",
|
| 178 |
+
"plt.figure(figsize=(10, 6))\n",
|
| 179 |
+
"\n",
|
| 180 |
+
"# 使用seaborn绘制直方图\n",
|
| 181 |
+
"sns.histplot(data=data, bins=bins, kde=True)\n",
|
| 182 |
+
"\n",
|
| 183 |
+
"# 添加标题和轴标签\n",
|
| 184 |
+
"plt.title('Distribution of Accuracy Value(Chinese text similar Test)')\n",
|
| 185 |
+
"plt.xlabel('Values')\n",
|
| 186 |
+
"plt.ylabel('Frequency')\n",
|
| 187 |
+
"\n",
|
| 188 |
+
"# 显示图形"
|
| 189 |
+
]
|
| 190 |
+
},
|
| 191 |
+
{
|
| 192 |
+
"cell_type": "code",
|
| 193 |
+
"execution_count": 8,
|
| 194 |
+
"id": "2d48c7e7-a218-4c2e-b01a-b981cb3e4018",
|
| 195 |
+
"metadata": {},
|
| 196 |
+
"outputs": [
|
| 197 |
+
{
|
| 198 |
+
"name": "stdout",
|
| 199 |
+
"output_type": "stream",
|
| 200 |
+
"text": [
|
| 201 |
+
"平均值: 0.7900793650793653\n",
|
| 202 |
+
"方差: 0.00020592227261274904\n",
|
| 203 |
+
"标准差: 0.014349992077097083\n"
|
| 204 |
+
]
|
| 205 |
+
}
|
| 206 |
+
],
|
| 207 |
+
"source": [
|
| 208 |
+
"import numpy as np\n",
|
| 209 |
+
"\n",
|
| 210 |
+
"# 示���数据(Python list,包含 float 类型的数值)\n",
|
| 211 |
+
"data = fr_list\n",
|
| 212 |
+
"\n",
|
| 213 |
+
"# 计算平均值\n",
|
| 214 |
+
"mean_value = np.mean(data)\n",
|
| 215 |
+
"\n",
|
| 216 |
+
"# 计算方差(注意:np.var默认计算总体方差,如果需要样本方差,请设置ddof=1)\n",
|
| 217 |
+
"variance_value = np.var(data)\n",
|
| 218 |
+
"\n",
|
| 219 |
+
"# 计算标准差\n",
|
| 220 |
+
"std_value = np.std(data)\n",
|
| 221 |
+
"\n",
|
| 222 |
+
"print(\"平均值:\", mean_value)\n",
|
| 223 |
+
"print(\"方差:\", variance_value)\n",
|
| 224 |
+
"print(\"标准差:\", std_value)"
|
| 225 |
+
]
|
| 226 |
+
},
|
| 227 |
+
{
|
| 228 |
+
"cell_type": "code",
|
| 229 |
+
"execution_count": 9,
|
| 230 |
+
"id": "af6ec113-8c12-4724-bbd4-a7089c969700",
|
| 231 |
+
"metadata": {},
|
| 232 |
+
"outputs": [
|
| 233 |
+
{
|
| 234 |
+
"name": "stdout",
|
| 235 |
+
"output_type": "stream",
|
| 236 |
+
"text": [
|
| 237 |
+
"平均值: 0.7147619047619047\n",
|
| 238 |
+
"方差: 0.0002495226757369616\n",
|
| 239 |
+
"标准差: 0.01579628677053445\n"
|
| 240 |
+
]
|
| 241 |
+
}
|
| 242 |
+
],
|
| 243 |
+
"source": [
|
| 244 |
+
"# 示例数据(Python list,包含 float 类型的数值)\n",
|
| 245 |
+
"data = zh_list\n",
|
| 246 |
+
"\n",
|
| 247 |
+
"# 计算平均值\n",
|
| 248 |
+
"mean_value = np.mean(data)\n",
|
| 249 |
+
"\n",
|
| 250 |
+
"# 计算方差(注意:np.var默认计算总体方差,如果需要样本方差,请设置ddof=1)\n",
|
| 251 |
+
"variance_value = np.var(data)\n",
|
| 252 |
+
"\n",
|
| 253 |
+
"# 计算标准差\n",
|
| 254 |
+
"std_value = np.std(data)\n",
|
| 255 |
+
"\n",
|
| 256 |
+
"print(\"平均值:\", mean_value)\n",
|
| 257 |
+
"print(\"方差:\", variance_value)\n",
|
| 258 |
+
"print(\"标准差:\", std_value)"
|
| 259 |
+
]
|
| 260 |
+
},
|
| 261 |
+
{
|
| 262 |
+
"cell_type": "code",
|
| 263 |
+
"execution_count": null,
|
| 264 |
+
"id": "ae5db37b-2301-480a-ab33-a4a798089596",
|
| 265 |
+
"metadata": {},
|
| 266 |
+
"outputs": [],
|
| 267 |
+
"source": []
|
| 268 |
+
}
|
| 269 |
+
],
|
| 270 |
+
"metadata": {
|
| 271 |
+
"kernelspec": {
|
| 272 |
+
"display_name": "Python 3 (ipykernel)",
|
| 273 |
+
"language": "python",
|
| 274 |
+
"name": "python3"
|
| 275 |
+
},
|
| 276 |
+
"language_info": {
|
| 277 |
+
"codemirror_mode": {
|
| 278 |
+
"name": "ipython",
|
| 279 |
+
"version": 3
|
| 280 |
+
},
|
| 281 |
+
"file_extension": ".py",
|
| 282 |
+
"mimetype": "text/x-python",
|
| 283 |
+
"name": "python",
|
| 284 |
+
"nbconvert_exporter": "python",
|
| 285 |
+
"pygments_lexer": "ipython3",
|
| 286 |
+
"version": "3.12.3"
|
| 287 |
+
}
|
| 288 |
+
},
|
| 289 |
+
"nbformat": 4,
|
| 290 |
+
"nbformat_minor": 5
|
| 291 |
+
}
|
finetune/get_acc_stat_multiv2_2.ipynb
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv2_ft_en2.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 3,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"dna_protein_pair_full: 0.6675\n",
|
| 39 |
+
"dna_protein_pair_rand_full: 0.76025\n"
|
| 40 |
+
]
|
| 41 |
+
}
|
| 42 |
+
],
|
| 43 |
+
"source": [
|
| 44 |
+
"# 假设您的数据存储在一个名为data_list的列表中\n",
|
| 45 |
+
"# 初始化一个字典来保存每个键的最大accuracy值\n",
|
| 46 |
+
"max_accuracies = {}\n",
|
| 47 |
+
"\n",
|
| 48 |
+
"dna_protein_pair_rand_full_list = []\n",
|
| 49 |
+
"\n",
|
| 50 |
+
"# 遍历列表中的每个字典\n",
|
| 51 |
+
"for data in data_list:\n",
|
| 52 |
+
" for key, metrics in data.items():\n",
|
| 53 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 54 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 55 |
+
" accuracy = metrics['accuracy']\n",
|
| 56 |
+
" if accuracy<0.5:\n",
|
| 57 |
+
" accuracy = 1 - accuracy\n",
|
| 58 |
+
" if \"dna_protein_pair_rand_full\"==key:\n",
|
| 59 |
+
" dna_protein_pair_rand_full_list.append(accuracy)\n",
|
| 60 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 61 |
+
" max_accuracies[key] = accuracy\n",
|
| 62 |
+
"\n",
|
| 63 |
+
"# 打印每个键的最大accuracy值\n",
|
| 64 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 65 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 66 |
+
]
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"cell_type": "code",
|
| 70 |
+
"execution_count": 4,
|
| 71 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 72 |
+
"metadata": {},
|
| 73 |
+
"outputs": [],
|
| 74 |
+
"source": [
|
| 75 |
+
"#dna_protein_pair_rand_full_list"
|
| 76 |
+
]
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"cell_type": "code",
|
| 80 |
+
"execution_count": 11,
|
| 81 |
+
"id": "13ad1fd4-5c99-4c06-b92c-6fe417d28c32",
|
| 82 |
+
"metadata": {},
|
| 83 |
+
"outputs": [
|
| 84 |
+
{
|
| 85 |
+
"data": {
|
| 86 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0kAAAIjCAYAAADWYVDIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6I0lEQVR4nO3dd3wUdf7H8ffuJtn03kkBQu/SqyCgoKioeIqKgmI5xd7u0FNsJ5az4NnOOwV7wd4AEQFBeu89JIT03uvO74/I/jYQIAkJG8Lr+XjsA3Z2duazu7OTee/3O98xGYZhCAAAAAAgSTI7uwAAAAAAaE4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISUAjeuKJJ2QymU7LukaMGKERI0bY7y9ZskQmk0lffvnlaVn/lClT1Lp169OyroYqLCzUzTffrPDwcJlMJt17773OLgn1cDq/T7UpLCxUaGioPv74Y6fVcKqc/R6eqUwmk5544glnl1FnrVu31pQpU5xdRqM6+m9MVlaWvLy89PPPPzuvKJxVCEnAccyZM0cmk8l+c3d3V2RkpMaMGaPXXntNBQUFjbKe5ORkPfHEE9q0aVOjLK8xNefa6uLZZ5/VnDlzdPvtt+vDDz/U9ddff9LnVFVVKTIyUiaTSfPmzTsNVZ750tPT5eLiokmTJh13noKCAnl4eOiKK644jZWdmlmzZsnHx0cTJ07UwYMHa+wPTnQ7ePDgKa/7TP/uOdObb76pOXPmOLsMNLKgoCDdfPPNeuyxx5xdCs4SLs4uAGjunnrqKbVp00YVFRVKTU3VkiVLdO+99+rll1/W999/rx49etjn/cc//qG///3v9Vp+cnKynnzySbVu3Vq9evWq8/N++eWXeq2nIU5U23//+1/ZbLYmr+FU/Pbbbxo4cKBmzJhRr+ekpKSodevW+vjjj3XhhRc2YYUtQ2hoqM4//3x99913Ki4ulqen5zHzfP311yotLT1hkGpOKioqNGvWLN13332yWCwKCQnRhx9+WGOel156SUlJSXrllVdqTA8JCTnl9Td0v4DqkBQcHHxKLSslJSVycTlzDpF2794ts7nl/+7917/+Va+99pp+++03jRw50tnloIU7c/YAgJNceOGF6tu3r/3+9OnT9dtvv+niiy/WpZdeqp07d8rDw0OS5OLi0uR/WI8chLq5uTXpek7G1dXVqeuvi/T0dHXp0qVez/noo4/Uu3dvTZ48WY888oiKiork5eXVRBU2XGVlpWw2m9O3gyOuu+46zZ8/X99//70mTpx4zOOffPKJ/Pz8NG7cOCdUV38//vijMjIydNVVV0mSvLy8jgl4n332mXJycs6Y4HemcsZ30N3d/bSu71RZrdaTznMq72Nz2d907txZ3bp105w5cwhJaHIt/2cHoAmMHDlSjz32mBISEvTRRx/Zp9fW/3/hwoUaOnSo/P395e3trY4dO+qRRx6RVH0eUb9+/SRJN954o727zpGuIiNGjFC3bt20fv16nXvuufL09LQ/9+hzko6oqqrSI488ovDwcHl5eenSSy/VoUOHasxzvP7rjss8WW21nZNUVFSkBx54QNHR0bJarerYsaP+9a9/yTCMGvOZTCbdeeed+vbbb9WtWzdZrVZ17dpV8+fPr/0NP0p6erqmTp2qsLAwubu7q2fPnnr//fftjx85Pys+Pl4//fRTnbtBlZSU6JtvvtHEiRN11VVXqaSkRN99912t886bN0/Dhw+Xj4+PfH191a9fP33yySc15lm9erUuuugiBQQEyMvLSz169NCsWbPsjx/vMzz6vT3S1etf//qXXn31VcXFxclqtWrHjh0qLy/X448/rj59+sjPz09eXl4aNmyYFi9efMxybTabZs2ape7du8vd3V0hISEaO3as1q1bJ0kaPny4evbsWevr7dixo8aMGXPc9+7yyy+Xl5fXMe+BVP15LVq0SFdeeaWsVquWLVumv/zlL4qJiZHValV0dLTuu+8+lZSUHHf5ju9DbV2pajuH5PDhw7rpppsUFhZm38bee++9E67jiG+//VatW7dWXFxcneY/oqysTDNmzFC7du3sr+3hhx9WWVlZjflOZb9wPMuXL1e/fv3k7u6uuLg4/ec//6l1vrp+/xISEnTHHXeoY8eO8vDwUFBQkP7yl780qDvhkXV+/PHH6tixo9zd3dWnTx/9/vvvNeY7sg/dsWOHrr32WgUEBGjo0KGSqg/Un376afv237p1az3yyCM13tvWrVtr+/btWrp0qf19c/yO5ebm6t5777Xvo9q1a6fnn3/+mFbxo7enI3Xt27dPU6ZMkb+/v/z8/HTjjTequLi4Xu/FlClT5O3trQMHDmjMmDHy8vJSZGSknnrqqWP2lf/61780ePBgBQUFycPDQ3369Kn1vNOj9+lHuosvXbpUd9xxh0JDQxUVFVWn+hpjf+O4jHfeece+jH79+mnt2rXHrPPItuju7q5u3brpm2++OW59559/vn744Ydj3iugsdGSBDTQ9ddfr0ceeUS//PKLbrnlllrn2b59uy6++GL16NFDTz31lKxWq/bt26c//vhDUvWvYk899ZQef/xx3XrrrRo2bJgkafDgwfZlZGVl6cILL9TEiRM1adIkhYWFnbCuf/7znzKZTPrb3/6m9PR0vfrqqxo9erQ2bdpkb/Gqi7rU5sgwDF166aVavHixpk6dql69emnBggV66KGHdPjw4WO6JC1fvlxff/217rjjDvn4+Oi1117ThAkTlJiYqKCgoOPWVVJSohEjRmjfvn2688471aZNG82dO1dTpkxRbm6u7rnnHnXu3Fkffvih7rvvPkVFRemBBx6QdPJuUN9//70KCws1ceJEhYeHa8SIEfr444917bXX1phvzpw5uummm9S1a1dNnz5d/v7+2rhxo+bPn2+fd+HChbr44osVERGhe+65R+Hh4dq5c6d+/PFH3XPPPSd+849j9uzZKi0t1a233iqr1arAwEDl5+frf//7n6655hrdcsstKigo0LvvvqsxY8ZozZo1NbpqTZ06VXPmzNGFF16om2++WZWVlVq2bJlWrVqlvn376vrrr9ctt9yibdu2qVu3bvbnrV27Vnv27NE//vGP49bm5eWl8ePH68svv1R2drYCAwPtj33++eeqqqrSddddJ0maO3euiouLdfvttysoKEhr1qzRv//9byUlJWnu3LkNem+OlpaWpoEDB9oPzkNCQjRv3jxNnTpV+fn5Jx3EY8WKFerdu3e91mmz2XTppZdq+fLluvXWW9W5c2dt3bpVr7zyivbs2aNvv/1WUuPsF462detWXXDBBQoJCdETTzyhyspKzZgx47j7i7p8/9auXasVK1Zo4sSJioqK0sGDB/XWW29pxIgR2rFjR63dKk9k6dKl+vzzz3X33XfLarXqzTff1NixY7VmzZoa25sk/eUvf1H79u317LPP2g+Gb775Zr3//vu68sor9cADD2j16tWaOXOmdu7caT+ofvXVV3XXXXfJ29tbjz76qCTZ34Pi4mINHz5chw8f1m233aaYmBitWLFC06dPV0pKil599dWTvoarrrpKbdq00cyZM7Vhwwb973//U2hoqJ5//vl6vRdVVVUaO3asBg4cqBdeeEHz58/XjBkzVFlZqaeeeso+36xZs3TppZfquuuuU3l5uT777DP95S9/0Y8//linVtk77rhDISEhevzxx1VUVFSvGk91fyNVtyAXFBTotttuk8lk0gsvvKArrrhCBw4csPdG+OWXXzRhwgR16dJFM2fOVFZWlm688cbjhro+ffrolVde0fbt24/ZboBGZQCo1ezZsw1Jxtq1a487j5+fn3HOOefY78+YMcNw/Fq98sorhiQjIyPjuMtYu3atIcmYPXv2MY8NHz7ckGS8/fbbtT42fPhw+/3FixcbkoxWrVoZ+fn59ulffPGFIcmYNWuWfVpsbKwxefLkky7zRLVNnjzZiI2Ntd//9ttvDUnGM888U2O+K6+80jCZTMa+ffvs0yQZbm5uNaZt3rzZkGT8+9//PmZdjl599VVDkvHRRx/Zp5WXlxuDBg0yvL29a7z22NhYY9y4cSdcnqOLL77YGDJkiP3+O++8Y7i4uBjp6en2abm5uYaPj48xYMAAo6SkpMbzbTabYRiGUVlZabRp08aIjY01cnJyap3HMI59v484+r2Nj483JBm+vr41ajmyrrKyshrTcnJyjLCwMOOmm26yT/vtt98MScbdd999zPqO1JSbm2u4u7sbf/vb32o8fvfddxteXl5GYWHhMc919NNPPxmSjP/85z81pg8cONBo1aqVUVVVZRiGYRQXFx/z3JkzZxomk8lISEiwTzv6+3Tkfahte5RkzJgxw35/6tSpRkREhJGZmVljvokTJxp+fn611nBERUWFYTKZjAceeOCEr3fcuHE1PqcPP/zQMJvNxrJly2rM9/bbbxuSjD/++MMwjFPfL9TmsssuM9zd3Wu8fzt27DAsFotx9J/6un7/anuPVq5caUgyPvjggzrV5bhOSca6devs0xISEgx3d3fj8ssvt0878plfc801NZ6/adMmQ5Jx880315j+4IMPGpKM3377zT6ta9eutX6vnn76acPLy8vYs2dPjel///vfDYvFYiQmJtao13F7OlKX43fKMAzj8ssvN4KCgk7+BjiYPHmyIcm466677NNsNpsxbtw4w83NrcZ2cfRnUF5ebnTr1s0YOXJkjelH79OP/P0aOnSoUVlZWa/6GmN/c2QZQUFBRnZ2tn36d999Z0gyfvjhB/u0Xr16GREREUZubq592i+//GJIqvH9OmLFihWGJOPzzz+v1+sC6ovudsAp8Pb2PuEod/7+/pKk7777rsGDHFitVt144411nv+GG26Qj4+P/f6VV16piIiIJh829eeff5bFYtHdd99dY/oDDzwgwzCOGSlu9OjRNboy9ejRQ76+vjpw4MBJ1xMeHq5rrrnGPs3V1VV33323CgsLtXTp0gbVn5WVpQULFtRY7oQJE2QymfTFF1/Ypy1cuFAFBQX6+9//fsx5C0e6Wm7cuFHx8fG699577dvA0fM0xIQJE45pDbNYLPbzBGw2m7Kzs1VZWam+fftqw4YN9vm++uormUymWgexOFKTn5+fxo8fr08//dT+631VVZU+//xzXXbZZSc9n+FIS4Zjl7v4+HitWrVK11xzjf3EcscWzaKiImVmZmrw4MEyDEMbN26sz1tSK8Mw9NVXX+mSSy6RYRjKzMy038aMGaO8vLwa783RsrOzZRiGAgIC6rXeuXPnqnPnzurUqVONdR45d+JIl6TG2C84qqqq0oIFC3TZZZcpJibGPr1z587H7SJZl++f4+dUUVGhrKwstWvXTv7+/id8/45n0KBB6tOnj/1+TEyMxo8frwULFqiqqqrGvH/9619r3D+y/7r//vtrTD/SSvzTTz+ddP1z587VsGHDFBAQUOPzGT16tKqqqo7p+lebo+saNmyYsrKylJ+ff9LnHu3OO++0//9Ii2d5ebl+/fVX+3THzyAnJ0d5eXkaNmxYnd//W265RRaLpd61Sae2vzni6quvrvE9OtIqemQ7S0lJ0aZNmzR58mT5+fnZ5zv//POPez7pkeVlZmY26HUBdUVIAk5BYWFhjUBytKuvvlpDhgzRzTffrLCwME2cOFFffPFFvQ6MWrVqVa+TZdu3b1/jvslkUrt27RplWOITSUhIUGRk5DHvR+fOne2PO3I8mDsiICBAOTk5J11P+/btjxnJ6XjrqavPP/9cFRUVOuecc7Rv3z7t27dP2dnZGjBgQI3r5Ozfv1+STtjNoy7zNESbNm1qnf7++++rR48ecnd3V1BQkEJCQvTTTz8pLy+vRk2RkZE1usHV5oYbblBiYqKWLVsmSfr111+VlpZWp+HTXVxcdPXVV2vZsmU6fPiwJNkD05GudpKUmJioKVOmKDAwUN7e3goJCdHw4cMlqUbNDZWRkaHc3Fy98847CgkJqXE78oNDenr6SZdj1POch71792r79u3HrLNDhw411tkY+wVHGRkZKikpOea7L1WfS1abunz/SkpK9Pjjj9vP3wkODlZISIhyc3Mb9DnVVl+HDh1UXFysjIyMGtOP3tYTEhJkNpvVrl27GtPDw8Pl7+9fp+/93r17NX/+/GM+n9GjR0uq2zZx9Pt25ID9ZPuto5nNZrVt27bGtCPbieO++scff9TAgQPl7u6uwMBAhYSE6K233qrz+3+8fcapPLcu+5sjTvZ+Hfnc6rPtHvlecv0vNDXOSQIaKCkpSXl5ecf80Xbk4eGh33//XYsXL9ZPP/2k+fPn6/PPP9fIkSP1yy+/1OkXvvqcR1RXx/vjUlVV1eBfHevreOup74FpYzkShIYMGVLr4wcOHDjmoOZUmUymWl/v0b+qH1HbtvDRRx9pypQpuuyyy/TQQw8pNDRUFotFM2fOtIe1+hgzZozCwsL00Ucf6dxzz9VHH32k8PBw+4HkyUyaNEmvv/66Pv30Uz344IP69NNP1aVLF/u5ClVVVTr//POVnZ2tv/3tb+rUqZO8vLx0+PBhTZky5YRB4UTbraMjy5g0aZImT55c63Mch+4/WmBgoEwmU70PfG02m7p3766XX3651sejo6MlNc5+4VTV5ft31113afbs2br33ns1aNAg+fn5yWQyaeLEiU0+/P/x9nuncmBss9l0/vnn6+GHH6718SMh5URO535r2bJluvTSS3XuuefqzTffVEREhFxdXTV79uxaB0ipzan8/WiM/U1TvF9HvpfBwcENXgZQF4QkoIGOXDPlRCN+SdW/GI4aNUqjRo3Syy+/rGeffVaPPvqoFi9erNGjRzf6r2F79+6tcd8wDO3bt6/GQWFAQIByc3OPeW5CQkKNIFCf2mJjY/Xrr7+qoKCgRmvSrl277I83htjYWG3ZskU2m61Ga9KprCc+Pl4rVqzQnXfeaW/ROMJms+n666/XJ598on/84x/2Lkrbtm07bkB2nOdE4SIgIKDW7oX1aQ378ssv1bZtW3399dc1Pq+ju9XFxcVpwYIFxwyqcDSLxaJrr71Wc+bM0fPPP69vv/22Xl12BgwYoLi4OH3yySc6//zztX37dv3zn/+0P75161bt2bNH77//vm644Qb79IULF5502Ud+hT562z36/QoJCZGPj4+qqqrqHO4cubi4KC4uTvHx8fV6XlxcnDZv3qxRo0ad9LvTmPuFkJAQeXh4HPPdl6qvn9NQX375pSZPnqyXXnrJPq20tLTWfUdd1Fbfnj175OnpedJBVWJjY2Wz2bR37157q7FUPUBHbm5uje/98d67uLg4FRYWNmibaGw2m00HDhyoEcz27NkjSfaRLb/66iu5u7trwYIFNYb4nj179mmt1VFd9zd1deRzq8+2e+R76bgdAE2B7nZAA/z22296+umn1aZNmxrdiI6WnZ19zLQjv6gfGbb2yHkeDT3wONoHH3xQ4zypL7/8UikpKTUuihoXF6dVq1apvLzcPu3HH388Zqjw+tR20UUXqaqqSq+//nqN6a+88opMJlOjXZT1oosuUmpqqj7//HP7tMrKSv373/+Wt7f3MSGnLo60Ij388MO68sora9yuuuoqDR8+3D7PBRdcIB8fH82cOVOlpaU1lnPk19HevXurTZs2evXVV4957xx/QY2Li9OuXbtqdDXavHmzfZSzujgSXhyXu3r1aq1cubLGfBMmTJBhGHryySePWcbRv+pef/31ysnJ0W233abCwsJ6Xwfouuuu08aNGzVjxgyZTKYaowPWVq9hGDWGRj8eX19fBQcHH3PuyJtvvlnjvsVi0YQJE/TVV19p27Ztxyzn6K5dtRk0aJB9aPS6uuqqq3T48GH997//PeaxkpIS++hijb1fsFgsGjNmjL799lslJibap+/cuVMLFiyo12s4erlHbxv//ve/j9vSeTIrV66scd7KoUOH9N133+mCCy44aQi/6KKLJOmYEeiOtNo5jvTm5eVV6/t21VVXaeXKlbW+J7m5uaqsrKzrS2kUjvtKwzD0+uuvy9XVVaNGjZJU/f6bTKYa7/fBgwftoyQ6Q133N3UVERGhXr166f3336/RXW/hwoXasWNHrc9Zv369/Pz81LVr1watE6grWpKAk5g3b5527dqlyspKpaWl6bffftPChQsVGxur77///oQXHXzqqaf0+++/a9y4cYqNjVV6errefPNNRUVF2a/9ERcXJ39/f7399tvy8fGRl5eXBgwY0OC+5IGBgRo6dKhuvPFGpaWl6dVXX1W7du1qDFN+880368svv9TYsWN11VVXaf/+/froo4+OuSZMfWq75JJLdN555+nRRx/VwYMH1bNnT/3yyy/67rvvdO+999b7ejPHc+utt+o///mPpkyZovXr16t169b68ssv9ccff+jVV1894Tlix/Pxxx+rV69e9u5QR7v00kt11113acOGDerdu7deeeUV3XzzzerXr5/9Wi6bN29WcXGx3n//fZnNZr311lu65JJL1KtXL914442KiIjQrl27tH37dvtB2k033aSXX35ZY8aM0dSpU5Wenq63335bXbt2rfOJ4BdffLG+/vprXX755Ro3bpzi4+P19ttvq0uXLiosLLTPd9555+n666/Xa6+9pr1792rs2LGy2WxatmyZzjvvvBonkZ9zzjnq1q2bfSCC+g6FPWnSJD311FP67rvvNGTIkBrXfOrUqZPi4uL04IMP6vDhw/L19dVXX31V565tN998s5577jndfPPN6tu3r37//Xf7L/COnnvuOS1evFgDBgzQLbfcoi5duig7O1sbNmzQr7/+WmtQcTR+/Hh9+OGH2rNnT526YUnV4fKLL77QX//6Vy1evFhDhgxRVVWVdu3apS+++EILFixQ3759m2S/8OSTT2r+/PkaNmyY7rjjDvsPB127dtWWLVvqVP/RLr74Yn344Yfy8/NTly5dtHLlSv36668nHKL/RLp166YxY8bUGAL8SO0n07NnT02ePFnvvPOOcnNzNXz4cK1Zs0bvv/++LrvsMp133nn2efv06aO33npLzzzzjNq1a6fQ0FCNHDlSDz30kL7//ntdfPHFmjJlivr06aOioiJt3bpVX375pQ4ePHjaunC5u7tr/vz5mjx5sgYMGKB58+bpp59+0iOPPGJvVRs3bpxefvlljR07Vtdee63S09P1xhtvqF27dg3+TE9VXfc39TFz5kyNGzdOQ4cO1U033aTs7Gz7tlvbMhcuXKhLLrmEc5LQ9E7fQHrAmeXIEKpHbm5ubkZ4eLhx/vnnG7Nmzaox1PQRRw9ZvGjRImP8+PFGZGSk4ebmZkRGRhrXXHPNMUPQfvfdd0aXLl0MFxeXGsP+Dh8+3OjatWut9R1vCPBPP/3UmD59uhEaGmp4eHgY48aNqzEs8BEvvfSS0apVK8NqtRpDhgwx1q1bV+uQ1Mer7ehhqg3DMAoKCoz77rvPiIyMNFxdXY327dsbL774Yo1hrw2jenjdadOmHVPT8YYmP1paWppx4403GsHBwYabm5vRvXv3WodKrssQ4OvXrzckGY899thx5zl48KAhybjvvvvs077//ntj8ODBhoeHh+Hr62v079/f+PTTT2s8b/ny5cb5559v+Pj4GF5eXkaPHj2OGeL8o48+Mtq2bWu4ubkZvXr1MhYsWHDcIcBffPHFY2qz2WzGs88+a8TGxhpWq9U455xzjB9//LHWz6eystJ48cUXjU6dOhlubm5GSEiIceGFFxrr168/ZrkvvPCCIcl49tlnT/T2HVe/fv0MScabb755zGM7duwwRo8ebXh7exvBwcHGLbfcYh+C2vFzPPr7ZBjVQyJPnTrV8PPzM3x8fIyrrrrKSE9PP2bIZsOo3k6mTZtmREdHG66urkZ4eLgxatQo45133jlp/WVlZUZwcLDx9NNPH3eeo4cAN4zqIZqff/55o2vXrobVajUCAgKMPn36GE8++aSRl5dnGMap7xeOZ+nSpUafPn0MNzc3o23btsbbb79d63tY1+9fTk6O/Xvm7e1tjBkzxti1a1edv6e1rfOjjz4y2rdvb99WFy9eXGO+I/XWNjx6RUWF8eSTTxpt2rQxXF1djejoaGP69OlGaWlpjflSU1ONcePGGT4+PoakGvu0goICY/r06Ua7du0MNzc3Izg42Bg8eLDxr3/9yygvL69Rb21DgB9d15G/E/Hx8XV+LyZPnmx4eXkZ+/fvNy644ALD09PTCAsLM2bMmGEfJv+Id9991/5+derUyZg9e3atn+nxhgA/0SUsjqcx9jcnWkZt39WvvvrK6Ny5s2G1Wo0uXboYX3/9da37sJ07dxqSjF9//bXerwuoL5NhcMliAEBNs2bN0n333aeDBw/WOhLa2eDpp5/W7NmztXfv3tM2oElLZTKZNG3atGO6456NpkyZoi+//LLBLS9ns3vvvVe///671q9fT0sSmhznJAEAajAMQ++++66GDx9+1gYkSbrvvvtUWFiozz77zNmlAGe9rKws/e9//9MzzzxDQMJpwTlJAABJ1Rd2/f7777V48WJt3bpV3333nbNLcipvb+86XTvnbJaamnrCxz08PGpcJLQly8vLU0lJyQnnCQ8PP03VHKuqquqkg5Z4e3vL29v7NFVUP0FBQbS+4bQiJAEAJFWP+nbttdfK399fjzzyiC699FJnl4RmLiIi4oSPT548WXPmzDk9xTjZPffco/fff/+E8zjzDIdDhw6ddECgGTNm6Iknnjg9BQHNHOckAQCABvn1119P+HhkZKS6dOlymqpxrh07dig5OfmE8zjzGk2lpaVavnz5Cedp27Zto180GzhTEZIAAAAAwAEDNwAAAACAgxZ/TpLNZlNycrJ8fHwYDQUAAAA4ixmGoYKCAkVGRspsPn57UYsPScnJyYqOjnZ2GQAAAACaiUOHDikqKuq4j7f4kOTj4yOp+o3w9fV1cjUAAAAAnCU/P1/R0dH2jHA8LT4kHeli5+vrS0gCAAAAcNLTcBi4AQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwAEhCQAAAAAcEJIAAAAAwIGLsws42yQmJiozM9PZZcBBcHCwYmJinF0GAAAAmglC0mmUmJioTp07q6S42NmlwIGHp6d27dxJUAIAAIAkQtJplZmZqZLiYl33txcVFhPn7HIgKS1xvz5+/iFlZmYSkgAAACCJkOQUYTFximrf1dllAAAAAKgFAzcAAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgANCEgAAAAA4ICQBAAAAgINmE5Kee+45mUwm3XvvvfZppaWlmjZtmoKCguTt7a0JEyYoLS3NeUUCAAAAaPGaRUhau3at/vOf/6hHjx41pt9333364YcfNHfuXC1dulTJycm64oornFQlAAAAgLOB00NSYWGhrrvuOv33v/9VQECAfXpeXp7effddvfzyyxo5cqT69Omj2bNna8WKFVq1apUTKwYAAADQkjk9JE2bNk3jxo3T6NGja0xfv369Kioqakzv1KmTYmJitHLlyuMur6ysTPn5+TVuAAAAAFBXLs5c+WeffaYNGzZo7dq1xzyWmpoqNzc3+fv715geFham1NTU4y5z5syZevLJJxu7VAAAAABnCae1JB06dEj33HOPPv74Y7m7uzfacqdPn668vDz77dChQ422bAAAAAAtn9NC0vr165Wenq7evXvLxcVFLi4uWrp0qV577TW5uLgoLCxM5eXlys3NrfG8tLQ0hYeHH3e5VqtVvr6+NW4AAAAAUFdO6243atQobd26tca0G2+8UZ06ddLf/vY3RUdHy9XVVYsWLdKECRMkSbt371ZiYqIGDRrkjJIBAAAAnAWcFpJ8fHzUrVu3GtO8vLwUFBRknz516lTdf//9CgwMlK+vr+666y4NGjRIAwcOdEbJAAAAAM4CTh244WReeeUVmc1mTZgwQWVlZRozZozefPNNZ5cFAAAAoAVrViFpyZIlNe67u7vrjTfe0BtvvOGcggAAAACcdZx+nSQAAAAAaE4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADggJAEAAAAAA4ISQAAAADg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",
|
| 87 |
+
"text/plain": [
|
| 88 |
+
"<Figure size 1000x600 with 1 Axes>"
|
| 89 |
+
]
|
| 90 |
+
},
|
| 91 |
+
"metadata": {},
|
| 92 |
+
"output_type": "display_data"
|
| 93 |
+
}
|
| 94 |
+
],
|
| 95 |
+
"source": [
|
| 96 |
+
"import numpy as np\n",
|
| 97 |
+
"import matplotlib.pyplot as plt\n",
|
| 98 |
+
"import seaborn as sns\n",
|
| 99 |
+
"\n",
|
| 100 |
+
"# 假设这是你的列表\n",
|
| 101 |
+
"#dna_protein_pair_rand_full_list = [0.1, 0.2, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] # 示例数据\n",
|
| 102 |
+
"\n",
|
| 103 |
+
"# 使用Freedman-Diaconis规则自动确定bin的数量\n",
|
| 104 |
+
"bins = np.histogram_bin_edges(dna_protein_pair_rand_full_list, bins='fd')\n",
|
| 105 |
+
"\n",
|
| 106 |
+
"# 设置图形大小\n",
|
| 107 |
+
"plt.figure(figsize=(10, 6))\n",
|
| 108 |
+
"\n",
|
| 109 |
+
"# 使用seaborn绘制直方图\n",
|
| 110 |
+
"sns.histplot(data=dna_protein_pair_rand_full_list, bins=bins, kde=True)\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"# 添加标题和轴标签\n",
|
| 113 |
+
"plt.title('Distribution of Accuracy Value (Test dna_protein_pair_rand)')\n",
|
| 114 |
+
"plt.xlabel('Values')\n",
|
| 115 |
+
"plt.ylabel('Frequency')\n",
|
| 116 |
+
"\n",
|
| 117 |
+
"# 显示图形\n",
|
| 118 |
+
"plt.show()"
|
| 119 |
+
]
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"cell_type": "code",
|
| 123 |
+
"execution_count": 6,
|
| 124 |
+
"id": "d19b9579-30a7-4442-a8a4-786631f52e88",
|
| 125 |
+
"metadata": {},
|
| 126 |
+
"outputs": [
|
| 127 |
+
{
|
| 128 |
+
"name": "stdout",
|
| 129 |
+
"output_type": "stream",
|
| 130 |
+
"text": [
|
| 131 |
+
"大于0.7的元素个数: 13\n"
|
| 132 |
+
]
|
| 133 |
+
}
|
| 134 |
+
],
|
| 135 |
+
"source": [
|
| 136 |
+
"count = sum(1 for x in dna_protein_pair_rand_full_list if x > 0.7)\n",
|
| 137 |
+
"print(\"大于0.7的元素个数:\", count)"
|
| 138 |
+
]
|
| 139 |
+
},
|
| 140 |
+
{
|
| 141 |
+
"cell_type": "code",
|
| 142 |
+
"execution_count": 7,
|
| 143 |
+
"id": "7f1a63ad-9f94-42bb-8380-5163dd8efff0",
|
| 144 |
+
"metadata": {},
|
| 145 |
+
"outputs": [
|
| 146 |
+
{
|
| 147 |
+
"data": {
|
| 148 |
+
"text/plain": [
|
| 149 |
+
"124"
|
| 150 |
+
]
|
| 151 |
+
},
|
| 152 |
+
"execution_count": 7,
|
| 153 |
+
"metadata": {},
|
| 154 |
+
"output_type": "execute_result"
|
| 155 |
+
}
|
| 156 |
+
],
|
| 157 |
+
"source": [
|
| 158 |
+
"len(dna_protein_pair_rand_full_list)"
|
| 159 |
+
]
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"cell_type": "code",
|
| 163 |
+
"execution_count": 9,
|
| 164 |
+
"id": "bc31dd0e-e56e-4fda-8071-f11139922173",
|
| 165 |
+
"metadata": {},
|
| 166 |
+
"outputs": [
|
| 167 |
+
{
|
| 168 |
+
"data": {
|
| 169 |
+
"text/plain": [
|
| 170 |
+
"0.08870967741935484"
|
| 171 |
+
]
|
| 172 |
+
},
|
| 173 |
+
"execution_count": 9,
|
| 174 |
+
"metadata": {},
|
| 175 |
+
"output_type": "execute_result"
|
| 176 |
+
}
|
| 177 |
+
],
|
| 178 |
+
"source": [
|
| 179 |
+
"11/124"
|
| 180 |
+
]
|
| 181 |
+
},
|
| 182 |
+
{
|
| 183 |
+
"cell_type": "code",
|
| 184 |
+
"execution_count": null,
|
| 185 |
+
"id": "b71d0c97-c962-4bb7-8ada-a970ffb9cbbc",
|
| 186 |
+
"metadata": {},
|
| 187 |
+
"outputs": [],
|
| 188 |
+
"source": []
|
| 189 |
+
}
|
| 190 |
+
],
|
| 191 |
+
"metadata": {
|
| 192 |
+
"kernelspec": {
|
| 193 |
+
"display_name": "Python 3 (ipykernel)",
|
| 194 |
+
"language": "python",
|
| 195 |
+
"name": "python3"
|
| 196 |
+
},
|
| 197 |
+
"language_info": {
|
| 198 |
+
"codemirror_mode": {
|
| 199 |
+
"name": "ipython",
|
| 200 |
+
"version": 3
|
| 201 |
+
},
|
| 202 |
+
"file_extension": ".py",
|
| 203 |
+
"mimetype": "text/x-python",
|
| 204 |
+
"name": "python",
|
| 205 |
+
"nbconvert_exporter": "python",
|
| 206 |
+
"pygments_lexer": "ipython3",
|
| 207 |
+
"version": "3.12.3"
|
| 208 |
+
}
|
| 209 |
+
},
|
| 210 |
+
"nbformat": 4,
|
| 211 |
+
"nbformat_minor": 5
|
| 212 |
+
}
|
finetune/get_acc_stat_multiv2_3.ipynb
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "8159f2eb-88ce-4c45-b1ae-584ce3a1976f",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import json"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "179a6741-6649-4bea-be83-7fc9fd6c13c6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"filename = \"gpt2_gene_multiv2_ft_en3.jsonl\"\n",
|
| 21 |
+
"data_list = []\n",
|
| 22 |
+
"for line in open(filename):\n",
|
| 23 |
+
" data = json.loads(line)\n",
|
| 24 |
+
" data_list.append(data)\n",
|
| 25 |
+
" "
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"cell_type": "code",
|
| 30 |
+
"execution_count": 4,
|
| 31 |
+
"id": "c8cc78e9-fbdf-4c95-847f-44ea953a38ec",
|
| 32 |
+
"metadata": {},
|
| 33 |
+
"outputs": [
|
| 34 |
+
{
|
| 35 |
+
"name": "stdout",
|
| 36 |
+
"output_type": "stream",
|
| 37 |
+
"text": [
|
| 38 |
+
"en: 0.9065\n",
|
| 39 |
+
"fr: 0.8245\n",
|
| 40 |
+
"de: 0.798\n",
|
| 41 |
+
"zh: 0.7415\n",
|
| 42 |
+
"dna_sim_pair_simple_150bp: 0.9577777777777777\n",
|
| 43 |
+
"dna_sim_pair_150bp: 0.84825\n",
|
| 44 |
+
"dna_sim_pair_50bp: 0.8615\n",
|
| 45 |
+
"protein_sim_pair_150bp: 0.9711111111111111\n",
|
| 46 |
+
"protein_sim_pair_450bp: 0.9705555555555555\n",
|
| 47 |
+
"dna_protein_pair: 0.585\n",
|
| 48 |
+
"dna_protein_pair_100: 0.57\n",
|
| 49 |
+
"dna_protein_pair_full: 0.7025\n",
|
| 50 |
+
"dna_protein_pair_rand: 0.570625\n",
|
| 51 |
+
"dna_protein_pair_rand_100: 0.58625\n",
|
| 52 |
+
"dna_protein_pair_rand_full: 0.695\n"
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
],
|
| 56 |
+
"source": [
|
| 57 |
+
"# 假设您的数据存储在一个名为data_list的列表中\n",
|
| 58 |
+
"# 初始化一个字典来保存每个键的最大accuracy值\n",
|
| 59 |
+
"max_accuracies = {}\n",
|
| 60 |
+
"\n",
|
| 61 |
+
"# 遍历列表中的每个字典\n",
|
| 62 |
+
"for data in data_list:\n",
|
| 63 |
+
" for key, metrics in data.items():\n",
|
| 64 |
+
" if key not in ['seed']: # 忽略非目标键,例如'seed'\n",
|
| 65 |
+
" if isinstance(metrics, dict) and 'accuracy' in metrics:\n",
|
| 66 |
+
" accuracy = metrics['accuracy']\n",
|
| 67 |
+
"\n",
|
| 68 |
+
" if accuracy<0.5:\n",
|
| 69 |
+
" accuracy = 1-accuracy\n",
|
| 70 |
+
" if key not in max_accuracies or accuracy > max_accuracies[key]:\n",
|
| 71 |
+
" max_accuracies[key] = accuracy\n",
|
| 72 |
+
"\n",
|
| 73 |
+
"# 打印每个键的最大accuracy值\n",
|
| 74 |
+
"for key, max_accuracy in max_accuracies.items():\n",
|
| 75 |
+
" print(f\"{key}: {max_accuracy}\")"
|
| 76 |
+
]
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"cell_type": "code",
|
| 80 |
+
"execution_count": null,
|
| 81 |
+
"id": "0d2f40f8-a817-4b6b-ae17-310478f6f8d8",
|
| 82 |
+
"metadata": {},
|
| 83 |
+
"outputs": [],
|
| 84 |
+
"source": []
|
| 85 |
+
}
|
| 86 |
+
],
|
| 87 |
+
"metadata": {
|
| 88 |
+
"kernelspec": {
|
| 89 |
+
"display_name": "Python 3 (ipykernel)",
|
| 90 |
+
"language": "python",
|
| 91 |
+
"name": "python3"
|
| 92 |
+
},
|
| 93 |
+
"language_info": {
|
| 94 |
+
"codemirror_mode": {
|
| 95 |
+
"name": "ipython",
|
| 96 |
+
"version": 3
|
| 97 |
+
},
|
| 98 |
+
"file_extension": ".py",
|
| 99 |
+
"mimetype": "text/x-python",
|
| 100 |
+
"name": "python",
|
| 101 |
+
"nbconvert_exporter": "python",
|
| 102 |
+
"pygments_lexer": "ipython3",
|
| 103 |
+
"version": "3.12.3"
|
| 104 |
+
}
|
| 105 |
+
},
|
| 106 |
+
"nbformat": 4,
|
| 107 |
+
"nbformat_minor": 5
|
| 108 |
+
}
|
finetune/gpt2_gene_multiv1_ft_en.jsonl
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
finetune/gpt2_gene_multiv1_ft_en2.jsonl
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"seed": 5445, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.16}, "dna_protein_pair_rand_full": {"accuracy": 0.565375, "f1": 0.3523933693425219}}
|
| 2 |
+
{"seed": 990, "dna_protein_pair_full": {"accuracy": 0.6575, "f1": 0.573208722741433}, "dna_protein_pair_rand_full": {"accuracy": 0.560375, "f1": 0.5041590300296066}}
|
| 3 |
+
{"seed": 1531, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.3559870550161812}, "dna_protein_pair_rand_full": {"accuracy": 0.614125, "f1": 0.548618219037871}}
|
| 4 |
+
{"seed": 3500, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.05333333333333334}, "dna_protein_pair_rand_full": {"accuracy": 0.531375, "f1": 0.15046453659641967}}
|
| 5 |
+
{"seed": 9923, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.4965, "f1": 0.007392804337111878}}
|
| 6 |
+
{"seed": 3546, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.0603448275862069}, "dna_protein_pair_rand_full": {"accuracy": 0.494, "f1": 0.0878774222622803}}
|
| 7 |
+
{"seed": 6026, "dna_protein_pair_full": {"accuracy": 0.4075, "f1": 0.2379421221864952}, "dna_protein_pair_rand_full": {"accuracy": 0.5185, "f1": 0.45531674208144796}}
|
| 8 |
+
{"seed": 4172, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.02040816326530612}, "dna_protein_pair_rand_full": {"accuracy": 0.503625, "f1": 0.04336304504938569}}
|
| 9 |
+
{"seed": 6437, "dna_protein_pair_full": {"accuracy": 0.39, "f1": 0.32967032967032966}, "dna_protein_pair_rand_full": {"accuracy": 0.490875, "f1": 0.4291520672740014}}
|
| 10 |
+
{"seed": 779, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.50525, "f1": 0.0124750499001996}}
|
| 11 |
+
{"seed": 7005, "dna_protein_pair_full": {"accuracy": 0.6025, "f1": 0.3510204081632653}, "dna_protein_pair_rand_full": {"accuracy": 0.57575, "f1": 0.4011997177134792}}
|
| 12 |
+
{"seed": 2353, "dna_protein_pair_full": {"accuracy": 0.5425, "f1": 0.05181347150259067}, "dna_protein_pair_rand_full": {"accuracy": 0.53, "f1": 0.13958810068649885}}
|
| 13 |
+
{"seed": 4224, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.03864734299516908}, "dna_protein_pair_rand_full": {"accuracy": 0.534625, "f1": 0.15367128892930212}}
|
| 14 |
+
{"seed": 6703, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.514625, "f1": 0.06501324343847821}}
|
| 15 |
+
{"seed": 4990, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.1276595744680851}, "dna_protein_pair_rand_full": {"accuracy": 0.5055, "f1": 0.14074717636837533}}
|
| 16 |
+
{"seed": 6775, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.2188679245283019}, "dna_protein_pair_rand_full": {"accuracy": 0.59225, "f1": 0.4393262289446545}}
|
| 17 |
+
{"seed": 7854, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.039603960396039604}, "dna_protein_pair_rand_full": {"accuracy": 0.510375, "f1": 0.09725743258815395}}
|
| 18 |
+
{"seed": 1088, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.5380952380952381}, "dna_protein_pair_rand_full": {"accuracy": 0.489875, "f1": 0.40082219938335045}}
|
| 19 |
+
{"seed": 5911, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.06635071090047394}, "dna_protein_pair_rand_full": {"accuracy": 0.537375, "f1": 0.17992466208730334}}
|
| 20 |
+
{"seed": 2543, "dna_protein_pair_full": {"accuracy": 0.585, "f1": 0.5931372549019608}, "dna_protein_pair_rand_full": {"accuracy": 0.609125, "f1": 0.6461468824261627}}
|
| 21 |
+
{"seed": 8490, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.08333333333333333}, "dna_protein_pair_rand_full": {"accuracy": 0.540625, "f1": 0.22745427790624342}}
|
| 22 |
+
{"seed": 8304, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.09954751131221719}, "dna_protein_pair_rand_full": {"accuracy": 0.536625, "f1": 0.20535905680600214}}
|
| 23 |
+
{"seed": 8670, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.37583892617449666}, "dna_protein_pair_rand_full": {"accuracy": 0.568125, "f1": 0.5093026558727454}}
|
| 24 |
+
{"seed": 6225, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.04}, "dna_protein_pair_rand_full": {"accuracy": 0.514625, "f1": 0.08527679623085983}}
|
| 25 |
+
{"seed": 5908, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.03827751196172249}, "dna_protein_pair_rand_full": {"accuracy": 0.526625, "f1": 0.14841466156959748}}
|
| 26 |
+
{"seed": 7500, "dna_protein_pair_full": {"accuracy": 0.5625, "f1": 0.5862884160756501}, "dna_protein_pair_rand_full": {"accuracy": 0.585, "f1": 0.6457533077251387}}
|
| 27 |
+
{"seed": 8310, "dna_protein_pair_full": {"accuracy": 0.45, "f1": 0.043478260869565216}, "dna_protein_pair_rand_full": {"accuracy": 0.51475, "f1": 0.08356940509915015}}
|
| 28 |
+
{"seed": 2652, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.01015228426395939}, "dna_protein_pair_rand_full": {"accuracy": 0.5015, "f1": 0.009438648782911079}}
|
| 29 |
+
{"seed": 446, "dna_protein_pair_full": {"accuracy": 0.5175, "f1": 0.010256410256410256}, "dna_protein_pair_rand_full": {"accuracy": 0.51875, "f1": 0.09539473684210527}}
|
| 30 |
+
{"seed": 6273, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.5961123110151187}, "dna_protein_pair_rand_full": {"accuracy": 0.661375, "f1": 0.7237687366167024}}
|
| 31 |
+
{"seed": 4050, "dna_protein_pair_full": {"accuracy": 0.3725, "f1": 0.49292929292929294}, "dna_protein_pair_rand_full": {"accuracy": 0.46975, "f1": 0.5407102641836293}}
|
| 32 |
+
{"seed": 5642, "dna_protein_pair_full": {"accuracy": 0.48, "f1": 0.14049586776859505}, "dna_protein_pair_rand_full": {"accuracy": 0.547, "f1": 0.32134831460674157}}
|
| 33 |
+
{"seed": 5062, "dna_protein_pair_full": {"accuracy": 0.365, "f1": 0.4009433962264151}, "dna_protein_pair_rand_full": {"accuracy": 0.458, "f1": 0.44123711340206184}}
|
| 34 |
+
{"seed": 7347, "dna_protein_pair_full": {"accuracy": 0.4625, "f1": 0.5691382765531062}, "dna_protein_pair_rand_full": {"accuracy": 0.588375, "f1": 0.681127142442142}}
|
| 35 |
+
{"seed": 3111, "dna_protein_pair_full": {"accuracy": 0.375, "f1": 0.3489583333333333}, "dna_protein_pair_rand_full": {"accuracy": 0.492375, "f1": 0.37320574162679426}}
|
| 36 |
+
{"seed": 3101, "dna_protein_pair_full": {"accuracy": 0.64, "f1": 0.6230366492146597}, "dna_protein_pair_rand_full": {"accuracy": 0.597125, "f1": 0.6494834148994019}}
|
| 37 |
+
{"seed": 5382, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.037383177570093455}, "dna_protein_pair_rand_full": {"accuracy": 0.522875, "f1": 0.12273040680303378}}
|
| 38 |
+
{"seed": 3385, "dna_protein_pair_full": {"accuracy": 0.54, "f1": 0.041666666666666664}, "dna_protein_pair_rand_full": {"accuracy": 0.500125, "f1": 0.043072505384063174}}
|
| 39 |
+
{"seed": 1798, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.039603960396039604}, "dna_protein_pair_rand_full": {"accuracy": 0.510125, "f1": 0.06445452375268561}}
|
| 40 |
+
{"seed": 2096, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.009615384615384616}, "dna_protein_pair_rand_full": {"accuracy": 0.502, "f1": 0.033478893740902474}}
|
| 41 |
+
{"seed": 7605, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.6505190311418685}, "dna_protein_pair_rand_full": {"accuracy": 0.537625, "f1": 0.6737807566804833}}
|
| 42 |
+
{"seed": 6915, "dna_protein_pair_full": {"accuracy": 0.5675, "f1": 0.32684824902723736}, "dna_protein_pair_rand_full": {"accuracy": 0.559625, "f1": 0.37833068643021}}
|
| 43 |
+
{"seed": 3022, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.043668122270742356}, "dna_protein_pair_rand_full": {"accuracy": 0.529, "f1": 0.1313969571230982}}
|
| 44 |
+
{"seed": 1000, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.029411764705882353}, "dna_protein_pair_rand_full": {"accuracy": 0.511375, "f1": 0.04402054292002935}}
|
| 45 |
+
{"seed": 3167, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.2462686567164179}, "dna_protein_pair_rand_full": {"accuracy": 0.521375, "f1": 0.3548441449031171}}
|
| 46 |
+
{"seed": 2501, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.1440677966101695}, "dna_protein_pair_rand_full": {"accuracy": 0.515, "f1": 0.2673716012084592}}
|
| 47 |
+
{"seed": 8523, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.03669724770642202}, "dna_protein_pair_rand_full": {"accuracy": 0.511375, "f1": 0.049598832968636035}}
|
| 48 |
+
{"seed": 4205, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.21481481481481482}, "dna_protein_pair_rand_full": {"accuracy": 0.50875, "f1": 0.2738359201773836}}
|
| 49 |
+
{"seed": 6034, "dna_protein_pair_full": {"accuracy": 0.5175, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.51, "f1": 0.02729528535980149}}
|
| 50 |
+
{"seed": 8902, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.010309278350515464}, "dna_protein_pair_rand_full": {"accuracy": 0.510875, "f1": 0.0378657487091222}}
|
| 51 |
+
{"seed": 3000, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.3591331269349845}, "dna_protein_pair_rand_full": {"accuracy": 0.551125, "f1": 0.5069339557874503}}
|
| 52 |
+
{"seed": 7135, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.027906976744186046}, "dna_protein_pair_rand_full": {"accuracy": 0.518, "f1": 0.12917795844625113}}
|
| 53 |
+
{"seed": 5425, "dna_protein_pair_full": {"accuracy": 0.5175, "f1": 0.5038560411311054}, "dna_protein_pair_rand_full": {"accuracy": 0.531125, "f1": 0.5447263017356475}}
|
| 54 |
+
{"seed": 680, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.01}, "dna_protein_pair_rand_full": {"accuracy": 0.513375, "f1": 0.060796139927623644}}
|
| 55 |
+
{"seed": 5307, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.09433962264150944}, "dna_protein_pair_rand_full": {"accuracy": 0.508, "f1": 0.07778819119025304}}
|
| 56 |
+
{"seed": 5904, "dna_protein_pair_full": {"accuracy": 0.4575, "f1": 0.2977346278317152}, "dna_protein_pair_rand_full": {"accuracy": 0.598875, "f1": 0.4916838270236021}}
|
| 57 |
+
{"seed": 4481, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.1606425702811245}, "dna_protein_pair_rand_full": {"accuracy": 0.58175, "f1": 0.47157296272899557}}
|
| 58 |
+
{"seed": 6550, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.009708737864077669}, "dna_protein_pair_rand_full": {"accuracy": 0.50075, "f1": 0.048141086749285036}}
|
| 59 |
+
{"seed": 8337, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.08333333333333333}, "dna_protein_pair_rand_full": {"accuracy": 0.5075, "f1": 0.11261261261261261}}
|
| 60 |
+
{"seed": 8229, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.500125, "f1": 0.002494387627837366}}
|
| 61 |
+
{"seed": 8437, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.061946902654867256}, "dna_protein_pair_rand_full": {"accuracy": 0.4805, "f1": 0.09336823734729494}}
|
| 62 |
+
{"seed": 1130, "dna_protein_pair_full": {"accuracy": 0.615, "f1": 0.4338235294117647}, "dna_protein_pair_rand_full": {"accuracy": 0.708375, "f1": 0.7002441218039317}}
|
| 63 |
+
{"seed": 4028, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.2527075812274368}, "dna_protein_pair_rand_full": {"accuracy": 0.581625, "f1": 0.40306759407883}}
|
| 64 |
+
{"seed": 516, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.6448275862068965}, "dna_protein_pair_rand_full": {"accuracy": 0.529375, "f1": 0.6790007673288431}}
|
| 65 |
+
{"seed": 3075, "dna_protein_pair_full": {"accuracy": 0.3525, "f1": 0.3573200992555831}, "dna_protein_pair_rand_full": {"accuracy": 0.459125, "f1": 0.2960793883195055}}
|
| 66 |
+
{"seed": 9428, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.009900990099009901}, "dna_protein_pair_rand_full": {"accuracy": 0.49725, "f1": 0.01614481409001957}}
|
| 67 |
+
{"seed": 4633, "dna_protein_pair_full": {"accuracy": 0.5575, "f1": 0.3166023166023166}, "dna_protein_pair_rand_full": {"accuracy": 0.661125, "f1": 0.5886815354270976}}
|
| 68 |
+
{"seed": 7170, "dna_protein_pair_full": {"accuracy": 0.3725, "f1": 0.3863080684596577}, "dna_protein_pair_rand_full": {"accuracy": 0.479625, "f1": 0.3284400709791902}}
|
| 69 |
+
{"seed": 7273, "dna_protein_pair_full": {"accuracy": 0.4475, "f1": 0.2939297124600639}, "dna_protein_pair_rand_full": {"accuracy": 0.4345, "f1": 0.3253802564867283}}
|
| 70 |
+
{"seed": 941, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.6678571428571428}, "dna_protein_pair_rand_full": {"accuracy": 0.5015, "f1": 0.6613451086956522}}
|
| 71 |
+
{"seed": 4612, "dna_protein_pair_full": {"accuracy": 0.4225, "f1": 0.2572347266881029}, "dna_protein_pair_rand_full": {"accuracy": 0.4665, "f1": 0.3229695431472081}}
|
| 72 |
+
{"seed": 3411, "dna_protein_pair_full": {"accuracy": 0.4475, "f1": 0.5424430641821946}, "dna_protein_pair_rand_full": {"accuracy": 0.551375, "f1": 0.6532702154381219}}
|
| 73 |
+
{"seed": 8413, "dna_protein_pair_full": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.500375, "f1": 0.016244154565591928}}
|
| 74 |
+
{"seed": 4748, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.502625, "f1": 0.00200652119388011}}
|
| 75 |
+
{"seed": 823, "dna_protein_pair_full": {"accuracy": 0.4025, "f1": 0.3979848866498741}, "dna_protein_pair_rand_full": {"accuracy": 0.5055, "f1": 0.45070813662871423}}
|
| 76 |
+
{"seed": 9869, "dna_protein_pair_full": {"accuracy": 0.5525, "f1": 0.10945273631840796}, "dna_protein_pair_rand_full": {"accuracy": 0.509, "f1": 0.10605370960400547}}
|
| 77 |
+
{"seed": 1627, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.05504587155963303}, "dna_protein_pair_rand_full": {"accuracy": 0.509125, "f1": 0.11732973701955496}}
|
| 78 |
+
{"seed": 88, "dna_protein_pair_full": {"accuracy": 0.5375, "f1": 0.0975609756097561}, "dna_protein_pair_rand_full": {"accuracy": 0.50775, "f1": 0.0934622467771639}}
|
| 79 |
+
{"seed": 5390, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.23693379790940766}, "dna_protein_pair_rand_full": {"accuracy": 0.645375, "f1": 0.585051923358198}}
|
| 80 |
+
{"seed": 7967, "dna_protein_pair_full": {"accuracy": 0.7, "f1": 0.6842105263157895}, "dna_protein_pair_rand_full": {"accuracy": 0.60475, "f1": 0.6294820717131474}}
|
| 81 |
+
{"seed": 7296, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.01015228426395939}, "dna_protein_pair_rand_full": {"accuracy": 0.498, "f1": 0.015203531142717018}}
|
| 82 |
+
{"seed": 5129, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.027906976744186046}, "dna_protein_pair_rand_full": {"accuracy": 0.547375, "f1": 0.20713816509743815}}
|
| 83 |
+
{"seed": 649, "dna_protein_pair_full": {"accuracy": 0.4225, "f1": 0.3565459610027855}, "dna_protein_pair_rand_full": {"accuracy": 0.569875, "f1": 0.5604802656788862}}
|
| 84 |
+
{"seed": 9280, "dna_protein_pair_full": {"accuracy": 0.435, "f1": 0.19858156028368795}, "dna_protein_pair_rand_full": {"accuracy": 0.58725, "f1": 0.38987435328898745}}
|
| 85 |
+
{"seed": 5570, "dna_protein_pair_full": {"accuracy": 0.44, "f1": 0.15151515151515152}, "dna_protein_pair_rand_full": {"accuracy": 0.544625, "f1": 0.2566823097327076}}
|
| 86 |
+
{"seed": 1413, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.494125, "f1": 0.03389830508474576}}
|
| 87 |
+
{"seed": 1608, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.5324384787472036}, "dna_protein_pair_rand_full": {"accuracy": 0.47375, "f1": 0.48870536798639785}}
|
| 88 |
+
{"seed": 4393, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.0673076923076923}, "dna_protein_pair_rand_full": {"accuracy": 0.52225, "f1": 0.08036573628488931}}
|
| 89 |
+
{"seed": 7211, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.091324200913242}, "dna_protein_pair_rand_full": {"accuracy": 0.564, "f1": 0.355268022181146}}
|
| 90 |
+
{"seed": 7095, "dna_protein_pair_full": {"accuracy": 0.365, "f1": 0.3520408163265306}, "dna_protein_pair_rand_full": {"accuracy": 0.497, "f1": 0.476995061086561}}
|
| 91 |
+
{"seed": 4250, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.13114754098360656}, "dna_protein_pair_rand_full": {"accuracy": 0.53075, "f1": 0.26622361219702895}}
|
| 92 |
+
{"seed": 9997, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.10300429184549356}, "dna_protein_pair_rand_full": {"accuracy": 0.521375, "f1": 0.18928647046368832}}
|
| 93 |
+
{"seed": 7553, "dna_protein_pair_full": {"accuracy": 0.375, "f1": 0.4158878504672897}, "dna_protein_pair_rand_full": {"accuracy": 0.54, "f1": 0.5315682281059063}}
|
| 94 |
+
{"seed": 87, "dna_protein_pair_full": {"accuracy": 0.6225, "f1": 0.48109965635738833}, "dna_protein_pair_rand_full": {"accuracy": 0.6245, "f1": 0.6419547079856972}}
|
| 95 |
+
{"seed": 9399, "dna_protein_pair_full": {"accuracy": 0.5475, "f1": 0.27309236947791166}, "dna_protein_pair_rand_full": {"accuracy": 0.5495, "f1": 0.2662866449511401}}
|
| 96 |
+
{"seed": 8228, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.01}, "dna_protein_pair_rand_full": {"accuracy": 0.493125, "f1": 0.024536925667548712}}
|
| 97 |
+
{"seed": 5918, "dna_protein_pair_full": {"accuracy": 0.57, "f1": 0.4027777777777778}, "dna_protein_pair_rand_full": {"accuracy": 0.60825, "f1": 0.5965499485066942}}
|
| 98 |
+
{"seed": 9110, "dna_protein_pair_full": {"accuracy": 0.4025, "f1": 0.4860215053763441}, "dna_protein_pair_rand_full": {"accuracy": 0.474875, "f1": 0.5089421390999416}}
|
| 99 |
+
{"seed": 5520, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.5228758169934641}, "dna_protein_pair_rand_full": {"accuracy": 0.53775, "f1": 0.6076808826649692}}
|
| 100 |
+
{"seed": 6322, "dna_protein_pair_full": {"accuracy": 0.565, "f1": 0.40816326530612246}, "dna_protein_pair_rand_full": {"accuracy": 0.625375, "f1": 0.527063279154174}}
|
| 101 |
+
{"seed": 285, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.5105, "f1": 0.03165182987141444}}
|
| 102 |
+
{"seed": 1443, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.08571428571428572}, "dna_protein_pair_rand_full": {"accuracy": 0.536, "f1": 0.1586582048957389}}
|
| 103 |
+
{"seed": 2518, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.03619909502262444}, "dna_protein_pair_rand_full": {"accuracy": 0.520625, "f1": 0.1238291066940827}}
|
| 104 |
+
{"seed": 5828, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.01990049751243781}, "dna_protein_pair_rand_full": {"accuracy": 0.504875, "f1": 0.039291777831675964}}
|
| 105 |
+
{"seed": 2377, "dna_protein_pair_full": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.501625, "f1": 0.020152371590071272}}
|
| 106 |
+
{"seed": 3332, "dna_protein_pair_full": {"accuracy": 0.4175, "f1": 0.3206997084548105}, "dna_protein_pair_rand_full": {"accuracy": 0.533625, "f1": 0.4542928184876408}}
|
| 107 |
+
{"seed": 4033, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.08108108108108109}, "dna_protein_pair_rand_full": {"accuracy": 0.505875, "f1": 0.09063722107200368}}
|
| 108 |
+
{"seed": 4457, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.02830188679245283}, "dna_protein_pair_rand_full": {"accuracy": 0.531625, "f1": 0.1423666742961776}}
|
finetune/gpt2_gene_multiv1_ft_en3.jsonl
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"seed": 0, "en": {"accuracy": 0.875, "f1": 0.8636859323882224}, "fr": {"accuracy": 0.794, "f1": 0.7900101936799184}, "de": {"accuracy": 0.7715, "f1": 0.7570441254651781}, "zh": {"accuracy": 0.7075, "f1": 0.699537750385208}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9097222222222222, "f1": 0.900398406374502}, "dna_sim_pair_150bp": {"accuracy": 0.6925, "f1": 0.5533769063180828}, "dna_sim_pair_50bp": {"accuracy": 0.737, "f1": 0.67125}, "protein_sim_pair_150bp": {"accuracy": 0.9283333333333333, "f1": 0.9269121813031161}, "protein_sim_pair_450bp": {"accuracy": 0.8027777777777778, "f1": 0.7779862414008756}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.5275, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.513125, "f1": 0.002560819462227913}, "dna_protein_pair_rand_100": {"accuracy": 0.510625, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.480625, "f1": 0.0024009603841536613}}
|
| 2 |
+
{"seed": 1, "en": {"accuracy": 0.872, "f1": 0.8642629904559915}, "fr": {"accuracy": 0.802, "f1": 0.7987804878048781}, "de": {"accuracy": 0.777, "f1": 0.7740628166160081}, "zh": {"accuracy": 0.712, "f1": 0.7}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9322222222222222, "f1": 0.933911159263272}, "dna_sim_pair_150bp": {"accuracy": 0.78125, "f1": 0.7412008281573499}, "dna_sim_pair_50bp": {"accuracy": 0.804, "f1": 0.7923728813559322}, "protein_sim_pair_150bp": {"accuracy": 0.9216666666666666, "f1": 0.923907177549919}, "protein_sim_pair_450bp": {"accuracy": 0.8622222222222222, "f1": 0.8772277227722772}, "dna_protein_pair": {"accuracy": 0.52, "f1": 0.19327731092436976}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.23015873015873015}, "dna_protein_pair_full": {"accuracy": 0.3475, "f1": 0.4161073825503356}, "dna_protein_pair_rand": {"accuracy": 0.55, "f1": 0.21568627450980393}, "dna_protein_pair_rand_100": {"accuracy": 0.53, "f1": 0.27552986512524086}, "dna_protein_pair_rand_full": {"accuracy": 0.5525, "f1": 0.5295663600525624}}
|
| 3 |
+
{"seed": 3, "en": {"accuracy": 0.868, "f1": 0.8622129436325678}, "fr": {"accuracy": 0.788, "f1": 0.7911330049261084}, "de": {"accuracy": 0.7655, "f1": 0.7670144063586687}, "zh": {"accuracy": 0.692, "f1": 0.7029893924783028}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8419444444444445, "f1": 0.8528575122834239}, "dna_sim_pair_150bp": {"accuracy": 0.7905, "f1": 0.8017037387600567}, "dna_sim_pair_50bp": {"accuracy": 0.5055, "f1": 0.6550401116149285}, "protein_sim_pair_150bp": {"accuracy": 0.8805555555555555, "f1": 0.8934060485870104}, "protein_sim_pair_450bp": {"accuracy": 0.7927777777777778, "f1": 0.8132198297446169}, "dna_protein_pair": {"accuracy": 0.585, "f1": 0.2905982905982906}, "dna_protein_pair_100": {"accuracy": 0.5925, "f1": 0.4359861591695502}, "dna_protein_pair_full": {"accuracy": 0.4175, "f1": 0.5801801801801801}, "dna_protein_pair_rand": {"accuracy": 0.545625, "f1": 0.4333593141075604}, "dna_protein_pair_rand_100": {"accuracy": 0.575625, "f1": 0.5535831689677844}, "dna_protein_pair_rand_full": {"accuracy": 0.520625, "f1": 0.663153271848924}}
|
| 4 |
+
{"seed": 4, "en": {"accuracy": 0.883, "f1": 0.8764519535374868}, "fr": {"accuracy": 0.807, "f1": 0.8090999010880316}, "de": {"accuracy": 0.779, "f1": 0.7805362462760675}, "zh": {"accuracy": 0.6995, "f1": 0.7153008053055424}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9233333333333333, "f1": 0.9172165566886623}, "dna_sim_pair_150bp": {"accuracy": 0.69875, "f1": 0.5728465083303793}, "dna_sim_pair_50bp": {"accuracy": 0.6045, "f1": 0.3563873067534581}, "protein_sim_pair_150bp": {"accuracy": 0.965, "f1": 0.9637722829212191}, "protein_sim_pair_450bp": {"accuracy": 0.9544444444444444, "f1": 0.9524361948955916}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.01020408163265306}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.504375, "f1": 0.005018820577164366}, "dna_protein_pair_rand_100": {"accuracy": 0.49875, "f1": 0.0024875621890547263}, "dna_protein_pair_rand_full": {"accuracy": 0.489375, "f1": 0.0}}
|
| 5 |
+
{"seed": 5, "en": {"accuracy": 0.8935, "f1": 0.8892355694227769}, "fr": {"accuracy": 0.801, "f1": 0.8015952143569293}, "de": {"accuracy": 0.7725, "f1": 0.769620253164557}, "zh": {"accuracy": 0.678, "f1": 0.6912751677852349}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9347222222222222, "f1": 0.9319432377642629}, "dna_sim_pair_150bp": {"accuracy": 0.75125, "f1": 0.687008493236867}, "dna_sim_pair_50bp": {"accuracy": 0.711, "f1": 0.7008281573498965}, "protein_sim_pair_150bp": {"accuracy": 0.9505555555555556, "f1": 0.9504178272980501}, "protein_sim_pair_450bp": {"accuracy": 0.82, "f1": 0.7925736235595391}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.03902439024390244}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.03755868544600939}, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.0966183574879227}, "dna_protein_pair_rand": {"accuracy": 0.51625, "f1": 0.046798029556650245}, "dna_protein_pair_rand_100": {"accuracy": 0.48375, "f1": 0.078125}, "dna_protein_pair_rand_full": {"accuracy": 0.538125, "f1": 0.16308040770101925}}
|
| 6 |
+
{"seed": 6, "en": {"accuracy": 0.859, "f1": 0.8528183716075156}, "fr": {"accuracy": 0.7635, "f1": 0.7718282682103232}, "de": {"accuracy": 0.751, "f1": 0.7514970059880239}, "zh": {"accuracy": 0.7165, "f1": 0.704841228526809}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7169444444444445, "f1": 0.7613024127430311}, "dna_sim_pair_150bp": {"accuracy": 0.67725, "f1": 0.7200173498156582}, "dna_sim_pair_50bp": {"accuracy": 0.531, "f1": 0.65}, "protein_sim_pair_150bp": {"accuracy": 0.9127777777777778, "f1": 0.9128262076624097}, "protein_sim_pair_450bp": {"accuracy": 0.7894444444444444, "f1": 0.829202343397927}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.019230769230769232}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.03}, "dna_protein_pair_full": {"accuracy": 0.31, "f1": 0.38392857142857145}, "dna_protein_pair_rand": {"accuracy": 0.496875, "f1": 0.03592814371257485}, "dna_protein_pair_rand_100": {"accuracy": 0.520625, "f1": 0.04005006257822278}, "dna_protein_pair_rand_full": {"accuracy": 0.523125, "f1": 0.5428400239664469}}
|
| 7 |
+
{"seed": 7, "en": {"accuracy": 0.871, "f1": 0.8632025450689289}, "fr": {"accuracy": 0.785, "f1": 0.7918683446272992}, "de": {"accuracy": 0.7535, "f1": 0.7624096385542168}, "zh": {"accuracy": 0.699, "f1": 0.7111324376199616}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7925, "f1": 0.8184690157958687}, "dna_sim_pair_150bp": {"accuracy": 0.70325, "f1": 0.7220791383750877}, "dna_sim_pair_50bp": {"accuracy": 0.554, "f1": 0.6646616541353384}, "protein_sim_pair_150bp": {"accuracy": 0.7016666666666667, "f1": 0.7710021321961621}, "protein_sim_pair_450bp": {"accuracy": 0.7394444444444445, "f1": 0.7914628723877278}, "dna_protein_pair": {"accuracy": 0.5425, "f1": 0.4369230769230769}, "dna_protein_pair_100": {"accuracy": 0.585, "f1": 0.3897058823529412}, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.44510385756676557}, "dna_protein_pair_rand": {"accuracy": 0.5575, "f1": 0.512396694214876}, "dna_protein_pair_rand_100": {"accuracy": 0.5775, "f1": 0.4643423137876387}, "dna_protein_pair_rand_full": {"accuracy": 0.569375, "f1": 0.46297739672642246}}
|
| 8 |
+
{"seed": 8, "en": {"accuracy": 0.8765, "f1": 0.8685470995210218}, "fr": {"accuracy": 0.7965, "f1": 0.7974116475858636}, "de": {"accuracy": 0.7425, "f1": 0.7560397915679773}, "zh": {"accuracy": 0.7145, "f1": 0.7134972403411942}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9269444444444445, "f1": 0.9227152512488981}, "dna_sim_pair_150bp": {"accuracy": 0.8225, "f1": 0.7928821470245041}, "dna_sim_pair_50bp": {"accuracy": 0.7675, "f1": 0.7203848466626579}, "protein_sim_pair_150bp": {"accuracy": 0.9577777777777777, "f1": 0.9581497797356828}, "protein_sim_pair_450bp": {"accuracy": 0.9244444444444444, "f1": 0.9250275633958104}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.010101010101010102}, "dna_protein_pair_100": {"accuracy": 0.49, "f1": 0.009708737864077669}, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.018957345971563982}, "dna_protein_pair_rand": {"accuracy": 0.52125, "f1": 0.0103359173126615}, "dna_protein_pair_rand_100": {"accuracy": 0.500625, "f1": 0.0024968789013732834}, "dna_protein_pair_rand_full": {"accuracy": 0.491875, "f1": 0.0378698224852071}}
|
| 9 |
+
{"seed": 9, "en": {"accuracy": 0.885, "f1": 0.8756756756756757}, "fr": {"accuracy": 0.7875, "f1": 0.7919725893294175}, "de": {"accuracy": 0.758, "f1": 0.7611056268509379}, "zh": {"accuracy": 0.7035, "f1": 0.7144920558497834}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7744444444444445, "f1": 0.8088512241054614}, "dna_sim_pair_150bp": {"accuracy": 0.65875, "f1": 0.6930514953901507}, "dna_sim_pair_50bp": {"accuracy": 0.667, "f1": 0.7111882046834345}, "protein_sim_pair_150bp": {"accuracy": 0.9122222222222223, "f1": 0.9166666666666666}, "protein_sim_pair_450bp": {"accuracy": 0.8638888888888889, "f1": 0.8709847288046341}, "dna_protein_pair": {"accuracy": 0.5675, "f1": 0.3215686274509804}, "dna_protein_pair_100": {"accuracy": 0.5425, "f1": 0.37542662116040953}, "dna_protein_pair_full": {"accuracy": 0.5575, "f1": 0.4380952380952381}, "dna_protein_pair_rand": {"accuracy": 0.50375, "f1": 0.3873456790123457}, "dna_protein_pair_rand_100": {"accuracy": 0.490625, "f1": 0.42484121383203954}, "dna_protein_pair_rand_full": {"accuracy": 0.491875, "f1": 0.3722007722007722}}
|
| 10 |
+
{"seed": 10, "en": {"accuracy": 0.8725, "f1": 0.8634172469201928}, "fr": {"accuracy": 0.7965, "f1": 0.7996061053668144}, "de": {"accuracy": 0.76, "f1": 0.7611940298507462}, "zh": {"accuracy": 0.7265, "f1": 0.7143603133159269}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9241666666666667, "f1": 0.9209840810419682}, "dna_sim_pair_150bp": {"accuracy": 0.80175, "f1": 0.7613602166716822}, "dna_sim_pair_50bp": {"accuracy": 0.625, "f1": 0.6023329798515377}, "protein_sim_pair_150bp": {"accuracy": 0.9155555555555556, "f1": 0.9142212189616253}, "protein_sim_pair_450bp": {"accuracy": 0.9577777777777777, "f1": 0.9583333333333334}, "dna_protein_pair": {"accuracy": 0.495, "f1": 0.0380952380952381}, "dna_protein_pair_100": {"accuracy": 0.4475, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.01932367149758454}, "dna_protein_pair_rand": {"accuracy": 0.506875, "f1": 0.02952029520295203}, "dna_protein_pair_rand_100": {"accuracy": 0.520625, "f1": 0.01287001287001287}, "dna_protein_pair_rand_full": {"accuracy": 0.474375, "f1": 0.01866977829638273}}
|
| 11 |
+
{"seed": 11, "en": {"accuracy": 0.8835, "f1": 0.8738494856524093}, "fr": {"accuracy": 0.8025, "f1": 0.8027958062905641}, "de": {"accuracy": 0.7605, "f1": 0.7511688311688312}, "zh": {"accuracy": 0.708, "f1": 0.6620370370370371}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9258333333333333, "f1": 0.9206066012488849}, "dna_sim_pair_150bp": {"accuracy": 0.7435, "f1": 0.6361702127659574}, "dna_sim_pair_50bp": {"accuracy": 0.6915, "f1": 0.6087507926442612}, "protein_sim_pair_150bp": {"accuracy": 0.925, "f1": 0.923425978445831}, "protein_sim_pair_450bp": {"accuracy": 0.8894444444444445, "f1": 0.8763206960845246}, "dna_protein_pair": {"accuracy": 0.4675, "f1": 0.009302325581395349}, "dna_protein_pair_100": {"accuracy": 0.5425, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.465, "f1": 0.02727272727272727}, "dna_protein_pair_rand": {"accuracy": 0.511875, "f1": 0.03936039360393604}, "dna_protein_pair_rand_100": {"accuracy": 0.50625, "f1": 0.017412935323383085}, "dna_protein_pair_rand_full": {"accuracy": 0.509375, "f1": 0.024844720496894408}}
|
| 12 |
+
{"seed": 12, "en": {"accuracy": 0.886, "f1": 0.8759521218715995}, "fr": {"accuracy": 0.7965, "f1": 0.7890098496630379}, "de": {"accuracy": 0.7705, "f1": 0.7552}, "zh": {"accuracy": 0.7305, "f1": 0.6914710933028048}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8952777777777777, "f1": 0.8899270072992701}, "dna_sim_pair_150bp": {"accuracy": 0.6635, "f1": 0.5213371266002845}, "dna_sim_pair_50bp": {"accuracy": 0.472, "f1": 0.5735056542810986}, "protein_sim_pair_150bp": {"accuracy": 0.9188888888888889, "f1": 0.9140164899882215}, "protein_sim_pair_450bp": {"accuracy": 0.95, "f1": 0.9497767857142857}, "dna_protein_pair": {"accuracy": 0.475, "f1": 0.027777777777777776}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.08368200836820083}, "dna_protein_pair_rand": {"accuracy": 0.48875, "f1": 0.007281553398058253}, "dna_protein_pair_rand_100": {"accuracy": 0.5025, "f1": 0.01485148514851485}, "dna_protein_pair_rand_full": {"accuracy": 0.474375, "f1": 0.06243032329988852}}
|
| 13 |
+
{"seed": 13, "en": {"accuracy": 0.8955, "f1": 0.8873315363881401}, "fr": {"accuracy": 0.812, "f1": 0.8039624608967675}, "de": {"accuracy": 0.7785, "f1": 0.7611859838274933}, "zh": {"accuracy": 0.719, "f1": 0.6915477497255763}, "dna_sim_pair_simple_150bp": {"accuracy": 0.92, "f1": 0.9119266055045872}, "dna_sim_pair_150bp": {"accuracy": 0.70925, "f1": 0.5929296464823242}, "dna_sim_pair_50bp": {"accuracy": 0.594, "f1": 0.2852112676056338}, "protein_sim_pair_150bp": {"accuracy": 0.9455555555555556, "f1": 0.9439359267734554}, "protein_sim_pair_450bp": {"accuracy": 0.8977777777777778, "f1": 0.8908659549228944}, "dna_protein_pair": {"accuracy": 0.535, "f1": 0.021052631578947368}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.009615384615384616}, "dna_protein_pair_full": {"accuracy": 0.45, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.499375, "f1": 0.012330456226880395}, "dna_protein_pair_rand_100": {"accuracy": 0.51, "f1": 0.005076142131979695}, "dna_protein_pair_rand_full": {"accuracy": 0.4975, "f1": 0.0049504950495049506}}
|
| 14 |
+
{"seed": 14, "en": {"accuracy": 0.8825, "f1": 0.8759894459102903}, "fr": {"accuracy": 0.7905, "f1": 0.7992333493052228}, "de": {"accuracy": 0.755, "f1": 0.7651006711409396}, "zh": {"accuracy": 0.697, "f1": 0.7173507462686567}, "dna_sim_pair_simple_150bp": {"accuracy": 0.6244444444444445, "f1": 0.7167993297025556}, "dna_sim_pair_150bp": {"accuracy": 0.57425, "f1": 0.6696411251212415}, "dna_sim_pair_50bp": {"accuracy": 0.459, "f1": 0.62560553633218}, "protein_sim_pair_150bp": {"accuracy": 0.6972222222222222, "f1": 0.7570218457423094}, "protein_sim_pair_450bp": {"accuracy": 0.8488888888888889, "f1": 0.846674182638106}, "dna_protein_pair": {"accuracy": 0.4575, "f1": 0.42133333333333334}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.20425531914893616}, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.12987012987012986}, "dna_protein_pair_rand": {"accuracy": 0.53875, "f1": 0.4383561643835616}, "dna_protein_pair_rand_100": {"accuracy": 0.524375, "f1": 0.17011995637949837}, "dna_protein_pair_rand_full": {"accuracy": 0.496875, "f1": 0.08209806157354618}}
|
| 15 |
+
{"seed": 15, "en": {"accuracy": 0.8945, "f1": 0.8857606930157012}, "fr": {"accuracy": 0.807, "f1": 0.8058350100603622}, "de": {"accuracy": 0.768, "f1": 0.768}, "zh": {"accuracy": 0.7265, "f1": 0.6969529085872577}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9091666666666667, "f1": 0.9004566210045662}, "dna_sim_pair_150bp": {"accuracy": 0.6815, "f1": 0.510752688172043}, "dna_sim_pair_50bp": {"accuracy": 0.6495, "f1": 0.4811250925240563}, "protein_sim_pair_150bp": {"accuracy": 0.9372222222222222, "f1": 0.9338794616734932}, "protein_sim_pair_450bp": {"accuracy": 0.845, "f1": 0.8203477141017386}, "dna_protein_pair": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4975, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.51875, "f1": 0.0}, "dna_protein_pair_rand_100": {"accuracy": 0.519375, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.498125, "f1": 0.0}}
|
| 16 |
+
{"seed": 16, "en": {"accuracy": 0.8725, "f1": 0.8614883215643672}, "fr": {"accuracy": 0.795, "f1": 0.7964250248262165}, "de": {"accuracy": 0.759, "f1": 0.76162215628091}, "zh": {"accuracy": 0.7105, "f1": 0.7065382665990877}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9227777777777778, "f1": 0.9177027827116637}, "dna_sim_pair_150bp": {"accuracy": 0.703, "f1": 0.5875}, "dna_sim_pair_50bp": {"accuracy": 0.727, "f1": 0.6305818673883626}, "protein_sim_pair_150bp": {"accuracy": 0.9683333333333334, "f1": 0.9681386249301286}, "protein_sim_pair_450bp": {"accuracy": 0.9072222222222223, "f1": 0.9022820362785254}, "dna_protein_pair": {"accuracy": 0.52, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.515625, "f1": 0.002574002574002574}, "dna_protein_pair_rand_100": {"accuracy": 0.500625, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.50375, "f1": 0.02457002457002457}}
|
| 17 |
+
{"seed": 17, "en": {"accuracy": 0.886, "f1": 0.8758169934640523}, "fr": {"accuracy": 0.8155, "f1": 0.8050713153724247}, "de": {"accuracy": 0.7715, "f1": 0.7565263718700054}, "zh": {"accuracy": 0.7275, "f1": 0.712401055408971}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8986111111111111, "f1": 0.8996425625515535}, "dna_sim_pair_150bp": {"accuracy": 0.7325, "f1": 0.6749696233292831}, "dna_sim_pair_50bp": {"accuracy": 0.5555, "f1": 0.44885306881587106}, "protein_sim_pair_150bp": {"accuracy": 0.9422222222222222, "f1": 0.9395348837209302}, "protein_sim_pair_450bp": {"accuracy": 0.9577777777777777, "f1": 0.9563218390804598}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.495, "f1": 0.0024691358024691358}, "dna_protein_pair_rand_100": {"accuracy": 0.49625, "f1": 0.0024752475247524753}, "dna_protein_pair_rand_full": {"accuracy": 0.501875, "f1": 0.0}}
|
| 18 |
+
{"seed": 18, "en": {"accuracy": 0.872, "f1": 0.8659685863874346}, "fr": {"accuracy": 0.7995, "f1": 0.7981882234524409}, "de": {"accuracy": 0.774, "f1": 0.7648283038501561}, "zh": {"accuracy": 0.724, "f1": 0.7100840336134454}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8791666666666667, "f1": 0.8627327232565478}, "dna_sim_pair_150bp": {"accuracy": 0.593, "f1": 0.3165407220822838}, "dna_sim_pair_50bp": {"accuracy": 0.6615, "f1": 0.5125989920806335}, "protein_sim_pair_150bp": {"accuracy": 0.9394444444444444, "f1": 0.9339794064203513}, "protein_sim_pair_450bp": {"accuracy": 0.9161111111111111, "f1": 0.9104919976289271}, "dna_protein_pair": {"accuracy": 0.555, "f1": 0.011111111111111112}, "dna_protein_pair_100": {"accuracy": 0.4925, "f1": 0.00975609756097561}, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.503125, "f1": 0.0}, "dna_protein_pair_rand_100": {"accuracy": 0.479375, "f1": 0.01652892561983471}, "dna_protein_pair_rand_full": {"accuracy": 0.520625, "f1": 0.01540436456996149}}
|
| 19 |
+
{"seed": 19, "en": {"accuracy": 0.887, "f1": 0.8810526315789474}, "fr": {"accuracy": 0.8005, "f1": 0.797153024911032}, "de": {"accuracy": 0.778, "f1": 0.76875}, "zh": {"accuracy": 0.713, "f1": 0.7007299270072993}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9422222222222222, "f1": 0.93885949441505}, "dna_sim_pair_150bp": {"accuracy": 0.7455, "f1": 0.6651315789473684}, "dna_sim_pair_50bp": {"accuracy": 0.794, "f1": 0.7927565392354124}, "protein_sim_pair_150bp": {"accuracy": 0.9272222222222222, "f1": 0.9322997416020672}, "protein_sim_pair_450bp": {"accuracy": 0.8827777777777778, "f1": 0.878386167146974}, "dna_protein_pair": {"accuracy": 0.53, "f1": 0.19658119658119658}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.10434782608695652}, "dna_protein_pair_full": {"accuracy": 0.485, "f1": 0.1693548387096774}, "dna_protein_pair_rand": {"accuracy": 0.513125, "f1": 0.21708542713567838}, "dna_protein_pair_rand_100": {"accuracy": 0.468125, "f1": 0.10137275607180571}, "dna_protein_pair_rand_full": {"accuracy": 0.49, "f1": 0.1724137931034483}}
|
| 20 |
+
{"seed": 20, "en": {"accuracy": 0.8855, "f1": 0.8757460661964189}, "fr": {"accuracy": 0.827, "f1": 0.8220164609053497}, "de": {"accuracy": 0.784, "f1": 0.767491926803014}, "zh": {"accuracy": 0.716, "f1": 0.6833890746934225}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9355555555555556, "f1": 0.9318048206937096}, "dna_sim_pair_150bp": {"accuracy": 0.70825, "f1": 0.5938043856595893}, "dna_sim_pair_50bp": {"accuracy": 0.644, "f1": 0.538860103626943}, "protein_sim_pair_150bp": {"accuracy": 0.9644444444444444, "f1": 0.9646799116997793}, "protein_sim_pair_450bp": {"accuracy": 0.9266666666666666, "f1": 0.9231664726426076}, "dna_protein_pair": {"accuracy": 0.4775, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.505625, "f1": 0.005031446540880503}, "dna_protein_pair_rand_100": {"accuracy": 0.5075, "f1": 0.005050505050505051}, "dna_protein_pair_rand_full": {"accuracy": 0.51875, "f1": 0.007731958762886598}}
|
| 21 |
+
{"seed": 21, "en": {"accuracy": 0.874, "f1": 0.8675078864353313}, "fr": {"accuracy": 0.771, "f1": 0.7806513409961686}, "de": {"accuracy": 0.7475, "f1": 0.7607768829938418}, "zh": {"accuracy": 0.6995, "f1": 0.7069722086786934}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8816666666666667, "f1": 0.8688423645320197}, "dna_sim_pair_150bp": {"accuracy": 0.705, "f1": 0.5958904109589042}, "dna_sim_pair_50bp": {"accuracy": 0.768, "f1": 0.7289719626168224}, "protein_sim_pair_150bp": {"accuracy": 0.9177777777777778, "f1": 0.9247202441505595}, "protein_sim_pair_450bp": {"accuracy": 0.8983333333333333, "f1": 0.9048361934477379}, "dna_protein_pair": {"accuracy": 0.525, "f1": 0.15178571428571427}, "dna_protein_pair_100": {"accuracy": 0.475, "f1": 0.11764705882352941}, "dna_protein_pair_full": {"accuracy": 0.39, "f1": 0.42990654205607476}, "dna_protein_pair_rand": {"accuracy": 0.49, "f1": 0.15702479338842976}, "dna_protein_pair_rand_100": {"accuracy": 0.535625, "f1": 0.14302191464821223}, "dna_protein_pair_rand_full": {"accuracy": 0.490625, "f1": 0.4526527871054399}}
|
| 22 |
+
{"seed": 22, "en": {"accuracy": 0.84, "f1": 0.8247535596933188}, "fr": {"accuracy": 0.7595, "f1": 0.7708432586946165}, "de": {"accuracy": 0.716, "f1": 0.7389705882352942}, "zh": {"accuracy": 0.6735, "f1": 0.700870361887311}, "dna_sim_pair_simple_150bp": {"accuracy": 0.705, "f1": 0.7620967741935484}, "dna_sim_pair_150bp": {"accuracy": 0.67325, "f1": 0.7286692962424746}, "dna_sim_pair_50bp": {"accuracy": 0.4845, "f1": 0.6520418494768815}, "protein_sim_pair_150bp": {"accuracy": 0.5811111111111111, "f1": 0.70546875}, "protein_sim_pair_450bp": {"accuracy": 0.8172222222222222, "f1": 0.8495656149977138}, "dna_protein_pair": {"accuracy": 0.5375, "f1": 0.5268542199488491}, "dna_protein_pair_100": {"accuracy": 0.5275, "f1": 0.08695652173913043}, "dna_protein_pair_full": {"accuracy": 0.38, "f1": 0.5373134328358209}, "dna_protein_pair_rand": {"accuracy": 0.525, "f1": 0.5084087968952135}, "dna_protein_pair_rand_100": {"accuracy": 0.489375, "f1": 0.0932297447280799}, "dna_protein_pair_rand_full": {"accuracy": 0.459375, "f1": 0.5963602426504899}}
|
| 23 |
+
{"seed": 23, "en": {"accuracy": 0.8695, "f1": 0.8628481345244351}, "fr": {"accuracy": 0.774, "f1": 0.7757936507936508}, "de": {"accuracy": 0.748, "f1": 0.7495029821073559}, "zh": {"accuracy": 0.7065, "f1": 0.7086848635235732}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9219444444444445, "f1": 0.9214864487286951}, "dna_sim_pair_150bp": {"accuracy": 0.7935, "f1": 0.7767567567567567}, "dna_sim_pair_50bp": {"accuracy": 0.6235, "f1": 0.5388854868340478}, "protein_sim_pair_150bp": {"accuracy": 0.9066666666666666, "f1": 0.9074889867841409}, "protein_sim_pair_450bp": {"accuracy": 0.91, "f1": 0.9124324324324324}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.11711711711711711}, "dna_protein_pair_100": {"accuracy": 0.5225, "f1": 0.1511111111111111}, "dna_protein_pair_full": {"accuracy": 0.3575, "f1": 0.4145785876993166}, "dna_protein_pair_rand": {"accuracy": 0.544375, "f1": 0.21528525296017223}, "dna_protein_pair_rand_100": {"accuracy": 0.506875, "f1": 0.10847457627118644}, "dna_protein_pair_rand_full": {"accuracy": 0.475625, "f1": 0.424159231297186}}
|
| 24 |
+
{"seed": 24, "en": {"accuracy": 0.8735, "f1": 0.8691153647180548}, "fr": {"accuracy": 0.7815, "f1": 0.7923990498812351}, "de": {"accuracy": 0.7545, "f1": 0.7656324582338903}, "zh": {"accuracy": 0.7125, "f1": 0.7193753050268423}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8238888888888889, "f1": 0.8467858869018849}, "dna_sim_pair_150bp": {"accuracy": 0.72225, "f1": 0.7203624465139693}, "dna_sim_pair_50bp": {"accuracy": 0.508, "f1": 0.6675675675675675}, "protein_sim_pair_150bp": {"accuracy": 0.7261111111111112, "f1": 0.7780279153534444}, "protein_sim_pair_450bp": {"accuracy": 0.8838888888888888, "f1": 0.8878153515834675}, "dna_protein_pair": {"accuracy": 0.47, "f1": 0.28859060402684567}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.03686635944700461}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.14847161572052403}, "dna_protein_pair_rand": {"accuracy": 0.536875, "f1": 0.3220494053064959}, "dna_protein_pair_rand_100": {"accuracy": 0.50625, "f1": 0.04819277108433735}, "dna_protein_pair_rand_full": {"accuracy": 0.551875, "f1": 0.3059051306873185}}
|
| 25 |
+
{"seed": 25, "en": {"accuracy": 0.8805, "f1": 0.8728046833422033}, "fr": {"accuracy": 0.783, "f1": 0.7893203883495146}, "de": {"accuracy": 0.7745, "f1": 0.7711821410451547}, "zh": {"accuracy": 0.693, "f1": 0.6870540265035678}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9272222222222222, "f1": 0.9254835039817975}, "dna_sim_pair_150bp": {"accuracy": 0.74775, "f1": 0.6934062594955941}, "dna_sim_pair_50bp": {"accuracy": 0.611, "f1": 0.69609375}, "protein_sim_pair_150bp": {"accuracy": 0.9244444444444444, "f1": 0.9287211740041929}, "protein_sim_pair_450bp": {"accuracy": 0.8683333333333333, "f1": 0.8539741219963032}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.16}, "dna_protein_pair_100": {"accuracy": 0.545, "f1": 0.10784313725490197}, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.05429864253393665}, "dna_protein_pair_rand": {"accuracy": 0.525, "f1": 0.21161825726141079}, "dna_protein_pair_rand_100": {"accuracy": 0.5175, "f1": 0.06987951807228916}, "dna_protein_pair_rand_full": {"accuracy": 0.51, "f1": 0.04156479217603912}}
|
| 26 |
+
{"seed": 26, "en": {"accuracy": 0.8615, "f1": 0.8544403573305307}, "fr": {"accuracy": 0.7635, "f1": 0.7716079188797682}, "de": {"accuracy": 0.748, "f1": 0.7459677419354839}, "zh": {"accuracy": 0.6955, "f1": 0.7120567375886525}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7847222222222222, "f1": 0.8073576932637335}, "dna_sim_pair_150bp": {"accuracy": 0.72825, "f1": 0.7416211076776801}, "dna_sim_pair_50bp": {"accuracy": 0.503, "f1": 0.6403762662807525}, "protein_sim_pair_150bp": {"accuracy": 0.9255555555555556, "f1": 0.9270152505446623}, "protein_sim_pair_450bp": {"accuracy": 0.9738888888888889, "f1": 0.9743589743589743}, "dna_protein_pair": {"accuracy": 0.45, "f1": 0.03508771929824561}, "dna_protein_pair_100": {"accuracy": 0.48, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.525, "f1": 0.030612244897959183}, "dna_protein_pair_rand": {"accuracy": 0.505625, "f1": 0.11422172452407615}, "dna_protein_pair_rand_100": {"accuracy": 0.51125, "f1": 0.017587939698492462}, "dna_protein_pair_rand_full": {"accuracy": 0.491875, "f1": 0.04014167650531287}}
|
| 27 |
+
{"seed": 27, "en": {"accuracy": 0.8815, "f1": 0.8681135225375626}, "fr": {"accuracy": 0.812, "f1": 0.8008474576271186}, "de": {"accuracy": 0.778, "f1": 0.7623126338329764}, "zh": {"accuracy": 0.7175, "f1": 0.699308142629058}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9061111111111111, "f1": 0.9016870273414777}, "dna_sim_pair_150bp": {"accuracy": 0.7425, "f1": 0.6836609336609336}, "dna_sim_pair_50bp": {"accuracy": 0.622, "f1": 0.6698689956331878}, "protein_sim_pair_150bp": {"accuracy": 0.8916666666666667, "f1": 0.8993288590604027}, "protein_sim_pair_450bp": {"accuracy": 0.8988888888888888, "f1": 0.8969422423556059}, "dna_protein_pair": {"accuracy": 0.5175, "f1": 0.10232558139534884}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.038834951456310676}, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.18326693227091634}, "dna_protein_pair_rand": {"accuracy": 0.523125, "f1": 0.1839572192513369}, "dna_protein_pair_rand_100": {"accuracy": 0.52625, "f1": 0.07334963325183375}, "dna_protein_pair_rand_full": {"accuracy": 0.52, "f1": 0.1794871794871795}}
|
| 28 |
+
{"seed": 28, "en": {"accuracy": 0.8775, "f1": 0.8744233726294208}, "fr": {"accuracy": 0.77, "f1": 0.786046511627907}, "de": {"accuracy": 0.748, "f1": 0.76}, "zh": {"accuracy": 0.695, "f1": 0.7183748845798708}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8963888888888889, "f1": 0.9019710906701708}, "dna_sim_pair_150bp": {"accuracy": 0.79675, "f1": 0.7919119529050422}, "dna_sim_pair_50bp": {"accuracy": 0.609, "f1": 0.718299711815562}, "protein_sim_pair_150bp": {"accuracy": 0.855, "f1": 0.8718703976435935}, "protein_sim_pair_450bp": {"accuracy": 0.9211111111111111, "f1": 0.9232432432432433}, "dna_protein_pair": {"accuracy": 0.4625, "f1": 0.0851063829787234}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.027906976744186046}, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.00966183574879227}, "dna_protein_pair_rand": {"accuracy": 0.5125, "f1": 0.1352549889135255}, "dna_protein_pair_rand_100": {"accuracy": 0.4975, "f1": 0.0405727923627685}, "dna_protein_pair_rand_full": {"accuracy": 0.505625, "f1": 0.03654080389768575}}
|
| 29 |
+
{"seed": 29, "en": {"accuracy": 0.8855, "f1": 0.8804177545691906}, "fr": {"accuracy": 0.7855, "f1": 0.7936507936507936}, "de": {"accuracy": 0.762, "f1": 0.7652859960552268}, "zh": {"accuracy": 0.7115, "f1": 0.7039507439712673}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9522222222222222, "f1": 0.9517666853617499}, "dna_sim_pair_150bp": {"accuracy": 0.7995, "f1": 0.7530788177339901}, "dna_sim_pair_50bp": {"accuracy": 0.7345, "f1": 0.6885630498533725}, "protein_sim_pair_150bp": {"accuracy": 0.9705555555555555, "f1": 0.9718832891246685}, "protein_sim_pair_450bp": {"accuracy": 0.9588888888888889, "f1": 0.9587513935340022}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.020942408376963352}, "dna_protein_pair_100": {"accuracy": 0.54, "f1": 0.010752688172043012}, "dna_protein_pair_full": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.505, "f1": 0.019801980198019802}, "dna_protein_pair_rand_100": {"accuracy": 0.504375, "f1": 0.005018820577164366}, "dna_protein_pair_rand_full": {"accuracy": 0.503125, "f1": 0.009962640099626401}}
|
| 30 |
+
{"seed": 30, "en": {"accuracy": 0.868, "f1": 0.8563656147986942}, "fr": {"accuracy": 0.7905, "f1": 0.79369768586903}, "de": {"accuracy": 0.766, "f1": 0.7523809523809524}, "zh": {"accuracy": 0.7155, "f1": 0.709545686574783}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9177777777777778, "f1": 0.9157655093910074}, "dna_sim_pair_150bp": {"accuracy": 0.7755, "f1": 0.7328970850684117}, "dna_sim_pair_50bp": {"accuracy": 0.53, "f1": 0.5837023914969}, "protein_sim_pair_150bp": {"accuracy": 0.9261111111111111, "f1": 0.9264787175234936}, "protein_sim_pair_450bp": {"accuracy": 0.9327777777777778, "f1": 0.9328896283971159}, "dna_protein_pair": {"accuracy": 0.4875, "f1": 0.019138755980861243}, "dna_protein_pair_100": {"accuracy": 0.5225, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.06542056074766354}, "dna_protein_pair_rand": {"accuracy": 0.506875, "f1": 0.024721878862793572}, "dna_protein_pair_rand_100": {"accuracy": 0.524375, "f1": 0.010403120936280884}, "dna_protein_pair_rand_full": {"accuracy": 0.521875, "f1": 0.12571428571428572}}
|
| 31 |
+
{"seed": 31, "en": {"accuracy": 0.8725, "f1": 0.8661417322834646}, "fr": {"accuracy": 0.771, "f1": 0.7845719661335842}, "de": {"accuracy": 0.766, "f1": 0.7701375245579568}, "zh": {"accuracy": 0.6825, "f1": 0.7166443551985721}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7336111111111111, "f1": 0.7831788378928329}, "dna_sim_pair_150bp": {"accuracy": 0.66125, "f1": 0.7085394708539471}, "dna_sim_pair_50bp": {"accuracy": 0.5115, "f1": 0.6662111376836352}, "protein_sim_pair_150bp": {"accuracy": 0.8411111111111111, "f1": 0.8565697091273822}, "protein_sim_pair_450bp": {"accuracy": 0.9055555555555556, "f1": 0.9113660062565172}, "dna_protein_pair": {"accuracy": 0.4625, "f1": 0.3042071197411003}, "dna_protein_pair_100": {"accuracy": 0.49, "f1": 0.02857142857142857}, "dna_protein_pair_full": {"accuracy": 0.4475, "f1": 0.2706270627062706}, "dna_protein_pair_rand": {"accuracy": 0.545, "f1": 0.3591549295774648}, "dna_protein_pair_rand_100": {"accuracy": 0.53125, "f1": 0.07862407862407862}, "dna_protein_pair_rand_full": {"accuracy": 0.52625, "f1": 0.3374125874125874}}
|
| 32 |
+
{"seed": 32, "en": {"accuracy": 0.8635, "f1": 0.8577384054194893}, "fr": {"accuracy": 0.7775, "f1": 0.782820888238165}, "de": {"accuracy": 0.751, "f1": 0.7549212598425197}, "zh": {"accuracy": 0.692, "f1": 0.7069457659372027}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9380555555555555, "f1": 0.9354184766869389}, "dna_sim_pair_150bp": {"accuracy": 0.76125, "f1": 0.701095461658842}, "dna_sim_pair_50bp": {"accuracy": 0.727, "f1": 0.6650306748466258}, "protein_sim_pair_150bp": {"accuracy": 0.9688888888888889, "f1": 0.9701492537313433}, "protein_sim_pair_450bp": {"accuracy": 0.9294444444444444, "f1": 0.9258610624635143}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.1}, "dna_protein_pair_100": {"accuracy": 0.4575, "f1": 0.0091324200913242}, "dna_protein_pair_full": {"accuracy": 0.54, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.5125, "f1": 0.09302325581395349}, "dna_protein_pair_rand_100": {"accuracy": 0.496875, "f1": 0.060676779463243874}, "dna_protein_pair_rand_full": {"accuracy": 0.498125, "f1": 0.019536019536019536}}
|
| 33 |
+
{"seed": 33, "en": {"accuracy": 0.8955, "f1": 0.8894764674775251}, "fr": {"accuracy": 0.816, "f1": 0.8137651821862348}, "de": {"accuracy": 0.7805, "f1": 0.7768174885612608}, "zh": {"accuracy": 0.7145, "f1": 0.703068122724909}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9097222222222222, "f1": 0.912233324331623}, "dna_sim_pair_150bp": {"accuracy": 0.7485, "f1": 0.7110855829982768}, "dna_sim_pair_50bp": {"accuracy": 0.589, "f1": 0.691904047976012}, "protein_sim_pair_150bp": {"accuracy": 0.9272222222222222, "f1": 0.9297587131367292}, "protein_sim_pair_450bp": {"accuracy": 0.8955555555555555, "f1": 0.8879618593563766}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.13023255813953488}, "dna_protein_pair_100": {"accuracy": 0.5, "f1": 0.009900990099009901}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.19008264462809918}, "dna_protein_pair_rand": {"accuracy": 0.535625, "f1": 0.2694198623402163}, "dna_protein_pair_rand_100": {"accuracy": 0.520625, "f1": 0.06349206349206349}, "dna_protein_pair_rand_full": {"accuracy": 0.536875, "f1": 0.2949571836346337}}
|
| 34 |
+
{"seed": 34, "en": {"accuracy": 0.8805, "f1": 0.867590027700831}, "fr": {"accuracy": 0.8005, "f1": 0.7851373182552503}, "de": {"accuracy": 0.7655, "f1": 0.7525065963060686}, "zh": {"accuracy": 0.723, "f1": 0.7065677966101694}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9258333333333333, "f1": 0.9232538085656798}, "dna_sim_pair_150bp": {"accuracy": 0.816, "f1": 0.7841642228739003}, "dna_sim_pair_50bp": {"accuracy": 0.798, "f1": 0.7799564270152506}, "protein_sim_pair_150bp": {"accuracy": 0.9611111111111111, "f1": 0.9604072398190046}, "protein_sim_pair_450bp": {"accuracy": 0.6638888888888889, "f1": 0.49958643507030603}, "dna_protein_pair": {"accuracy": 0.56, "f1": 0.022222222222222223}, "dna_protein_pair_100": {"accuracy": 0.5275, "f1": 0.02072538860103627}, "dna_protein_pair_full": {"accuracy": 0.36, "f1": 0.47107438016528924}, "dna_protein_pair_rand": {"accuracy": 0.50375, "f1": 0.00997506234413965}, "dna_protein_pair_rand_100": {"accuracy": 0.52625, "f1": 0.013020833333333334}, "dna_protein_pair_rand_full": {"accuracy": 0.525625, "f1": 0.5474060822898033}}
|
| 35 |
+
{"seed": 35, "en": {"accuracy": 0.8865, "f1": 0.8791910590739755}, "fr": {"accuracy": 0.788, "f1": 0.7975167144221585}, "de": {"accuracy": 0.7565, "f1": 0.7575908412145346}, "zh": {"accuracy": 0.719, "f1": 0.7175879396984924}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9175, "f1": 0.9117909117909118}, "dna_sim_pair_150bp": {"accuracy": 0.80625, "f1": 0.7683109118086696}, "dna_sim_pair_50bp": {"accuracy": 0.716, "f1": 0.7380073800738007}, "protein_sim_pair_150bp": {"accuracy": 0.9472222222222222, "f1": 0.9480021893814997}, "protein_sim_pair_450bp": {"accuracy": 0.8955555555555555, "f1": 0.8973799126637555}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.010471204188481676}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.056074766355140186}, "dna_protein_pair_full": {"accuracy": 0.37, "f1": 0.5097276264591439}, "dna_protein_pair_rand": {"accuracy": 0.488125, "f1": 0.023837902264600714}, "dna_protein_pair_rand_100": {"accuracy": 0.5025, "f1": 0.031630170316301706}, "dna_protein_pair_rand_full": {"accuracy": 0.46375, "f1": 0.5760869565217391}}
|
| 36 |
+
{"seed": 36, "en": {"accuracy": 0.875, "f1": 0.8708677685950413}, "fr": {"accuracy": 0.7935, "f1": 0.7974497302599314}, "de": {"accuracy": 0.764, "f1": 0.7665677546983185}, "zh": {"accuracy": 0.704, "f1": 0.7145612343297975}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9427777777777778, "f1": 0.9409742120343839}, "dna_sim_pair_150bp": {"accuracy": 0.81775, "f1": 0.7816711590296496}, "dna_sim_pair_50bp": {"accuracy": 0.813, "f1": 0.7889390519187359}, "protein_sim_pair_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9431818181818182}, "protein_sim_pair_450bp": {"accuracy": 0.9122222222222223, "f1": 0.9159574468085107}, "dna_protein_pair": {"accuracy": 0.5375, "f1": 0.07960199004975124}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.038834951456310676}, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.17699115044247787}, "dna_protein_pair_rand": {"accuracy": 0.511875, "f1": 0.10946408209806158}, "dna_protein_pair_rand_100": {"accuracy": 0.53, "f1": 0.10476190476190476}, "dna_protein_pair_rand_full": {"accuracy": 0.5225, "f1": 0.2899628252788104}}
|
| 37 |
+
{"seed": 37, "en": {"accuracy": 0.861, "f1": 0.8547544409613375}, "fr": {"accuracy": 0.7825, "f1": 0.7804139323573952}, "de": {"accuracy": 0.75, "f1": 0.7443762781186094}, "zh": {"accuracy": 0.6715, "f1": 0.669350780070458}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9205555555555556, "f1": 0.9148302561048243}, "dna_sim_pair_150bp": {"accuracy": 0.72, "f1": 0.6174863387978142}, "dna_sim_pair_50bp": {"accuracy": 0.743, "f1": 0.7283298097251586}, "protein_sim_pair_150bp": {"accuracy": 0.9472222222222222, "f1": 0.9471341124095715}, "protein_sim_pair_450bp": {"accuracy": 0.8788888888888889, "f1": 0.8604353393085787}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.5375, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.5025, "f1": 0.022113022113022112}, "dna_protein_pair_rand_100": {"accuracy": 0.48375, "f1": 0.009592326139088728}, "dna_protein_pair_rand_full": {"accuracy": 0.495625, "f1": 0.002472187886279357}}
|
| 38 |
+
{"seed": 38, "en": {"accuracy": 0.8315, "f1": 0.8064330844342332}, "fr": {"accuracy": 0.7655, "f1": 0.7463493780421849}, "de": {"accuracy": 0.7345, "f1": 0.7143625605164067}, "zh": {"accuracy": 0.711, "f1": 0.6995841995841996}, "dna_sim_pair_simple_150bp": {"accuracy": 0.89, "f1": 0.8933764135702746}, "dna_sim_pair_150bp": {"accuracy": 0.78825, "f1": 0.7789089010702167}, "dna_sim_pair_50bp": {"accuracy": 0.5365, "f1": 0.6713931230060263}, "protein_sim_pair_150bp": {"accuracy": 0.9444444444444444, "f1": 0.9431171786120591}, "protein_sim_pair_450bp": {"accuracy": 0.9111111111111111, "f1": 0.909706546275395}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.17796610169491525}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.00966183574879227}, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.2546816479400749}, "dna_protein_pair_rand": {"accuracy": 0.51, "f1": 0.05084745762711865}, "dna_protein_pair_rand_100": {"accuracy": 0.495625, "f1": 0.02181818181818182}, "dna_protein_pair_rand_full": {"accuracy": 0.48875, "f1": 0.2164750957854406}}
|
| 39 |
+
{"seed": 39, "en": {"accuracy": 0.8735, "f1": 0.8640515851692638}, "fr": {"accuracy": 0.795, "f1": 0.7910295616717635}, "de": {"accuracy": 0.766, "f1": 0.7577639751552795}, "zh": {"accuracy": 0.704, "f1": 0.6887486855941115}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9336111111111111, "f1": 0.9321600908316775}, "dna_sim_pair_150bp": {"accuracy": 0.785, "f1": 0.7345679012345679}, "dna_sim_pair_50bp": {"accuracy": 0.679, "f1": 0.7251712328767124}, "protein_sim_pair_150bp": {"accuracy": 0.9577777777777777, "f1": 0.9575418994413408}, "protein_sim_pair_450bp": {"accuracy": 0.8761111111111111, "f1": 0.862600123228589}, "dna_protein_pair": {"accuracy": 0.52, "f1": 0.08571428571428572}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.050505050505050504}, "dna_protein_pair_full": {"accuracy": 0.53, "f1": 0.06930693069306931}, "dna_protein_pair_rand": {"accuracy": 0.515, "f1": 0.07177033492822966}, "dna_protein_pair_rand_100": {"accuracy": 0.47875, "f1": 0.04576659038901602}, "dna_protein_pair_rand_full": {"accuracy": 0.510625, "f1": 0.10718358038768529}}
|
| 40 |
+
{"seed": 41, "en": {"accuracy": 0.882, "f1": 0.8770833333333333}, "fr": {"accuracy": 0.799, "f1": 0.8061716489874639}, "de": {"accuracy": 0.77, "f1": 0.7725024727992087}, "zh": {"accuracy": 0.7095, "f1": 0.7055245818550431}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9077777777777778, "f1": 0.9029807130333138}, "dna_sim_pair_150bp": {"accuracy": 0.688, "f1": 0.5714285714285714}, "dna_sim_pair_50bp": {"accuracy": 0.667, "f1": 0.7245657568238213}, "protein_sim_pair_150bp": {"accuracy": 0.8961111111111111, "f1": 0.9018372703412073}, "protein_sim_pair_450bp": {"accuracy": 0.835, "f1": 0.8251912889935256}, "dna_protein_pair": {"accuracy": 0.465, "f1": 0.09322033898305085}, "dna_protein_pair_100": {"accuracy": 0.54, "f1": 0.0891089108910891}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.32051282051282054}, "dna_protein_pair_rand": {"accuracy": 0.523125, "f1": 0.16429353778751368}, "dna_protein_pair_rand_100": {"accuracy": 0.52625, "f1": 0.11448598130841121}, "dna_protein_pair_rand_full": {"accuracy": 0.494375, "f1": 0.43307638402242465}}
|
| 41 |
+
{"seed": 42, "en": {"accuracy": 0.874, "f1": 0.8679245283018868}, "fr": {"accuracy": 0.8015, "f1": 0.8015992003998001}, "de": {"accuracy": 0.761, "f1": 0.7642998027613412}, "zh": {"accuracy": 0.71, "f1": 0.702258726899384}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8925, "f1": 0.8897121687090339}, "dna_sim_pair_150bp": {"accuracy": 0.76025, "f1": 0.7151767151767152}, "dna_sim_pair_50bp": {"accuracy": 0.53, "f1": 0.6495152870991797}, "protein_sim_pair_150bp": {"accuracy": 0.9566666666666667, "f1": 0.9555808656036446}, "protein_sim_pair_450bp": {"accuracy": 0.9355555555555556, "f1": 0.9344632768361582}, "dna_protein_pair": {"accuracy": 0.5375, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.10441767068273092}, "dna_protein_pair_rand": {"accuracy": 0.516875, "f1": 0.015286624203821656}, "dna_protein_pair_rand_100": {"accuracy": 0.5075, "f1": 0.005050505050505051}, "dna_protein_pair_rand_full": {"accuracy": 0.52375, "f1": 0.12814645308924486}}
|
| 42 |
+
{"seed": 43, "en": {"accuracy": 0.885, "f1": 0.8755411255411255}, "fr": {"accuracy": 0.8205, "f1": 0.8058409951325041}, "de": {"accuracy": 0.791, "f1": 0.7764705882352941}, "zh": {"accuracy": 0.718, "f1": 0.6901098901098901}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9047222222222222, "f1": 0.8987902035998819}, "dna_sim_pair_150bp": {"accuracy": 0.744, "f1": 0.64762560220234}, "dna_sim_pair_50bp": {"accuracy": 0.752, "f1": 0.6852791878172588}, "protein_sim_pair_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9354460093896714}, "protein_sim_pair_450bp": {"accuracy": 0.9511111111111111, "f1": 0.9505061867266592}, "dna_protein_pair": {"accuracy": 0.4975, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.46, "f1": 0.3032258064516129}, "dna_protein_pair_rand": {"accuracy": 0.495, "f1": 0.0049261083743842365}, "dna_protein_pair_rand_100": {"accuracy": 0.495, "f1": 0.0024691358024691358}, "dna_protein_pair_rand_full": {"accuracy": 0.55375, "f1": 0.39285714285714285}}
|
| 43 |
+
{"seed": 44, "en": {"accuracy": 0.884, "f1": 0.875268817204301}, "fr": {"accuracy": 0.788, "f1": 0.788}, "de": {"accuracy": 0.763, "f1": 0.7601214574898786}, "zh": {"accuracy": 0.686, "f1": 0.7158371040723982}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8136111111111111, "f1": 0.8380400675838764}, "dna_sim_pair_150bp": {"accuracy": 0.72575, "f1": 0.7355989395034949}, "dna_sim_pair_50bp": {"accuracy": 0.48, "f1": 0.6264367816091954}, "protein_sim_pair_150bp": {"accuracy": 0.8744444444444445, "f1": 0.8831437435367114}, "protein_sim_pair_450bp": {"accuracy": 0.9072222222222223, "f1": 0.909386869234943}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.3746031746031746}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.1271186440677966}, "dna_protein_pair_full": {"accuracy": 0.3975, "f1": 0.23492063492063492}, "dna_protein_pair_rand": {"accuracy": 0.484375, "f1": 0.3037974683544304}, "dna_protein_pair_rand_100": {"accuracy": 0.506875, "f1": 0.11843575418994413}, "dna_protein_pair_rand_full": {"accuracy": 0.498125, "f1": 0.22265246853823814}}
|
| 44 |
+
{"seed": 45, "en": {"accuracy": 0.883, "f1": 0.8737864077669902}, "fr": {"accuracy": 0.795, "f1": 0.7918781725888325}, "de": {"accuracy": 0.764, "f1": 0.7518401682439537}, "zh": {"accuracy": 0.703, "f1": 0.6799568965517241}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9208333333333333, "f1": 0.9229104679469841}, "dna_sim_pair_150bp": {"accuracy": 0.7655, "f1": 0.7205005959475567}, "dna_sim_pair_50bp": {"accuracy": 0.476, "f1": 0.5604026845637584}, "protein_sim_pair_150bp": {"accuracy": 0.96, "f1": 0.9593220338983051}, "protein_sim_pair_450bp": {"accuracy": 0.9283333333333333, "f1": 0.9299293862031505}, "dna_protein_pair": {"accuracy": 0.5225, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.009950248756218905}, "dna_protein_pair_rand": {"accuracy": 0.5125, "f1": 0.020100502512562814}, "dna_protein_pair_rand_100": {"accuracy": 0.506875, "f1": 0.022304832713754646}, "dna_protein_pair_rand_full": {"accuracy": 0.511875, "f1": 0.02252816020025031}}
|
| 45 |
+
{"seed": 47, "en": {"accuracy": 0.8745, "f1": 0.8678251711427067}, "fr": {"accuracy": 0.8035, "f1": 0.8016153457849571}, "de": {"accuracy": 0.776, "f1": 0.7700205338809035}, "zh": {"accuracy": 0.7045, "f1": 0.7081481481481482}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9119444444444444, "f1": 0.912358307990047}, "dna_sim_pair_150bp": {"accuracy": 0.76875, "f1": 0.7300846221184709}, "dna_sim_pair_50bp": {"accuracy": 0.675, "f1": 0.6968283582089553}, "protein_sim_pair_150bp": {"accuracy": 0.9316666666666666, "f1": 0.9364341085271318}, "protein_sim_pair_450bp": {"accuracy": 0.9172222222222223, "f1": 0.9176340519624102}, "dna_protein_pair": {"accuracy": 0.5225, "f1": 0.13574660633484162}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.01904761904761905}, "dna_protein_pair_full": {"accuracy": 0.3175, "f1": 0.3695150115473441}, "dna_protein_pair_rand": {"accuracy": 0.53375, "f1": 0.10336538461538461}, "dna_protein_pair_rand_100": {"accuracy": 0.4925, "f1": 0.021686746987951807}, "dna_protein_pair_rand_full": {"accuracy": 0.488125, "f1": 0.49287925696594426}}
|
| 46 |
+
{"seed": 48, "en": {"accuracy": 0.866, "f1": 0.8593913955928646}, "fr": {"accuracy": 0.7795, "f1": 0.7856101118133204}, "de": {"accuracy": 0.7405, "f1": 0.7513176808816483}, "zh": {"accuracy": 0.709, "f1": 0.7036659877800407}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8758333333333334, "f1": 0.8839262529213191}, "dna_sim_pair_150bp": {"accuracy": 0.7665, "f1": 0.7566440854611777}, "dna_sim_pair_50bp": {"accuracy": 0.509, "f1": 0.6480286738351254}, "protein_sim_pair_150bp": {"accuracy": 0.9016666666666666, "f1": 0.9071840587309911}, "protein_sim_pair_450bp": {"accuracy": 0.9083333333333333, "f1": 0.9146404552509053}, "dna_protein_pair": {"accuracy": 0.5125, "f1": 0.14847161572052403}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.01904761904761905}, "dna_protein_pair_full": {"accuracy": 0.3675, "f1": 0.22629969418960244}, "dna_protein_pair_rand": {"accuracy": 0.5325, "f1": 0.1282051282051282}, "dna_protein_pair_rand_100": {"accuracy": 0.484375, "f1": 0.0440324449594438}, "dna_protein_pair_rand_full": {"accuracy": 0.519375, "f1": 0.27793427230046946}}
|
| 47 |
+
{"seed": 49, "en": {"accuracy": 0.9005, "f1": 0.890958904109589}, "fr": {"accuracy": 0.802, "f1": 0.797752808988764}, "de": {"accuracy": 0.785, "f1": 0.7695605573419079}, "zh": {"accuracy": 0.7295, "f1": 0.7142102482831485}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9319444444444445, "f1": 0.9285088999124599}, "dna_sim_pair_150bp": {"accuracy": 0.718, "f1": 0.6224899598393574}, "dna_sim_pair_50bp": {"accuracy": 0.6335, "f1": 0.6094832179009056}, "protein_sim_pair_150bp": {"accuracy": 0.9055555555555556, "f1": 0.8957055214723927}, "protein_sim_pair_450bp": {"accuracy": 0.8561111111111112, "f1": 0.8334405144694533}, "dna_protein_pair": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.52, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.499375, "f1": 0.01717791411042945}, "dna_protein_pair_rand_100": {"accuracy": 0.501875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.51, "f1": 0.002544529262086514}}
|
| 48 |
+
{"seed": 50, "en": {"accuracy": 0.8865, "f1": 0.8754799780581459}, "fr": {"accuracy": 0.8215, "f1": 0.8108108108108109}, "de": {"accuracy": 0.776, "f1": 0.7593984962406015}, "zh": {"accuracy": 0.712, "f1": 0.7012448132780082}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9397222222222222, "f1": 0.9370101596516691}, "dna_sim_pair_150bp": {"accuracy": 0.651, "f1": 0.45891472868217054}, "dna_sim_pair_50bp": {"accuracy": 0.763, "f1": 0.6945876288659794}, "protein_sim_pair_150bp": {"accuracy": 0.9516666666666667, "f1": 0.9509859154929577}, "protein_sim_pair_450bp": {"accuracy": 0.7427777777777778, "f1": 0.664735698769008}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.516875, "f1": 0.027672955974842768}, "dna_protein_pair_rand_100": {"accuracy": 0.51, "f1": 0.002544529262086514}, "dna_protein_pair_rand_full": {"accuracy": 0.509375, "f1": 0.0025412960609911056}}
|
| 49 |
+
{"seed": 52, "en": {"accuracy": 0.8945, "f1": 0.8862533692722372}, "fr": {"accuracy": 0.801, "f1": 0.7971457696228338}, "de": {"accuracy": 0.7735, "f1": 0.7636932707355243}, "zh": {"accuracy": 0.715, "f1": 0.698093220338983}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9305555555555556, "f1": 0.9290578887627696}, "dna_sim_pair_150bp": {"accuracy": 0.74675, "f1": 0.6692784851452824}, "dna_sim_pair_50bp": {"accuracy": 0.5685, "f1": 0.3335907335907336}, "protein_sim_pair_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9384098544232923}, "protein_sim_pair_450bp": {"accuracy": 0.9244444444444444, "f1": 0.9227272727272727}, "dna_protein_pair": {"accuracy": 0.5, "f1": 0.009900990099009901}, "dna_protein_pair_100": {"accuracy": 0.4575, "f1": 0.0091324200913242}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.50125, "f1": 0.026829268292682926}, "dna_protein_pair_rand_100": {"accuracy": 0.493125, "f1": 0.012180267965895249}, "dna_protein_pair_rand_full": {"accuracy": 0.489375, "f1": 0.028537455410225922}}
|
| 50 |
+
{"seed": 53, "en": {"accuracy": 0.883, "f1": 0.8725490196078431}, "fr": {"accuracy": 0.8065, "f1": 0.8006182380216383}, "de": {"accuracy": 0.772, "f1": 0.7642192347466391}, "zh": {"accuracy": 0.727, "f1": 0.7061356297093649}, "dna_sim_pair_simple_150bp": {"accuracy": 0.955, "f1": 0.9546218487394958}, "dna_sim_pair_150bp": {"accuracy": 0.7155, "f1": 0.6216755319148937}, "dna_sim_pair_50bp": {"accuracy": 0.772, "f1": 0.7921604375569735}, "protein_sim_pair_150bp": {"accuracy": 0.9044444444444445, "f1": 0.907725321888412}, "protein_sim_pair_450bp": {"accuracy": 0.835, "f1": 0.8147223955084217}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.05555555555555555}, "dna_protein_pair_100": {"accuracy": 0.5425, "f1": 0.010810810810810811}, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.028985507246376812}, "dna_protein_pair_rand": {"accuracy": 0.51625, "f1": 0.11845102505694761}, "dna_protein_pair_rand_100": {"accuracy": 0.4825, "f1": 0.018957345971563982}, "dna_protein_pair_rand_full": {"accuracy": 0.510625, "f1": 0.0345252774352651}}
|
| 51 |
+
{"seed": 54, "en": {"accuracy": 0.9015, "f1": 0.8933405522468868}, "fr": {"accuracy": 0.8225, "f1": 0.8213387015601409}, "de": {"accuracy": 0.773, "f1": 0.7774509803921569}, "zh": {"accuracy": 0.72, "f1": 0.7134083930399181}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9294444444444444, "f1": 0.9291689905186837}, "dna_sim_pair_150bp": {"accuracy": 0.8265, "f1": 0.8025042686397268}, "dna_sim_pair_50bp": {"accuracy": 0.791, "f1": 0.7517814726840855}, "protein_sim_pair_150bp": {"accuracy": 0.9477777777777778, "f1": 0.9489685124864278}, "protein_sim_pair_450bp": {"accuracy": 0.8216666666666667, "f1": 0.8241095890410959}, "dna_protein_pair": {"accuracy": 0.5375, "f1": 0.021164021164021163}, "dna_protein_pair_100": {"accuracy": 0.5, "f1": 0.05660377358490566}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.13821138211382114}, "dna_protein_pair_rand": {"accuracy": 0.519375, "f1": 0.04472049689440994}, "dna_protein_pair_rand_100": {"accuracy": 0.509375, "f1": 0.048484848484848485}, "dna_protein_pair_rand_full": {"accuracy": 0.4975, "f1": 0.056338028169014086}}
|
| 52 |
+
{"seed": 55, "en": {"accuracy": 0.8795, "f1": 0.8683779355543418}, "fr": {"accuracy": 0.796, "f1": 0.7978196233894945}, "de": {"accuracy": 0.756, "f1": 0.7502558853633572}, "zh": {"accuracy": 0.7235, "f1": 0.6989657049537289}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9127777777777778, "f1": 0.9037400367872471}, "dna_sim_pair_150bp": {"accuracy": 0.68975, "f1": 0.5674451028232834}, "dna_sim_pair_50bp": {"accuracy": 0.662, "f1": 0.559322033898305}, "protein_sim_pair_150bp": {"accuracy": 0.9372222222222222, "f1": 0.9334119033588686}, "protein_sim_pair_450bp": {"accuracy": 0.8361111111111111, "f1": 0.8110185778347213}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.465, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.494375, "f1": 0.014616321559074299}, "dna_protein_pair_rand_100": {"accuracy": 0.50125, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.48, "f1": 0.011876484560570071}}
|
| 53 |
+
{"seed": 58, "en": {"accuracy": 0.8805, "f1": 0.8732095490716181}, "fr": {"accuracy": 0.7945, "f1": 0.7976366322008862}, "de": {"accuracy": 0.7665, "f1": 0.7682382133995037}, "zh": {"accuracy": 0.709, "f1": 0.7063572149344097}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9072222222222223, "f1": 0.9066517607602013}, "dna_sim_pair_150bp": {"accuracy": 0.733, "f1": 0.6815742397137746}, "dna_sim_pair_50bp": {"accuracy": 0.5355, "f1": 0.679323438039351}, "protein_sim_pair_150bp": {"accuracy": 0.9405555555555556, "f1": 0.9421308815575987}, "protein_sim_pair_450bp": {"accuracy": 0.8772222222222222, "f1": 0.8686868686868687}, "dna_protein_pair": {"accuracy": 0.53, "f1": 0.08737864077669903}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.02}, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.010309278350515464}, "dna_protein_pair_rand": {"accuracy": 0.491875, "f1": 0.11147540983606558}, "dna_protein_pair_rand_100": {"accuracy": 0.500625, "f1": 0.03151515151515152}, "dna_protein_pair_rand_full": {"accuracy": 0.51, "f1": 0.01507537688442211}}
|
| 54 |
+
{"seed": 59, "en": {"accuracy": 0.882, "f1": 0.8793456032719836}, "fr": {"accuracy": 0.7905, "f1": 0.7984607984607984}, "de": {"accuracy": 0.757, "f1": 0.7631578947368421}, "zh": {"accuracy": 0.6745, "f1": 0.6895565092989986}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9433333333333334, "f1": 0.941747572815534}, "dna_sim_pair_150bp": {"accuracy": 0.716, "f1": 0.6125511596180082}, "dna_sim_pair_50bp": {"accuracy": 0.5705, "f1": 0.5795398923152227}, "protein_sim_pair_150bp": {"accuracy": 0.9638888888888889, "f1": 0.9638688160088938}, "protein_sim_pair_450bp": {"accuracy": 0.9077777777777778, "f1": 0.904707233065442}, "dna_protein_pair": {"accuracy": 0.4675, "f1": 0.018433179723502304}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.01}, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.019417475728155338}, "dna_protein_pair_rand": {"accuracy": 0.4925, "f1": 0.026378896882494004}, "dna_protein_pair_rand_100": {"accuracy": 0.493125, "f1": 0.033373063170441}, "dna_protein_pair_rand_full": {"accuracy": 0.486875, "f1": 0.028402366863905324}}
|
| 55 |
+
{"seed": 63, "en": {"accuracy": 0.8895, "f1": 0.8827586206896552}, "fr": {"accuracy": 0.794, "f1": 0.798828125}, "de": {"accuracy": 0.7725, "f1": 0.7748639287481445}, "zh": {"accuracy": 0.701, "f1": 0.7155090390104663}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8088888888888889, "f1": 0.8302073050345509}, "dna_sim_pair_150bp": {"accuracy": 0.71975, "f1": 0.7321385902031063}, "dna_sim_pair_50bp": {"accuracy": 0.521, "f1": 0.6610049539985846}, "protein_sim_pair_150bp": {"accuracy": 0.9683333333333334, "f1": 0.9686985172981878}, "protein_sim_pair_450bp": {"accuracy": 0.8355555555555556, "f1": 0.8348214285714286}, "dna_protein_pair": {"accuracy": 0.535, "f1": 0.07920792079207921}, "dna_protein_pair_100": {"accuracy": 0.47, "f1": 0.5391304347826087}, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.5}, "dna_protein_pair_rand": {"accuracy": 0.503125, "f1": 0.1657922350472193}, "dna_protein_pair_rand_100": {"accuracy": 0.5275, "f1": 0.6115107913669064}, "dna_protein_pair_rand_full": {"accuracy": 0.6, "f1": 0.627906976744186}}
|
| 56 |
+
{"seed": 64, "en": {"accuracy": 0.889, "f1": 0.880901287553648}, "fr": {"accuracy": 0.8035, "f1": 0.8010126582278481}, "de": {"accuracy": 0.781, "f1": 0.7616974972796517}, "zh": {"accuracy": 0.731, "f1": 0.7126068376068376}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9102777777777777, "f1": 0.9068358811652726}, "dna_sim_pair_150bp": {"accuracy": 0.8365, "f1": 0.8161888701517707}, "dna_sim_pair_50bp": {"accuracy": 0.744, "f1": 0.7282377919320594}, "protein_sim_pair_150bp": {"accuracy": 0.9511111111111111, "f1": 0.9483568075117371}, "protein_sim_pair_450bp": {"accuracy": 0.9361111111111111, "f1": 0.9380053908355795}, "dna_protein_pair": {"accuracy": 0.465, "f1": 0.01834862385321101}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.355, "f1": 0.5132075471698113}, "dna_protein_pair_rand": {"accuracy": 0.4825, "f1": 0.011933174224343675}, "dna_protein_pair_rand_100": {"accuracy": 0.508125, "f1": 0.03907203907203907}, "dna_protein_pair_rand_full": {"accuracy": 0.5175, "f1": 0.6284889316650626}}
|
| 57 |
+
{"seed": 65, "en": {"accuracy": 0.8695, "f1": 0.8658097686375321}, "fr": {"accuracy": 0.784, "f1": 0.7886497064579256}, "de": {"accuracy": 0.7495, "f1": 0.7583212735166426}, "zh": {"accuracy": 0.6915, "f1": 0.6982885085574572}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8608333333333333, "f1": 0.8720959918304825}, "dna_sim_pair_150bp": {"accuracy": 0.7205, "f1": 0.7071765322158198}, "dna_sim_pair_50bp": {"accuracy": 0.572, "f1": 0.672782874617737}, "protein_sim_pair_150bp": {"accuracy": 0.8488888888888889, "f1": 0.8667972575905974}, "protein_sim_pair_450bp": {"accuracy": 0.8194444444444444, "f1": 0.8369292523833417}, "dna_protein_pair": {"accuracy": 0.4525, "f1": 0.2912621359223301}, "dna_protein_pair_100": {"accuracy": 0.4975, "f1": 0.4401114206128134}, "dna_protein_pair_full": {"accuracy": 0.4275, "f1": 0.5888689407540395}, "dna_protein_pair_rand": {"accuracy": 0.5175, "f1": 0.3723577235772358}, "dna_protein_pair_rand_100": {"accuracy": 0.47875, "f1": 0.39124087591240875}, "dna_protein_pair_rand_full": {"accuracy": 0.443125, "f1": 0.57225156024964}}
|
| 58 |
+
{"seed": 70, "en": {"accuracy": 0.8565, "f1": 0.8507540301612064}, "fr": {"accuracy": 0.7905, "f1": 0.7951100244498778}, "de": {"accuracy": 0.7395, "f1": 0.7486734201640135}, "zh": {"accuracy": 0.6855, "f1": 0.70648623425105}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9052777777777777, "f1": 0.9097644879597777}, "dna_sim_pair_150bp": {"accuracy": 0.8715, "f1": 0.8703983862834089}, "dna_sim_pair_50bp": {"accuracy": 0.6345, "f1": 0.716116504854369}, "protein_sim_pair_150bp": {"accuracy": 0.9583333333333334, "f1": 0.9593054801953337}, "protein_sim_pair_450bp": {"accuracy": 0.8833333333333333, "f1": 0.8939393939393939}, "dna_protein_pair": {"accuracy": 0.5, "f1": 0.0196078431372549}, "dna_protein_pair_100": {"accuracy": 0.4525, "f1": 0.05194805194805195}, "dna_protein_pair_full": {"accuracy": 0.3575, "f1": 0.3558897243107769}, "dna_protein_pair_rand": {"accuracy": 0.5, "f1": 0.06103286384976526}, "dna_protein_pair_rand_100": {"accuracy": 0.50125, "f1": 0.052256532066508314}, "dna_protein_pair_rand_full": {"accuracy": 0.481875, "f1": 0.3988397389412618}}
|
| 59 |
+
{"seed": 71, "en": {"accuracy": 0.8805, "f1": 0.8745406824146982}, "fr": {"accuracy": 0.791, "f1": 0.7986512524084779}, "de": {"accuracy": 0.7455, "f1": 0.7544621321755909}, "zh": {"accuracy": 0.693, "f1": 0.7056567593480345}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8836111111111111, "f1": 0.8835140394773422}, "dna_sim_pair_150bp": {"accuracy": 0.7385, "f1": 0.691627358490566}, "dna_sim_pair_50bp": {"accuracy": 0.5345, "f1": 0.6803982148987299}, "protein_sim_pair_150bp": {"accuracy": 0.84, "f1": 0.8526100307062436}, "protein_sim_pair_450bp": {"accuracy": 0.8827777777777778, "f1": 0.8837465564738292}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.15510204081632653}, "dna_protein_pair_100": {"accuracy": 0.5125, "f1": 0.04878048780487805}, "dna_protein_pair_full": {"accuracy": 0.525, "f1": 0.15178571428571427}, "dna_protein_pair_rand": {"accuracy": 0.515, "f1": 0.16379310344827586}, "dna_protein_pair_rand_100": {"accuracy": 0.508125, "f1": 0.05748502994011976}, "dna_protein_pair_rand_full": {"accuracy": 0.495625, "f1": 0.23796033994334279}}
|
| 60 |
+
{"seed": 72, "en": {"accuracy": 0.8655, "f1": 0.859968766267569}, "fr": {"accuracy": 0.7675, "f1": 0.7797252486972999}, "de": {"accuracy": 0.746, "f1": 0.7502458210422812}, "zh": {"accuracy": 0.6945, "f1": 0.6982716049382716}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8830555555555556, "f1": 0.8906209405040271}, "dna_sim_pair_150bp": {"accuracy": 0.73675, "f1": 0.7142469470827679}, "dna_sim_pair_50bp": {"accuracy": 0.548, "f1": 0.6814658210007047}, "protein_sim_pair_150bp": {"accuracy": 0.7616666666666667, "f1": 0.8054421768707483}, "protein_sim_pair_450bp": {"accuracy": 0.8461111111111111, "f1": 0.8607340372046255}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.32974910394265233}, "dna_protein_pair_100": {"accuracy": 0.5, "f1": 0.2857142857142857}, "dna_protein_pair_full": {"accuracy": 0.4125, "f1": 0.5607476635514018}, "dna_protein_pair_rand": {"accuracy": 0.55, "f1": 0.40298507462686567}, "dna_protein_pair_rand_100": {"accuracy": 0.501875, "f1": 0.25583566760037346}, "dna_protein_pair_rand_full": {"accuracy": 0.48875, "f1": 0.5942460317460317}}
|
| 61 |
+
{"seed": 74, "en": {"accuracy": 0.877, "f1": 0.869287991498406}, "fr": {"accuracy": 0.782, "f1": 0.7903846153846154}, "de": {"accuracy": 0.7595, "f1": 0.7608155146693187}, "zh": {"accuracy": 0.6975, "f1": 0.7128618889416232}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9369444444444445, "f1": 0.9369969469886206}, "dna_sim_pair_150bp": {"accuracy": 0.80925, "f1": 0.7794160161896502}, "dna_sim_pair_50bp": {"accuracy": 0.7695, "f1": 0.7709885742672627}, "protein_sim_pair_150bp": {"accuracy": 0.9572222222222222, "f1": 0.9574820541137493}, "protein_sim_pair_450bp": {"accuracy": 0.9544444444444444, "f1": 0.9542920847268673}, "dna_protein_pair": {"accuracy": 0.4875, "f1": 0.019138755980861243}, "dna_protein_pair_100": {"accuracy": 0.5275, "f1": 0.07804878048780488}, "dna_protein_pair_full": {"accuracy": 0.3375, "f1": 0.19939577039274925}, "dna_protein_pair_rand": {"accuracy": 0.506875, "f1": 0.04825090470446321}, "dna_protein_pair_rand_100": {"accuracy": 0.478125, "f1": 0.043528064146620846}, "dna_protein_pair_rand_full": {"accuracy": 0.505, "f1": 0.1885245901639344}}
|
| 62 |
+
{"seed": 75, "en": {"accuracy": 0.875, "f1": 0.8674443266171792}, "fr": {"accuracy": 0.809, "f1": 0.8006263048016702}, "de": {"accuracy": 0.786, "f1": 0.7780082987551867}, "zh": {"accuracy": 0.719, "f1": 0.7054507337526206}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9375, "f1": 0.9343832020997376}, "dna_sim_pair_150bp": {"accuracy": 0.714, "f1": 0.6030534351145038}, "dna_sim_pair_50bp": {"accuracy": 0.679, "f1": 0.5776315789473684}, "protein_sim_pair_150bp": {"accuracy": 0.9161111111111111, "f1": 0.91101944608132}, "protein_sim_pair_450bp": {"accuracy": 0.78, "f1": 0.7117903930131004}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.5125, "f1": 0.0025575447570332483}, "dna_protein_pair_rand_100": {"accuracy": 0.50375, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.48875, "f1": 0.0}}
|
| 63 |
+
{"seed": 78, "en": {"accuracy": 0.873, "f1": 0.8678459937565036}, "fr": {"accuracy": 0.7815, "f1": 0.7865168539325843}, "de": {"accuracy": 0.761, "f1": 0.7663734115347018}, "zh": {"accuracy": 0.6985, "f1": 0.6962216624685138}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9330555555555555, "f1": 0.9337365960956833}, "dna_sim_pair_150bp": {"accuracy": 0.79225, "f1": 0.7590605972745723}, "dna_sim_pair_50bp": {"accuracy": 0.7325, "f1": 0.7722435078756917}, "protein_sim_pair_150bp": {"accuracy": 0.9322222222222222, "f1": 0.936656282450675}, "protein_sim_pair_450bp": {"accuracy": 0.8888888888888888, "f1": 0.8932764140875133}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.19047619047619047}, "dna_protein_pair_100": {"accuracy": 0.5225, "f1": 0.3696369636963696}, "dna_protein_pair_full": {"accuracy": 0.555, "f1": 0.22608695652173913}, "dna_protein_pair_rand": {"accuracy": 0.54, "f1": 0.28957528957528955}, "dna_protein_pair_rand_100": {"accuracy": 0.5225, "f1": 0.37886178861788616}, "dna_protein_pair_rand_full": {"accuracy": 0.573125, "f1": 0.32841691248770893}}
|
| 64 |
+
{"seed": 80, "en": {"accuracy": 0.8745, "f1": 0.8692027097446586}, "fr": {"accuracy": 0.779, "f1": 0.790521327014218}, "de": {"accuracy": 0.7435, "f1": 0.7597189695550352}, "zh": {"accuracy": 0.6935, "f1": 0.7131492746841367}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9038888888888889, "f1": 0.911327524346489}, "dna_sim_pair_150bp": {"accuracy": 0.80425, "f1": 0.796887159533074}, "dna_sim_pair_50bp": {"accuracy": 0.518, "f1": 0.6612789880534083}, "protein_sim_pair_150bp": {"accuracy": 0.925, "f1": 0.9280767181672882}, "protein_sim_pair_450bp": {"accuracy": 0.9211111111111111, "f1": 0.925026399155227}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.1}, "dna_protein_pair_100": {"accuracy": 0.5125, "f1": 0.029850746268656716}, "dna_protein_pair_full": {"accuracy": 0.445, "f1": 0.034782608695652174}, "dna_protein_pair_rand": {"accuracy": 0.53, "f1": 0.12761020881670534}, "dna_protein_pair_rand_100": {"accuracy": 0.5125, "f1": 0.060240963855421686}, "dna_protein_pair_rand_full": {"accuracy": 0.52, "f1": 0.13122171945701358}}
|
| 65 |
+
{"seed": 82, "en": {"accuracy": 0.8885, "f1": 0.8778082191780822}, "fr": {"accuracy": 0.801, "f1": 0.7903055848261328}, "de": {"accuracy": 0.781, "f1": 0.7632432432432432}, "zh": {"accuracy": 0.704, "f1": 0.6740088105726872}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9244444444444444, "f1": 0.9238095238095239}, "dna_sim_pair_150bp": {"accuracy": 0.74225, "f1": 0.6752755905511811}, "dna_sim_pair_50bp": {"accuracy": 0.8045, "f1": 0.791243993593166}, "protein_sim_pair_150bp": {"accuracy": 0.91, "f1": 0.9111842105263158}, "protein_sim_pair_450bp": {"accuracy": 0.7411111111111112, "f1": 0.6732117812061711}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.18823529411764706}, "dna_protein_pair_100": {"accuracy": 0.5025, "f1": 0.019704433497536946}, "dna_protein_pair_full": {"accuracy": 0.4725, "f1": 0.04524886877828054}, "dna_protein_pair_rand": {"accuracy": 0.506875, "f1": 0.207035175879397}, "dna_protein_pair_rand_100": {"accuracy": 0.496875, "f1": 0.026602176541717048}, "dna_protein_pair_rand_full": {"accuracy": 0.503125, "f1": 0.10573678290213723}}
|
| 66 |
+
{"seed": 84, "en": {"accuracy": 0.877, "f1": 0.8625698324022346}, "fr": {"accuracy": 0.8055, "f1": 0.7949393779652082}, "de": {"accuracy": 0.7695, "f1": 0.7473972602739726}, "zh": {"accuracy": 0.7275, "f1": 0.6980609418282548}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9108333333333334, "f1": 0.906875543951262}, "dna_sim_pair_150bp": {"accuracy": 0.7395, "f1": 0.6731493099121706}, "dna_sim_pair_50bp": {"accuracy": 0.6585, "f1": 0.6499231163505894}, "protein_sim_pair_150bp": {"accuracy": 0.9388888888888889, "f1": 0.936046511627907}, "protein_sim_pair_450bp": {"accuracy": 0.8927777777777778, "f1": 0.8786926461345066}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.48, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.009708737864077669}, "dna_protein_pair_rand": {"accuracy": 0.48875, "f1": 0.0024390243902439024}, "dna_protein_pair_rand_100": {"accuracy": 0.475, "f1": 0.0023752969121140144}, "dna_protein_pair_rand_full": {"accuracy": 0.504375, "f1": 0.0457280385078219}}
|
| 67 |
+
{"seed": 85, "en": {"accuracy": 0.873, "f1": 0.8641711229946524}, "fr": {"accuracy": 0.787, "f1": 0.7901477832512315}, "de": {"accuracy": 0.7615, "f1": 0.7587253414264037}, "zh": {"accuracy": 0.718, "f1": 0.7113613101330604}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9155555555555556, "f1": 0.9143661971830986}, "dna_sim_pair_150bp": {"accuracy": 0.742, "f1": 0.6957547169811321}, "dna_sim_pair_50bp": {"accuracy": 0.584, "f1": 0.6797536566589685}, "protein_sim_pair_150bp": {"accuracy": 0.9544444444444444, "f1": 0.9522144522144522}, "protein_sim_pair_450bp": {"accuracy": 0.9683333333333334, "f1": 0.9693383539537386}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.02}, "dna_protein_pair_100": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.10091743119266056}, "dna_protein_pair_rand": {"accuracy": 0.498125, "f1": 0.02902055622732769}, "dna_protein_pair_rand_100": {"accuracy": 0.513125, "f1": 0.015170670037926675}, "dna_protein_pair_rand_full": {"accuracy": 0.48875, "f1": 0.06407322654462243}}
|
| 68 |
+
{"seed": 86, "en": {"accuracy": 0.893, "f1": 0.8830601092896175}, "fr": {"accuracy": 0.816, "f1": 0.811088295687885}, "de": {"accuracy": 0.78, "f1": 0.7676874340021119}, "zh": {"accuracy": 0.7075, "f1": 0.7147732813261823}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9316666666666666, "f1": 0.9290657439446367}, "dna_sim_pair_150bp": {"accuracy": 0.7735, "f1": 0.7175810473815462}, "dna_sim_pair_50bp": {"accuracy": 0.663, "f1": 0.5818858560794045}, "protein_sim_pair_150bp": {"accuracy": 0.9588888888888889, "f1": 0.9593852908891328}, "protein_sim_pair_450bp": {"accuracy": 0.9661111111111111, "f1": 0.9651627641347801}, "dna_protein_pair": {"accuracy": 0.4875, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4375, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.495625, "f1": 0.014652014652014652}, "dna_protein_pair_rand_100": {"accuracy": 0.5075, "f1": 0.012531328320802004}, "dna_protein_pair_rand_full": {"accuracy": 0.490625, "f1": 0.033214709371293}}
|
| 69 |
+
{"seed": 87, "en": {"accuracy": 0.875, "f1": 0.8626373626373627}, "fr": {"accuracy": 0.7955, "f1": 0.785751702462022}, "de": {"accuracy": 0.769, "f1": 0.7494577006507592}, "zh": {"accuracy": 0.7205, "f1": 0.7009095773140717}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8622222222222222, "f1": 0.8702250130821559}, "dna_sim_pair_150bp": {"accuracy": 0.6625, "f1": 0.6184284906726965}, "dna_sim_pair_50bp": {"accuracy": 0.477, "f1": 0.6168498168498169}, "protein_sim_pair_150bp": {"accuracy": 0.91, "f1": 0.9073226544622426}, "protein_sim_pair_450bp": {"accuracy": 0.9061111111111111, "f1": 0.8989838613269575}, "dna_protein_pair": {"accuracy": 0.5025, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.5075, "f1": 0.010050251256281407}, "dna_protein_pair_full": {"accuracy": 0.5275, "f1": 0.05025125628140704}, "dna_protein_pair_rand": {"accuracy": 0.5175, "f1": 0.02278481012658228}, "dna_protein_pair_rand_100": {"accuracy": 0.525625, "f1": 0.002628120893561104}, "dna_protein_pair_rand_full": {"accuracy": 0.533125, "f1": 0.16722408026755853}}
|
| 70 |
+
{"seed": 88, "en": {"accuracy": 0.8645, "f1": 0.8571428571428571}, "fr": {"accuracy": 0.7735, "f1": 0.7814761215629522}, "de": {"accuracy": 0.7525, "f1": 0.7619047619047619}, "zh": {"accuracy": 0.7115, "f1": 0.7153428712382832}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8080555555555555, "f1": 0.8328899637243047}, "dna_sim_pair_150bp": {"accuracy": 0.6895, "f1": 0.6937869822485208}, "dna_sim_pair_50bp": {"accuracy": 0.455, "f1": 0.6164672765657987}, "protein_sim_pair_150bp": {"accuracy": 0.9144444444444444, "f1": 0.9182590233545648}, "protein_sim_pair_450bp": {"accuracy": 0.9305555555555556, "f1": 0.9279538904899135}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.30996309963099633}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.04854368932038835}, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.038834951456310676}, "dna_protein_pair_rand": {"accuracy": 0.531875, "f1": 0.30840258541089566}, "dna_protein_pair_rand_100": {"accuracy": 0.495625, "f1": 0.026537997587454766}, "dna_protein_pair_rand_full": {"accuracy": 0.4875, "f1": 0.07029478458049887}}
|
| 71 |
+
{"seed": 89, "en": {"accuracy": 0.894, "f1": 0.887592788971368}, "fr": {"accuracy": 0.8105, "f1": 0.8130241736556487}, "de": {"accuracy": 0.768, "f1": 0.7705242334322453}, "zh": {"accuracy": 0.707, "f1": 0.7081673306772909}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9283333333333333, "f1": 0.9263278126784694}, "dna_sim_pair_150bp": {"accuracy": 0.818, "f1": 0.7875072971395213}, "dna_sim_pair_50bp": {"accuracy": 0.6355, "f1": 0.6826295167609926}, "protein_sim_pair_150bp": {"accuracy": 0.9477777777777778, "f1": 0.9482948294829483}, "protein_sim_pair_450bp": {"accuracy": 0.9522222222222222, "f1": 0.9523281596452328}, "dna_protein_pair": {"accuracy": 0.5375, "f1": 0.0106951871657754}, "dna_protein_pair_100": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.026200873362445413}, "dna_protein_pair_rand": {"accuracy": 0.498125, "f1": 0.02902055622732769}, "dna_protein_pair_rand_100": {"accuracy": 0.5025, "f1": 0.01240694789081886}, "dna_protein_pair_rand_full": {"accuracy": 0.51125, "f1": 0.0645933014354067}}
|
| 72 |
+
{"seed": 90, "en": {"accuracy": 0.862, "f1": 0.8517722878625135}, "fr": {"accuracy": 0.7765, "f1": 0.7788223651657595}, "de": {"accuracy": 0.737, "f1": 0.7429130009775171}, "zh": {"accuracy": 0.707, "f1": 0.7101879327398615}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8041666666666667, "f1": 0.8267387564512165}, "dna_sim_pair_150bp": {"accuracy": 0.6845, "f1": 0.6996668253212756}, "dna_sim_pair_50bp": {"accuracy": 0.493, "f1": 0.656271186440678}, "protein_sim_pair_150bp": {"accuracy": 0.8527777777777777, "f1": 0.8654139156932453}, "protein_sim_pair_450bp": {"accuracy": 0.945, "f1": 0.9473124002128792}, "dna_protein_pair": {"accuracy": 0.54, "f1": 0.21367521367521367}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.00966183574879227}, "dna_protein_pair_full": {"accuracy": 0.3525, "f1": 0.4746450304259635}, "dna_protein_pair_rand": {"accuracy": 0.580625, "f1": 0.42204995693367786}, "dna_protein_pair_rand_100": {"accuracy": 0.51, "f1": 0.022443890274314215}, "dna_protein_pair_rand_full": {"accuracy": 0.459375, "f1": 0.5361930294906166}}
|
finetune/gpt2_gene_multiv1_ft_en_test_others.py
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
|
| 3 |
+
# # 设置环境变量
|
| 4 |
+
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
| 5 |
+
|
| 6 |
+
# # 打印环境变量以确认设置成功
|
| 7 |
+
# print(os.environ.get('HF_ENDPOINT'))
|
| 8 |
+
|
| 9 |
+
# import subprocess
|
| 10 |
+
# import os
|
| 11 |
+
|
| 12 |
+
# result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 13 |
+
# output = result.stdout
|
| 14 |
+
# for line in output.splitlines():
|
| 15 |
+
# if '=' in line:
|
| 16 |
+
# var, value = line.split('=', 1)
|
| 17 |
+
# os.environ[var] = value
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
from datasets import load_dataset
|
| 21 |
+
from transformers import AutoTokenizer, DataCollatorWithPadding
|
| 22 |
+
from transformers import Trainer
|
| 23 |
+
import evaluate
|
| 24 |
+
import numpy as np
|
| 25 |
+
from transformers import TrainingArguments
|
| 26 |
+
from transformers import AutoModelForSequenceClassification
|
| 27 |
+
import json
|
| 28 |
+
from transformers import set_seed
|
| 29 |
+
import random
|
| 30 |
+
import numpy as np
|
| 31 |
+
import torch
|
| 32 |
+
|
| 33 |
+
# seed = 42
|
| 34 |
+
# random.seed(seed)
|
| 35 |
+
# np.random.seed(seed)
|
| 36 |
+
# torch.manual_seed(seed)
|
| 37 |
+
# torch.cuda.manual_seed_all(seed)
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
# 动态生成随机种子
|
| 41 |
+
import random
|
| 42 |
+
seed = random.randint(0, 10000)
|
| 43 |
+
#print(f"Generated seed: {seed}")
|
| 44 |
+
set_seed(seed)
|
| 45 |
+
result = {}
|
| 46 |
+
result["seed"] = seed
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象
|
| 51 |
+
raw_datasets = load_dataset('google-research-datasets/paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 52 |
+
|
| 53 |
+
#分词器
|
| 54 |
+
tokenizer = AutoTokenizer.from_pretrained("dnagpt/gpt2_gene_multi_v1")
|
| 55 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 56 |
+
|
| 57 |
+
# 修改分词器的填充方向为左侧,默认有右侧,分类问题建议左侧
|
| 58 |
+
#tokenizer.padding_side = "left"
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
#分词函数
|
| 62 |
+
def tokenize_function(example):
|
| 63 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256)
|
| 64 |
+
return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256, padding="max_length")
|
| 65 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=1024) #padding="max_length")
|
| 66 |
+
|
| 67 |
+
#构建分词后的数据集
|
| 68 |
+
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
|
| 69 |
+
|
| 70 |
+
#训练数据构建
|
| 71 |
+
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
#指标函数定义
|
| 75 |
+
def compute_metrics(eval_pred):
|
| 76 |
+
predictions, labels = eval_pred
|
| 77 |
+
predictions = np.argmax(predictions, axis=1)
|
| 78 |
+
return {'accuracy': (predictions==labels).sum() / len(labels)}
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
training_args = TrainingArguments(
|
| 83 |
+
output_dir="ds_job_dna_2222",
|
| 84 |
+
learning_rate=1e-5,
|
| 85 |
+
lr_scheduler_type="constant_with_warmup",
|
| 86 |
+
warmup_ratio=0.1,
|
| 87 |
+
optim='adamw_torch',
|
| 88 |
+
weight_decay=0.0,
|
| 89 |
+
seed=seed, # 使用动态生成的随机种子
|
| 90 |
+
per_device_train_batch_size=20,
|
| 91 |
+
per_device_eval_batch_size=20,
|
| 92 |
+
num_train_epochs=4, #训练多少轮
|
| 93 |
+
evaluation_strategy="epoch",
|
| 94 |
+
save_strategy="epoch",
|
| 95 |
+
logging_strategy="epoch",
|
| 96 |
+
load_best_model_at_end=True
|
| 97 |
+
)
|
| 98 |
+
|
| 99 |
+
#模型定义,文本分类模型
|
| 100 |
+
model = AutoModelForSequenceClassification.from_pretrained("dnagpt/gpt2_gene_multi_v1", num_labels=2)
|
| 101 |
+
model.config.pad_token_id = model.config.eos_token_id
|
| 102 |
+
|
| 103 |
+
trainer = Trainer(
|
| 104 |
+
model,
|
| 105 |
+
training_args,
|
| 106 |
+
train_dataset=tokenized_datasets["train"],
|
| 107 |
+
eval_dataset=tokenized_datasets["validation"],
|
| 108 |
+
data_collator=data_collator,
|
| 109 |
+
tokenizer=tokenizer,
|
| 110 |
+
compute_metrics=compute_metrics,
|
| 111 |
+
)
|
| 112 |
+
|
| 113 |
+
trainer.train() #模型训练
|
| 114 |
+
|
| 115 |
+
#模型测试,英文数据集
|
| 116 |
+
predictions = trainer.predict(tokenized_datasets["test"])
|
| 117 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 118 |
+
metric = evaluate.load("glue", "mrpc")
|
| 119 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 120 |
+
result["en"] = ret
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
#模型测试,法文数据集
|
| 124 |
+
raw_datasets_fr = load_dataset('paws-x', 'fr') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 125 |
+
tokenized_datasets_fr = raw_datasets_fr.map(tokenize_function, batched=True)
|
| 126 |
+
|
| 127 |
+
predictions = trainer.predict(tokenized_datasets_fr["test"])
|
| 128 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 129 |
+
metric = evaluate.load("glue", "mrpc")
|
| 130 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 131 |
+
result["fr"] = ret
|
| 132 |
+
|
| 133 |
+
#模型测试,德文数据集
|
| 134 |
+
raw_datasets_de = load_dataset('google-research-datasets/paws-x', 'de') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 135 |
+
tokenized_datasets_de = raw_datasets_de.map(tokenize_function, batched=True)
|
| 136 |
+
predictions = trainer.predict(tokenized_datasets_de["test"])
|
| 137 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 138 |
+
metric = evaluate.load("glue", "mrpc")
|
| 139 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 140 |
+
result["de"] = ret
|
| 141 |
+
|
| 142 |
+
#模型测试,中文数据集
|
| 143 |
+
raw_datasets_zh = load_dataset('google-research-datasets/paws-x', 'zh') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 144 |
+
tokenized_datasets_zh = raw_datasets_zh.map(tokenize_function, batched=True)
|
| 145 |
+
|
| 146 |
+
predictions = trainer.predict(tokenized_datasets_zh["test"])
|
| 147 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 148 |
+
metric = evaluate.load("glue", "mrpc")
|
| 149 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 150 |
+
result["zh"] = ret
|
| 151 |
+
|
| 152 |
+
#模型测试 dna数据集,150 bp长度 简单版本
|
| 153 |
+
raw_datasets_dna =load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_simple_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 154 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 155 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 156 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 157 |
+
metric = evaluate.load("glue", "mrpc")
|
| 158 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 159 |
+
result["dna_sim_pair_simple_150bp"] = ret
|
| 160 |
+
|
| 161 |
+
#模型测试 dna数据集,150长度,复杂版本 不相似
|
| 162 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 163 |
+
tokenized_datasets_dna= raw_datasets_dna.map(tokenize_function, batched=True)
|
| 164 |
+
|
| 165 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 166 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 167 |
+
metric = evaluate.load("glue", "mrpc")
|
| 168 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 169 |
+
result["dna_sim_pair_150bp"] = ret
|
| 170 |
+
|
| 171 |
+
#模型测试 dna数据集,50长度,复杂版本 不相似
|
| 172 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_50bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 173 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 174 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 175 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 176 |
+
metric = evaluate.load("glue", "mrpc")
|
| 177 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 178 |
+
result["dna_sim_pair_50bp"] = ret
|
| 179 |
+
|
| 180 |
+
#模型测试 蛋白质数据集,50长度/150bp,复杂版本 不相似
|
| 181 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_150bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 182 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 183 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 184 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 185 |
+
metric = evaluate.load("glue", "mrpc")
|
| 186 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 187 |
+
result["protein_sim_pair_150bp"] = ret
|
| 188 |
+
|
| 189 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 190 |
+
|
| 191 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_450bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 192 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 193 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 194 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 195 |
+
metric = evaluate.load("glue", "mrpc")
|
| 196 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 197 |
+
result["protein_sim_pair_450bp"] = ret
|
| 198 |
+
|
| 199 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 200 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 201 |
+
|
| 202 |
+
# 定义翻转标签的函数
|
| 203 |
+
def flip_labels(example):
|
| 204 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 205 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 206 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 207 |
+
example['label'] = 1 - example['label']
|
| 208 |
+
return example
|
| 209 |
+
|
| 210 |
+
# 应用翻转标签函数
|
| 211 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 212 |
+
|
| 213 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 214 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 215 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 216 |
+
metric = evaluate.load("glue", "mrpc")
|
| 217 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 218 |
+
result["dna_protein_pair"] = ret
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 222 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 223 |
+
|
| 224 |
+
# 定义翻转标签的函数
|
| 225 |
+
def flip_labels(example):
|
| 226 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 227 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 228 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 229 |
+
example['label'] = 1 - example['label']
|
| 230 |
+
return example
|
| 231 |
+
|
| 232 |
+
# 应用翻转标签函数
|
| 233 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 234 |
+
|
| 235 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 236 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 237 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 238 |
+
metric = evaluate.load("glue", "mrpc")
|
| 239 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 240 |
+
result["dna_protein_pair_100"] = ret
|
| 241 |
+
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 248 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 249 |
+
|
| 250 |
+
# 定义翻转标签的函数
|
| 251 |
+
def flip_labels(example):
|
| 252 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 253 |
+
example["sentence1"] = example["sentence1"]
|
| 254 |
+
example["sentence2"] = example["sentence2"]
|
| 255 |
+
example['label'] = 1 - example['label']
|
| 256 |
+
return example
|
| 257 |
+
|
| 258 |
+
# 应用翻转标签函数
|
| 259 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 260 |
+
|
| 261 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 262 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 263 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 264 |
+
metric = evaluate.load("glue", "mrpc")
|
| 265 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 266 |
+
result["dna_protein_pair_full"] = ret
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
#模型测试 蛋白质数据集,随机版本
|
| 273 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 274 |
+
|
| 275 |
+
# 定义翻转标签的函数
|
| 276 |
+
def flip_labels(example):
|
| 277 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 278 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 279 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 280 |
+
example['label'] = 1 - example['label']
|
| 281 |
+
return example
|
| 282 |
+
|
| 283 |
+
# 应用翻转标签函数
|
| 284 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 285 |
+
|
| 286 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 287 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 288 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 289 |
+
metric = evaluate.load("glue", "mrpc")
|
| 290 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 291 |
+
result["dna_protein_pair_rand"] = ret
|
| 292 |
+
|
| 293 |
+
|
| 294 |
+
#模型测试 蛋白质数据集,随机版本
|
| 295 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 296 |
+
|
| 297 |
+
# 定义翻转标签的函数
|
| 298 |
+
def flip_labels(example):
|
| 299 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 300 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 301 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 302 |
+
example['label'] = 1 - example['label']
|
| 303 |
+
return example
|
| 304 |
+
|
| 305 |
+
# 应用翻转标签函数
|
| 306 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 307 |
+
|
| 308 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 309 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 310 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 311 |
+
metric = evaluate.load("glue", "mrpc")
|
| 312 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 313 |
+
result["dna_protein_pair_rand_100"] = ret
|
| 314 |
+
|
| 315 |
+
|
| 316 |
+
|
| 317 |
+
|
| 318 |
+
#模型测试 蛋白质数据集,随机版本
|
| 319 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 320 |
+
|
| 321 |
+
# 定义翻转标签的函数
|
| 322 |
+
def flip_labels(example):
|
| 323 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 324 |
+
example["sentence1"] = example["sentence1"]
|
| 325 |
+
example["sentence2"] = example["sentence2"]
|
| 326 |
+
example['label'] = 1 - example['label']
|
| 327 |
+
return example
|
| 328 |
+
|
| 329 |
+
# 应用翻转标签函数
|
| 330 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 331 |
+
|
| 332 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 333 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 334 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 335 |
+
metric = evaluate.load("glue", "mrpc")
|
| 336 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 337 |
+
result["dna_protein_pair_rand_full"] = ret
|
| 338 |
+
|
| 339 |
+
|
| 340 |
+
|
| 341 |
+
print(json.dumps(result))
|
| 342 |
+
|
finetune/gpt2_gene_multiv1_ft_en_test_others2.py
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
|
| 3 |
+
# # 设置环境变量
|
| 4 |
+
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
| 5 |
+
|
| 6 |
+
# # 打印环境变量以确认设置成功
|
| 7 |
+
# print(os.environ.get('HF_ENDPOINT'))
|
| 8 |
+
|
| 9 |
+
# import subprocess
|
| 10 |
+
# import os
|
| 11 |
+
|
| 12 |
+
# result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 13 |
+
# output = result.stdout
|
| 14 |
+
# for line in output.splitlines():
|
| 15 |
+
# if '=' in line:
|
| 16 |
+
# var, value = line.split('=', 1)
|
| 17 |
+
# os.environ[var] = value
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
from datasets import load_dataset
|
| 21 |
+
from transformers import AutoTokenizer, DataCollatorWithPadding
|
| 22 |
+
from transformers import Trainer
|
| 23 |
+
import evaluate
|
| 24 |
+
import numpy as np
|
| 25 |
+
from transformers import TrainingArguments
|
| 26 |
+
from transformers import AutoModelForSequenceClassification
|
| 27 |
+
import json
|
| 28 |
+
from transformers import set_seed
|
| 29 |
+
import random
|
| 30 |
+
import numpy as np
|
| 31 |
+
import torch
|
| 32 |
+
from tqdm import tqdm
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
# seed = 42
|
| 36 |
+
# random.seed(seed)
|
| 37 |
+
# np.random.seed(seed)
|
| 38 |
+
# torch.manual_seed(seed)
|
| 39 |
+
# torch.cuda.manual_seed_all(seed)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
# 动态生成随机种子
|
| 43 |
+
import random
|
| 44 |
+
seed = random.randint(0, 10000)
|
| 45 |
+
#print(f"Generated seed: {seed}")
|
| 46 |
+
set_seed(seed)
|
| 47 |
+
result = {}
|
| 48 |
+
result["seed"] = seed
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象
|
| 53 |
+
raw_datasets = load_dataset('paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 54 |
+
|
| 55 |
+
#分词器
|
| 56 |
+
tokenizer = AutoTokenizer.from_pretrained("dnagpt/gpt2_gene_multi_v1")
|
| 57 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
#分词函数
|
| 61 |
+
def tokenize_function(example):
|
| 62 |
+
return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256, padding="max_length")
|
| 63 |
+
|
| 64 |
+
#构建分词后的数据集
|
| 65 |
+
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
|
| 66 |
+
|
| 67 |
+
#训练数据构建
|
| 68 |
+
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
#指标函数定义
|
| 72 |
+
def compute_metrics(eval_pred):
|
| 73 |
+
predictions, labels = eval_pred
|
| 74 |
+
predictions = np.argmax(predictions, axis=1)
|
| 75 |
+
return {'accuracy': (predictions==labels).sum() / len(labels)}
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
training_args = TrainingArguments(
|
| 80 |
+
output_dir="ds_job_dna_2222",
|
| 81 |
+
learning_rate=1e-5,
|
| 82 |
+
lr_scheduler_type="constant_with_warmup",
|
| 83 |
+
warmup_ratio=0.1,
|
| 84 |
+
optim='adamw_torch',
|
| 85 |
+
weight_decay=0.0,
|
| 86 |
+
seed=seed, # 使用动态生成的随机种子
|
| 87 |
+
per_device_train_batch_size=64,
|
| 88 |
+
per_device_eval_batch_size=64,
|
| 89 |
+
num_train_epochs=4, #训练多少轮
|
| 90 |
+
evaluation_strategy="epoch",
|
| 91 |
+
save_strategy="epoch",
|
| 92 |
+
logging_strategy="epoch",
|
| 93 |
+
load_best_model_at_end=True
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
#模型定义,文本分类模型
|
| 97 |
+
model = AutoModelForSequenceClassification.from_pretrained("dnagpt/gpt2_gene_multi_v1", num_labels=2)
|
| 98 |
+
model.config.pad_token_id = model.config.eos_token_id
|
| 99 |
+
|
| 100 |
+
trainer = Trainer(
|
| 101 |
+
model,
|
| 102 |
+
training_args,
|
| 103 |
+
train_dataset=tokenized_datasets["train"],
|
| 104 |
+
eval_dataset=tokenized_datasets["validation"],
|
| 105 |
+
data_collator=data_collator,
|
| 106 |
+
tokenizer=tokenizer,
|
| 107 |
+
compute_metrics=compute_metrics,
|
| 108 |
+
)
|
| 109 |
+
|
| 110 |
+
trainer.train() #模型训练
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 116 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 117 |
+
|
| 118 |
+
# 定义翻转标签的函数
|
| 119 |
+
def flip_labels(example):
|
| 120 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 121 |
+
example["sentence1"] = example["sentence1"]
|
| 122 |
+
example["sentence2"] = example["sentence2"]
|
| 123 |
+
example['label'] = 1 - example['label']
|
| 124 |
+
return example
|
| 125 |
+
|
| 126 |
+
# 应用翻转标签函数
|
| 127 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 128 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
# 确保模型在 GPU 上
|
| 133 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 134 |
+
model.to(device)
|
| 135 |
+
model.eval() # 进入推理模式,加速推理
|
| 136 |
+
|
| 137 |
+
# 取出测试集数据
|
| 138 |
+
test_dataset = tokenized_datasets_dna_protein["test"]
|
| 139 |
+
|
| 140 |
+
# 预存预测结果
|
| 141 |
+
preds = []
|
| 142 |
+
labels = []
|
| 143 |
+
|
| 144 |
+
# 批量大小(建议 64、128、256 视显存大小调整)
|
| 145 |
+
batch_size = 64
|
| 146 |
+
|
| 147 |
+
# 直接遍历数据集进行推理
|
| 148 |
+
for i in tqdm(range(0, len(test_dataset), batch_size), desc="Predicting"):
|
| 149 |
+
batch = test_dataset[i : i + batch_size]
|
| 150 |
+
|
| 151 |
+
# 转换为 Tensor 并移动到 GPU
|
| 152 |
+
inputs = {
|
| 153 |
+
"input_ids": torch.tensor(batch["input_ids"]).to(device),
|
| 154 |
+
"attention_mask": torch.tensor(batch["attention_mask"]).to(device),
|
| 155 |
+
}
|
| 156 |
+
batch_labels = batch["label"] # 原始标签
|
| 157 |
+
|
| 158 |
+
with torch.no_grad(): # 关闭梯度计算,减少内存占用
|
| 159 |
+
outputs = model(**inputs)
|
| 160 |
+
batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别
|
| 161 |
+
|
| 162 |
+
preds.extend(batch_preds)
|
| 163 |
+
labels.extend(batch_labels)
|
| 164 |
+
|
| 165 |
+
metric = evaluate.load("glue", "mrpc")
|
| 166 |
+
ret = metric.compute(predictions=preds, references=labels)
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
result["dna_protein_pair_full"] = ret
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
#############################################################
|
| 175 |
+
#模型测试 蛋白质数据集,随机版本
|
| 176 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle
|
| 177 |
+
|
| 178 |
+
# 定义翻转标签的函数
|
| 179 |
+
def flip_labels(example):
|
| 180 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 181 |
+
example["sentence1"] = example["sentence1"]
|
| 182 |
+
example["sentence2"] = example["sentence2"]
|
| 183 |
+
example['label'] = 1 - example['label']
|
| 184 |
+
return example
|
| 185 |
+
|
| 186 |
+
# 应用翻转标签函数
|
| 187 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 188 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
# 确保模型在 GPU 上
|
| 192 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 193 |
+
model.to(device)
|
| 194 |
+
model.eval() # 进入推理模式,加速推理
|
| 195 |
+
|
| 196 |
+
# 取出测试集数据
|
| 197 |
+
test_dataset = tokenized_datasets_dna_protein["test"]
|
| 198 |
+
|
| 199 |
+
# 预存预测结果
|
| 200 |
+
preds = []
|
| 201 |
+
labels = []
|
| 202 |
+
|
| 203 |
+
# 批量大小(建议 64、128、256 视显存大小调整)
|
| 204 |
+
batch_size = 64
|
| 205 |
+
|
| 206 |
+
# 直接遍历数据集进行推理
|
| 207 |
+
for i in tqdm(range(0, len(test_dataset), batch_size), desc="Predicting"):
|
| 208 |
+
batch = test_dataset[i : i + batch_size]
|
| 209 |
+
|
| 210 |
+
# 转换为 Tensor 并移动到 GPU
|
| 211 |
+
inputs = {
|
| 212 |
+
"input_ids": torch.tensor(batch["input_ids"]).to(device),
|
| 213 |
+
"attention_mask": torch.tensor(batch["attention_mask"]).to(device),
|
| 214 |
+
}
|
| 215 |
+
batch_labels = batch["label"] # 原始标签
|
| 216 |
+
|
| 217 |
+
with torch.no_grad(): # 关闭梯度计算,减少内存占用
|
| 218 |
+
outputs = model(**inputs)
|
| 219 |
+
batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别
|
| 220 |
+
|
| 221 |
+
preds.extend(batch_preds)
|
| 222 |
+
labels.extend(batch_labels)
|
| 223 |
+
metric = evaluate.load("glue", "mrpc")
|
| 224 |
+
ret = metric.compute(predictions=preds, references=labels)
|
| 225 |
+
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
result["dna_protein_pair_rand_full"] = ret
|
| 229 |
+
|
| 230 |
+
|
| 231 |
+
|
| 232 |
+
print(json.dumps(result))
|
| 233 |
+
|
finetune/gpt2_gene_multiv1_ft_en_test_others3.py
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
|
| 3 |
+
# # 设置环境变量
|
| 4 |
+
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
| 5 |
+
|
| 6 |
+
# # 打印环境变量以确认设置成功
|
| 7 |
+
# print(os.environ.get('HF_ENDPOINT'))
|
| 8 |
+
|
| 9 |
+
# import subprocess
|
| 10 |
+
# import os
|
| 11 |
+
|
| 12 |
+
# result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 13 |
+
# output = result.stdout
|
| 14 |
+
# for line in output.splitlines():
|
| 15 |
+
# if '=' in line:
|
| 16 |
+
# var, value = line.split('=', 1)
|
| 17 |
+
# os.environ[var] = value
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
from datasets import load_dataset
|
| 21 |
+
from transformers import AutoTokenizer, DataCollatorWithPadding
|
| 22 |
+
from transformers import Trainer
|
| 23 |
+
import evaluate
|
| 24 |
+
import numpy as np
|
| 25 |
+
from transformers import TrainingArguments
|
| 26 |
+
from transformers import AutoModelForSequenceClassification
|
| 27 |
+
import json
|
| 28 |
+
from transformers import set_seed
|
| 29 |
+
import random
|
| 30 |
+
import numpy as np
|
| 31 |
+
import torch
|
| 32 |
+
import sys
|
| 33 |
+
|
| 34 |
+
# seed = 42
|
| 35 |
+
# random.seed(seed)
|
| 36 |
+
# np.random.seed(seed)
|
| 37 |
+
# torch.manual_seed(seed)
|
| 38 |
+
# torch.cuda.manual_seed_all(seed)
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
# 动态生成随机种子
|
| 42 |
+
import random
|
| 43 |
+
#seed = random.randint(0, 10000)
|
| 44 |
+
seed = int(sys.argv[1])
|
| 45 |
+
#print(f"Generated seed: {seed}")
|
| 46 |
+
set_seed(seed)
|
| 47 |
+
result = {}
|
| 48 |
+
result["seed"] = seed
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象
|
| 53 |
+
raw_datasets = load_dataset('paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 54 |
+
|
| 55 |
+
#分词器
|
| 56 |
+
tokenizer = AutoTokenizer.from_pretrained("pt_lora_model")
|
| 57 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 58 |
+
|
| 59 |
+
# 修改分词器的填充方向为左侧,默认有右侧,分类问题建议左侧
|
| 60 |
+
#tokenizer.padding_side = "left"
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
#分词函数
|
| 64 |
+
def tokenize_function(example):
|
| 65 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256)
|
| 66 |
+
return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256, padding="max_length")
|
| 67 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=1024) #padding="max_length")
|
| 68 |
+
|
| 69 |
+
#构建分词后的数据集
|
| 70 |
+
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
|
| 71 |
+
|
| 72 |
+
#训练数据构建
|
| 73 |
+
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
#指标函数定义
|
| 77 |
+
def compute_metrics(eval_pred):
|
| 78 |
+
predictions, labels = eval_pred
|
| 79 |
+
predictions = np.argmax(predictions, axis=1)
|
| 80 |
+
return {'accuracy': (predictions==labels).sum() / len(labels)}
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
training_args = TrainingArguments(
|
| 85 |
+
output_dir="ds_job_dna_2222",
|
| 86 |
+
learning_rate=1e-5,
|
| 87 |
+
lr_scheduler_type="constant_with_warmup",
|
| 88 |
+
warmup_ratio=0.1,
|
| 89 |
+
optim='adamw_torch',
|
| 90 |
+
weight_decay=0.0,
|
| 91 |
+
seed=seed, # 使用动态生成的随机种子
|
| 92 |
+
per_device_train_batch_size=20,
|
| 93 |
+
per_device_eval_batch_size=20,
|
| 94 |
+
num_train_epochs=4, #训练多少轮
|
| 95 |
+
evaluation_strategy="epoch",
|
| 96 |
+
save_strategy="epoch",
|
| 97 |
+
logging_strategy="epoch",
|
| 98 |
+
load_best_model_at_end=True
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
#模型定义,文本分类模型
|
| 102 |
+
model = AutoModelForSequenceClassification.from_pretrained("pt_lora_model", num_labels=2)
|
| 103 |
+
model.config.pad_token_id = model.config.eos_token_id
|
| 104 |
+
|
| 105 |
+
trainer = Trainer(
|
| 106 |
+
model,
|
| 107 |
+
training_args,
|
| 108 |
+
train_dataset=tokenized_datasets["train"],
|
| 109 |
+
eval_dataset=tokenized_datasets["validation"],
|
| 110 |
+
data_collator=data_collator,
|
| 111 |
+
tokenizer=tokenizer,
|
| 112 |
+
compute_metrics=compute_metrics,
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
trainer.train() #模型训练
|
| 116 |
+
|
| 117 |
+
#模型测试,英文数据集
|
| 118 |
+
predictions = trainer.predict(tokenized_datasets["test"])
|
| 119 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 120 |
+
metric = evaluate.load("glue", "mrpc")
|
| 121 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 122 |
+
result["en"] = ret
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
#模型测试,法文数据集
|
| 126 |
+
raw_datasets_fr = load_dataset('paws-x', 'fr') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 127 |
+
tokenized_datasets_fr = raw_datasets_fr.map(tokenize_function, batched=True)
|
| 128 |
+
|
| 129 |
+
predictions = trainer.predict(tokenized_datasets_fr["test"])
|
| 130 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 131 |
+
metric = evaluate.load("glue", "mrpc")
|
| 132 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 133 |
+
result["fr"] = ret
|
| 134 |
+
|
| 135 |
+
#模型测试,德文数据集
|
| 136 |
+
raw_datasets_de = load_dataset('google-research-datasets/paws-x', 'de') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 137 |
+
tokenized_datasets_de = raw_datasets_de.map(tokenize_function, batched=True)
|
| 138 |
+
predictions = trainer.predict(tokenized_datasets_de["test"])
|
| 139 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 140 |
+
metric = evaluate.load("glue", "mrpc")
|
| 141 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 142 |
+
result["de"] = ret
|
| 143 |
+
|
| 144 |
+
#模型测试,中文数据集
|
| 145 |
+
raw_datasets_zh = load_dataset('google-research-datasets/paws-x', 'zh') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 146 |
+
tokenized_datasets_zh = raw_datasets_zh.map(tokenize_function, batched=True)
|
| 147 |
+
|
| 148 |
+
predictions = trainer.predict(tokenized_datasets_zh["test"])
|
| 149 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 150 |
+
metric = evaluate.load("glue", "mrpc")
|
| 151 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 152 |
+
result["zh"] = ret
|
| 153 |
+
|
| 154 |
+
#模型测试 dna数据集,150 bp长度 简单版本
|
| 155 |
+
raw_datasets_dna =load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_simple_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 156 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 157 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 158 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 159 |
+
metric = evaluate.load("glue", "mrpc")
|
| 160 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 161 |
+
result["dna_sim_pair_simple_150bp"] = ret
|
| 162 |
+
|
| 163 |
+
#模型测试 dna数据集,150长度,复杂版本 不相似
|
| 164 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 165 |
+
tokenized_datasets_dna= raw_datasets_dna.map(tokenize_function, batched=True)
|
| 166 |
+
|
| 167 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 168 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 169 |
+
metric = evaluate.load("glue", "mrpc")
|
| 170 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 171 |
+
result["dna_sim_pair_150bp"] = ret
|
| 172 |
+
|
| 173 |
+
#模型测试 dna数据集,50长度,复杂版本 不相似
|
| 174 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_50bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 175 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 176 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 177 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 178 |
+
metric = evaluate.load("glue", "mrpc")
|
| 179 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 180 |
+
result["dna_sim_pair_50bp"] = ret
|
| 181 |
+
|
| 182 |
+
#模型测试 蛋白质数据集,50长度/150bp,复杂版本 不相似
|
| 183 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_150bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 184 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 185 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 186 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 187 |
+
metric = evaluate.load("glue", "mrpc")
|
| 188 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 189 |
+
result["protein_sim_pair_150bp"] = ret
|
| 190 |
+
|
| 191 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 192 |
+
|
| 193 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_450bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 194 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 195 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 196 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 197 |
+
metric = evaluate.load("glue", "mrpc")
|
| 198 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 199 |
+
result["protein_sim_pair_450bp"] = ret
|
| 200 |
+
|
| 201 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 202 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 203 |
+
|
| 204 |
+
# 定义翻转标签的函数
|
| 205 |
+
def flip_labels(example):
|
| 206 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 207 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 208 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 209 |
+
example['label'] = 1 - example['label']
|
| 210 |
+
return example
|
| 211 |
+
|
| 212 |
+
# 应用翻转标签函数
|
| 213 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 214 |
+
|
| 215 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 216 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 217 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 218 |
+
metric = evaluate.load("glue", "mrpc")
|
| 219 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 220 |
+
result["dna_protein_pair"] = ret
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 224 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 225 |
+
|
| 226 |
+
# 定义翻转标签的函数
|
| 227 |
+
def flip_labels(example):
|
| 228 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 229 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 230 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 231 |
+
example['label'] = 1 - example['label']
|
| 232 |
+
return example
|
| 233 |
+
|
| 234 |
+
# 应用翻转标签函数
|
| 235 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 236 |
+
|
| 237 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 238 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 239 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 240 |
+
metric = evaluate.load("glue", "mrpc")
|
| 241 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 242 |
+
result["dna_protein_pair_100"] = ret
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
|
| 248 |
+
|
| 249 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 250 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 251 |
+
|
| 252 |
+
# 定义翻转标签的函数
|
| 253 |
+
def flip_labels(example):
|
| 254 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 255 |
+
example["sentence1"] = example["sentence1"]
|
| 256 |
+
example["sentence2"] = example["sentence2"]
|
| 257 |
+
example['label'] = 1 - example['label']
|
| 258 |
+
return example
|
| 259 |
+
|
| 260 |
+
# 应用翻转标签函数
|
| 261 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 262 |
+
|
| 263 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 264 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 265 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 266 |
+
metric = evaluate.load("glue", "mrpc")
|
| 267 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 268 |
+
result["dna_protein_pair_full"] = ret
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
|
| 273 |
+
|
| 274 |
+
#模型测试 蛋白质数据集,随机版本
|
| 275 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 276 |
+
|
| 277 |
+
# 定义翻转标签的函数
|
| 278 |
+
def flip_labels(example):
|
| 279 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 280 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 281 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 282 |
+
example['label'] = 1 - example['label']
|
| 283 |
+
return example
|
| 284 |
+
|
| 285 |
+
# 应用翻转标签函数
|
| 286 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 287 |
+
|
| 288 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 289 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 290 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 291 |
+
metric = evaluate.load("glue", "mrpc")
|
| 292 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 293 |
+
result["dna_protein_pair_rand"] = ret
|
| 294 |
+
|
| 295 |
+
|
| 296 |
+
#模型测试 蛋白质数据集,随机版本
|
| 297 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 298 |
+
|
| 299 |
+
# 定义翻转标签的函数
|
| 300 |
+
def flip_labels(example):
|
| 301 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 302 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 303 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 304 |
+
example['label'] = 1 - example['label']
|
| 305 |
+
return example
|
| 306 |
+
|
| 307 |
+
# 应用翻转标签函数
|
| 308 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 309 |
+
|
| 310 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 311 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 312 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 313 |
+
metric = evaluate.load("glue", "mrpc")
|
| 314 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 315 |
+
result["dna_protein_pair_rand_100"] = ret
|
| 316 |
+
|
| 317 |
+
|
| 318 |
+
|
| 319 |
+
|
| 320 |
+
#模型测试 蛋白质数据集,随机版本
|
| 321 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 322 |
+
|
| 323 |
+
# 定义翻转标签的函数
|
| 324 |
+
def flip_labels(example):
|
| 325 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 326 |
+
example["sentence1"] = example["sentence1"]
|
| 327 |
+
example["sentence2"] = example["sentence2"]
|
| 328 |
+
example['label'] = 1 - example['label']
|
| 329 |
+
return example
|
| 330 |
+
|
| 331 |
+
# 应用翻转标签函数
|
| 332 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 333 |
+
|
| 334 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 335 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 336 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 337 |
+
metric = evaluate.load("glue", "mrpc")
|
| 338 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 339 |
+
result["dna_protein_pair_rand_full"] = ret
|
| 340 |
+
|
| 341 |
+
|
| 342 |
+
|
| 343 |
+
print(json.dumps(result))
|
| 344 |
+
|
finetune/gpt2_gene_multiv2_ft_en.jsonl
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"seed": 0, "en": {"accuracy": 0.8785, "f1": 0.8682926829268293}, "fr": {"accuracy": 0.7845, "f1": 0.783308195072901}, "de": {"accuracy": 0.7845, "f1": 0.7725593667546174}, "zh": {"accuracy": 0.713, "f1": 0.6828729281767956}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9358333333333333, "f1": 0.9312704552216602}, "dna_sim_pair_150bp": {"accuracy": 0.7265, "f1": 0.6240549828178694}, "dna_sim_pair_50bp": {"accuracy": 0.816, "f1": 0.8071278825995807}, "protein_sim_pair_150bp": {"accuracy": 0.9477777777777778, "f1": 0.9476614699331849}, "protein_sim_pair_450bp": {"accuracy": 0.8955555555555555, "f1": 0.8934240362811792}, "dna_protein_pair": {"accuracy": 0.5175, "f1": 0.010256410256410256}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.010526315789473684}, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.028169014084507043}, "dna_protein_pair_rand": {"accuracy": 0.51875, "f1": 0.0399002493765586}, "dna_protein_pair_rand_100": {"accuracy": 0.510625, "f1": 0.0076045627376425855}, "dna_protein_pair_rand_full": {"accuracy": 0.480625, "f1": 0.014234875444839857}}
|
| 2 |
+
{"seed": 1, "en": {"accuracy": 0.8695, "f1": 0.8610963278339542}, "fr": {"accuracy": 0.8045, "f1": 0.8047928107838243}, "de": {"accuracy": 0.7565, "f1": 0.7526663280853225}, "zh": {"accuracy": 0.7185, "f1": 0.7246943765281174}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9308333333333333, "f1": 0.9312344656172328}, "dna_sim_pair_150bp": {"accuracy": 0.87725, "f1": 0.8644769528015457}, "dna_sim_pair_50bp": {"accuracy": 0.7425, "f1": 0.768954688200987}, "protein_sim_pair_150bp": {"accuracy": 0.9472222222222222, "f1": 0.9463579898362507}, "protein_sim_pair_450bp": {"accuracy": 0.8344444444444444, "f1": 0.8558994197292069}, "dna_protein_pair": {"accuracy": 0.5025, "f1": 0.009950248756218905}, "dna_protein_pair_100": {"accuracy": 0.4975, "f1": 0.06511627906976744}, "dna_protein_pair_full": {"accuracy": 0.335, "f1": 0.46586345381526106}, "dna_protein_pair_rand": {"accuracy": 0.5325, "f1": 0.065}, "dna_protein_pair_rand_100": {"accuracy": 0.5175, "f1": 0.12866817155756208}, "dna_protein_pair_rand_full": {"accuracy": 0.540625, "f1": 0.6185781006746238}}
|
| 3 |
+
{"seed": 3, "en": {"accuracy": 0.8905, "f1": 0.8855201254573968}, "fr": {"accuracy": 0.791, "f1": 0.7972841901066925}, "de": {"accuracy": 0.764, "f1": 0.776303317535545}, "zh": {"accuracy": 0.719, "f1": 0.7013815090329437}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9502777777777778, "f1": 0.9484595450619061}, "dna_sim_pair_150bp": {"accuracy": 0.749, "f1": 0.6710353866317169}, "dna_sim_pair_50bp": {"accuracy": 0.7525, "f1": 0.7086521483225426}, "protein_sim_pair_150bp": {"accuracy": 0.9533333333333334, "f1": 0.9522184300341296}, "protein_sim_pair_450bp": {"accuracy": 0.945, "f1": 0.9422066549912435}, "dna_protein_pair": {"accuracy": 0.5425, "f1": 0.0213903743315508}, "dna_protein_pair_100": {"accuracy": 0.52, "f1": 0.04}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.06698564593301436}, "dna_protein_pair_rand": {"accuracy": 0.49375, "f1": 0.04929577464788732}, "dna_protein_pair_rand_100": {"accuracy": 0.495, "f1": 0.024154589371980676}, "dna_protein_pair_rand_full": {"accuracy": 0.495, "f1": 0.04941176470588235}}
|
| 4 |
+
{"seed": 4, "en": {"accuracy": 0.888, "f1": 0.8848920863309353}, "fr": {"accuracy": 0.775, "f1": 0.7922437673130194}, "de": {"accuracy": 0.7515, "f1": 0.7678654834189631}, "zh": {"accuracy": 0.6985, "f1": 0.7207040296433534}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8472222222222222, "f1": 0.8643315244203256}, "dna_sim_pair_150bp": {"accuracy": 0.80775, "f1": 0.8225248096007385}, "dna_sim_pair_50bp": {"accuracy": 0.516, "f1": 0.6675824175824175}, "protein_sim_pair_150bp": {"accuracy": 0.8961111111111111, "f1": 0.9051243023845763}, "protein_sim_pair_450bp": {"accuracy": 0.8694444444444445, "f1": 0.8806500761808025}, "dna_protein_pair": {"accuracy": 0.4675, "f1": 0.25263157894736843}, "dna_protein_pair_100": {"accuracy": 0.5025, "f1": 0.16033755274261605}, "dna_protein_pair_full": {"accuracy": 0.5275, "f1": 0.1888412017167382}, "dna_protein_pair_rand": {"accuracy": 0.52875, "f1": 0.300556586270872}, "dna_protein_pair_rand_100": {"accuracy": 0.518125, "f1": 0.27332704995287466}, "dna_protein_pair_rand_full": {"accuracy": 0.513125, "f1": 0.24}}
|
| 5 |
+
{"seed": 5, "en": {"accuracy": 0.878, "f1": 0.872784150156413}, "fr": {"accuracy": 0.7845, "f1": 0.7936811871708952}, "de": {"accuracy": 0.767, "f1": 0.7681592039800995}, "zh": {"accuracy": 0.719, "f1": 0.7085062240663901}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9263888888888889, "f1": 0.9274568847522584}, "dna_sim_pair_150bp": {"accuracy": 0.85375, "f1": 0.8475371383893667}, "dna_sim_pair_50bp": {"accuracy": 0.658, "f1": 0.7274900398406374}, "protein_sim_pair_150bp": {"accuracy": 0.9838888888888889, "f1": 0.9839335180055402}, "protein_sim_pair_450bp": {"accuracy": 0.9505555555555556, "f1": 0.9493454752418896}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.05714285714285714}, "dna_protein_pair_100": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5475, "f1": 0.1339712918660287}, "dna_protein_pair_rand": {"accuracy": 0.51625, "f1": 0.03970223325062035}, "dna_protein_pair_rand_100": {"accuracy": 0.483125, "f1": 0.03274853801169591}, "dna_protein_pair_rand_full": {"accuracy": 0.496875, "f1": 0.08626560726447219}}
|
| 6 |
+
{"seed": 6, "en": {"accuracy": 0.886, "f1": 0.8791092258748674}, "fr": {"accuracy": 0.783, "f1": 0.7925430210325047}, "de": {"accuracy": 0.764, "f1": 0.7618567103935419}, "zh": {"accuracy": 0.7235, "f1": 0.7159732922444787}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9247222222222222, "f1": 0.9215629522431259}, "dna_sim_pair_150bp": {"accuracy": 0.73, "f1": 0.6465968586387435}, "dna_sim_pair_50bp": {"accuracy": 0.632, "f1": 0.7100078802206462}, "protein_sim_pair_150bp": {"accuracy": 0.9344444444444444, "f1": 0.9355895196506551}, "protein_sim_pair_450bp": {"accuracy": 0.905, "f1": 0.8989958653278204}, "dna_protein_pair": {"accuracy": 0.495, "f1": 0.07339449541284404}, "dna_protein_pair_100": {"accuracy": 0.5175, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.49375, "f1": 0.04929577464788732}, "dna_protein_pair_rand_100": {"accuracy": 0.519375, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.490625, "f1": 0.0024479804161566705}}
|
| 7 |
+
{"seed": 7, "en": {"accuracy": 0.885, "f1": 0.8773987206823027}, "fr": {"accuracy": 0.795, "f1": 0.7966269841269841}, "de": {"accuracy": 0.754, "f1": 0.7604673807205453}, "zh": {"accuracy": 0.714, "f1": 0.7069672131147541}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9416666666666667, "f1": 0.9387040280210157}, "dna_sim_pair_150bp": {"accuracy": 0.73675, "f1": 0.6541871921182266}, "dna_sim_pair_50bp": {"accuracy": 0.7805, "f1": 0.7939934303144064}, "protein_sim_pair_150bp": {"accuracy": 0.9455555555555556, "f1": 0.9476495726495726}, "protein_sim_pair_450bp": {"accuracy": 0.8877777777777778, "f1": 0.875615763546798}, "dna_protein_pair": {"accuracy": 0.5025, "f1": 0.019704433497536946}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.043859649122807015}, "dna_protein_pair_rand": {"accuracy": 0.513125, "f1": 0.12570145903479238}, "dna_protein_pair_rand_100": {"accuracy": 0.49625, "f1": 0.026570048309178744}, "dna_protein_pair_rand_full": {"accuracy": 0.53125, "f1": 0.1591928251121076}}
|
| 8 |
+
{"seed": 8, "en": {"accuracy": 0.872, "f1": 0.8649789029535865}, "fr": {"accuracy": 0.774, "f1": 0.7818532818532818}, "de": {"accuracy": 0.753, "f1": 0.7564102564102564}, "zh": {"accuracy": 0.7175, "f1": 0.6920980926430518}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9580555555555555, "f1": 0.9565217391304348}, "dna_sim_pair_150bp": {"accuracy": 0.77125, "f1": 0.7092469018112488}, "dna_sim_pair_50bp": {"accuracy": 0.8295, "f1": 0.8165680473372781}, "protein_sim_pair_150bp": {"accuracy": 0.9166666666666666, "f1": 0.9197860962566845}, "protein_sim_pair_450bp": {"accuracy": 0.9083333333333333, "f1": 0.9032258064516129}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.1506276150627615}, "dna_protein_pair_rand": {"accuracy": 0.520625, "f1": 0.005188067444876783}, "dna_protein_pair_rand_100": {"accuracy": 0.501875, "f1": 0.0025031289111389237}, "dna_protein_pair_rand_full": {"accuracy": 0.623125, "f1": 0.4928511354079058}}
|
| 9 |
+
{"seed": 9, "en": {"accuracy": 0.8525, "f1": 0.8381788261108064}, "fr": {"accuracy": 0.7825, "f1": 0.768}, "de": {"accuracy": 0.74, "f1": 0.7302904564315352}, "zh": {"accuracy": 0.6945, "f1": 0.6673924877517692}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9363888888888889, "f1": 0.9338723650014439}, "dna_sim_pair_150bp": {"accuracy": 0.6815, "f1": 0.5475852272727273}, "dna_sim_pair_50bp": {"accuracy": 0.7825, "f1": 0.7495682210708118}, "protein_sim_pair_150bp": {"accuracy": 0.9416666666666667, "f1": 0.9413735343383585}, "protein_sim_pair_450bp": {"accuracy": 0.8, "f1": 0.7643979057591623}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.05555555555555555}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.00980392156862745}, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.2807017543859649}, "dna_protein_pair_rand": {"accuracy": 0.4875, "f1": 0.07029478458049887}, "dna_protein_pair_rand_100": {"accuracy": 0.491875, "f1": 0.0097442143727162}, "dna_protein_pair_rand_full": {"accuracy": 0.4875, "f1": 0.24493554327808473}}
|
| 10 |
+
{"seed": 10, "en": {"accuracy": 0.8845, "f1": 0.8789942378208486}, "fr": {"accuracy": 0.7975, "f1": 0.8015678588926997}, "de": {"accuracy": 0.7715, "f1": 0.7669556348801632}, "zh": {"accuracy": 0.7095, "f1": 0.6871297792137857}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9347222222222222, "f1": 0.9358098880087408}, "dna_sim_pair_150bp": {"accuracy": 0.85325, "f1": 0.8461336828309305}, "dna_sim_pair_50bp": {"accuracy": 0.755, "f1": 0.7829937998228521}, "protein_sim_pair_150bp": {"accuracy": 0.935, "f1": 0.9360306178239475}, "protein_sim_pair_450bp": {"accuracy": 0.9333333333333333, "f1": 0.9349945828819068}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.1038961038961039}, "dna_protein_pair_100": {"accuracy": 0.4625, "f1": 0.13654618473895583}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.15584415584415584}, "dna_protein_pair_rand": {"accuracy": 0.514375, "f1": 0.112}, "dna_protein_pair_rand_100": {"accuracy": 0.5275, "f1": 0.13302752293577982}, "dna_protein_pair_rand_full": {"accuracy": 0.5075, "f1": 0.20883534136546184}}
|
| 11 |
+
{"seed": 11, "en": {"accuracy": 0.8995, "f1": 0.8914100486223663}, "fr": {"accuracy": 0.811, "f1": 0.8100502512562814}, "de": {"accuracy": 0.778, "f1": 0.7720739219712526}, "zh": {"accuracy": 0.713, "f1": 0.7172413793103448}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9369444444444445, "f1": 0.9322185727082711}, "dna_sim_pair_150bp": {"accuracy": 0.783, "f1": 0.7065584854631508}, "dna_sim_pair_50bp": {"accuracy": 0.795, "f1": 0.7704367301231803}, "protein_sim_pair_150bp": {"accuracy": 0.9516666666666667, "f1": 0.9509859154929577}, "protein_sim_pair_450bp": {"accuracy": 0.9688888888888889, "f1": 0.9681818181818181}, "dna_protein_pair": {"accuracy": 0.465, "f1": 0.044642857142857144}, "dna_protein_pair_100": {"accuracy": 0.535, "f1": 0.010638297872340425}, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.0625}, "dna_protein_pair_rand": {"accuracy": 0.509375, "f1": 0.05078597339782346}, "dna_protein_pair_rand_100": {"accuracy": 0.505625, "f1": 0.07485380116959064}, "dna_protein_pair_rand_full": {"accuracy": 0.518125, "f1": 0.07220216606498195}}
|
| 12 |
+
{"seed": 12, "en": {"accuracy": 0.8885, "f1": 0.8799138395261173}, "fr": {"accuracy": 0.792, "f1": 0.7964774951076321}, "de": {"accuracy": 0.7705, "f1": 0.7682988389702171}, "zh": {"accuracy": 0.711, "f1": 0.7035897435897436}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9516666666666667, "f1": 0.949798038084247}, "dna_sim_pair_150bp": {"accuracy": 0.8075, "f1": 0.7566371681415929}, "dna_sim_pair_50bp": {"accuracy": 0.72, "f1": 0.7592433361994841}, "protein_sim_pair_150bp": {"accuracy": 0.9283333333333333, "f1": 0.9293150684931507}, "protein_sim_pair_450bp": {"accuracy": 0.885, "f1": 0.8805539526832084}, "dna_protein_pair": {"accuracy": 0.4725, "f1": 0.009389671361502348}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.046948356807511735}, "dna_protein_pair_rand": {"accuracy": 0.493125, "f1": 0.01696969696969697}, "dna_protein_pair_rand_100": {"accuracy": 0.501875, "f1": 0.009937888198757764}, "dna_protein_pair_rand_full": {"accuracy": 0.588125, "f1": 0.3812206572769953}}
|
| 13 |
+
{"seed": 13, "en": {"accuracy": 0.9045, "f1": 0.8947658402203856}, "fr": {"accuracy": 0.814, "f1": 0.805439330543933}, "de": {"accuracy": 0.7875, "f1": 0.7742963356346256}, "zh": {"accuracy": 0.7335, "f1": 0.699718309859155}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9525, "f1": 0.949926793557833}, "dna_sim_pair_150bp": {"accuracy": 0.77875, "f1": 0.721785602011946}, "dna_sim_pair_50bp": {"accuracy": 0.7955, "f1": 0.7685342388228636}, "protein_sim_pair_150bp": {"accuracy": 0.9527777777777777, "f1": 0.9523275378575434}, "protein_sim_pair_450bp": {"accuracy": 0.92, "f1": 0.9164733178654292}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.010471204188481676}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.02843601895734597}, "dna_protein_pair_full": {"accuracy": 0.4625, "f1": 0.09282700421940929}, "dna_protein_pair_rand": {"accuracy": 0.495, "f1": 0.0170316301703163}, "dna_protein_pair_rand_100": {"accuracy": 0.510625, "f1": 0.01756587202007528}, "dna_protein_pair_rand_full": {"accuracy": 0.58125, "f1": 0.35946462715105165}}
|
| 14 |
+
{"seed": 14, "en": {"accuracy": 0.877, "f1": 0.8699788583509513}, "fr": {"accuracy": 0.786, "f1": 0.7934362934362934}, "de": {"accuracy": 0.751, "f1": 0.7575462512171373}, "zh": {"accuracy": 0.727, "f1": 0.7242424242424242}, "dna_sim_pair_simple_150bp": {"accuracy": 0.6475, "f1": 0.7286722257857601}, "dna_sim_pair_150bp": {"accuracy": 0.5595, "f1": 0.6436084142394822}, "dna_sim_pair_50bp": {"accuracy": 0.485, "f1": 0.6411149825783972}, "protein_sim_pair_150bp": {"accuracy": 0.9088888888888889, "f1": 0.9096916299559471}, "protein_sim_pair_450bp": {"accuracy": 0.9283333333333333, "f1": 0.9207129686539643}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.11009174311926606}, "dna_protein_pair_100": {"accuracy": 0.525, "f1": 0.020618556701030927}, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.51875, "f1": 0.12100456621004566}, "dna_protein_pair_rand_100": {"accuracy": 0.51375, "f1": 0.005115089514066497}, "dna_protein_pair_rand_full": {"accuracy": 0.491875, "f1": 0.0}}
|
| 15 |
+
{"seed": 15, "en": {"accuracy": 0.8955, "f1": 0.8892421833598304}, "fr": {"accuracy": 0.803, "f1": 0.8081791626095424}, "de": {"accuracy": 0.7685, "f1": 0.7655696202531646}, "zh": {"accuracy": 0.7205, "f1": 0.7183879093198993}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9452777777777778, "f1": 0.9423808131032466}, "dna_sim_pair_150bp": {"accuracy": 0.8075, "f1": 0.7543075941289088}, "dna_sim_pair_50bp": {"accuracy": 0.6715, "f1": 0.5186813186813187}, "protein_sim_pair_150bp": {"accuracy": 0.9416666666666667, "f1": 0.9392712550607287}, "protein_sim_pair_450bp": {"accuracy": 0.9666666666666667, "f1": 0.9661399548532731}, "dna_protein_pair": {"accuracy": 0.4925, "f1": 0.00975609756097561}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.010050251256281407}, "dna_protein_pair_rand": {"accuracy": 0.52, "f1": 0.017902813299232736}, "dna_protein_pair_rand_100": {"accuracy": 0.520625, "f1": 0.005188067444876783}, "dna_protein_pair_rand_full": {"accuracy": 0.49875, "f1": 0.0024875621890547263}}
|
| 16 |
+
{"seed": 16, "en": {"accuracy": 0.877, "f1": 0.8695652173913043}, "fr": {"accuracy": 0.795, "f1": 0.7988223748773308}, "de": {"accuracy": 0.7535, "f1": 0.7598636142230881}, "zh": {"accuracy": 0.7175, "f1": 0.6904109589041096}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7672222222222222, "f1": 0.8031015037593985}, "dna_sim_pair_150bp": {"accuracy": 0.67225, "f1": 0.7074313769247935}, "dna_sim_pair_50bp": {"accuracy": 0.466, "f1": 0.6339958875942426}, "protein_sim_pair_150bp": {"accuracy": 0.9316666666666666, "f1": 0.9321566464423607}, "protein_sim_pair_450bp": {"accuracy": 0.8872222222222222, "f1": 0.886781929726715}, "dna_protein_pair": {"accuracy": 0.525, "f1": 0.030612244897959183}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.020202020202020204}, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.19494584837545126}, "dna_protein_pair_rand": {"accuracy": 0.534375, "f1": 0.09915356711003627}, "dna_protein_pair_rand_100": {"accuracy": 0.514375, "f1": 0.06498194945848375}, "dna_protein_pair_rand_full": {"accuracy": 0.57125, "f1": 0.3875}}
|
| 17 |
+
{"seed": 17, "en": {"accuracy": 0.881, "f1": 0.8760416666666667}, "fr": {"accuracy": 0.772, "f1": 0.7853107344632768}, "de": {"accuracy": 0.7535, "f1": 0.7617206379893668}, "zh": {"accuracy": 0.7115, "f1": 0.7084386053562405}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9452777777777778, "f1": 0.9452321378926883}, "dna_sim_pair_150bp": {"accuracy": 0.80475, "f1": 0.7631179860479224}, "dna_sim_pair_50bp": {"accuracy": 0.7765, "f1": 0.780559646539028}, "protein_sim_pair_150bp": {"accuracy": 0.9438888888888889, "f1": 0.9449591280653951}, "protein_sim_pair_450bp": {"accuracy": 0.8183333333333334, "f1": 0.8399412628487518}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.24444444444444444}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.37748344370860926}, "dna_protein_pair_full": {"accuracy": 0.4275, "f1": 0.5219206680584552}, "dna_protein_pair_rand": {"accuracy": 0.5075, "f1": 0.20724346076458752}, "dna_protein_pair_rand_100": {"accuracy": 0.55875, "f1": 0.400679117147708}, "dna_protein_pair_rand_full": {"accuracy": 0.5275, "f1": 0.5837004405286343}}
|
| 18 |
+
{"seed": 18, "en": {"accuracy": 0.884, "f1": 0.8758029978586723}, "fr": {"accuracy": 0.7905, "f1": 0.7968977217644208}, "de": {"accuracy": 0.749, "f1": 0.7584215591915303}, "zh": {"accuracy": 0.7295, "f1": 0.7142102482831485}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9155555555555556, "f1": 0.9146546883773161}, "dna_sim_pair_150bp": {"accuracy": 0.71725, "f1": 0.6435549952726126}, "dna_sim_pair_50bp": {"accuracy": 0.5355, "f1": 0.6583302684810592}, "protein_sim_pair_150bp": {"accuracy": 0.9538888888888889, "f1": 0.9528140989198408}, "protein_sim_pair_450bp": {"accuracy": 0.9527777777777777, "f1": 0.9512893982808023}, "dna_protein_pair": {"accuracy": 0.5525, "f1": 0.05291005291005291}, "dna_protein_pair_100": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.01990049751243781}, "dna_protein_pair_rand": {"accuracy": 0.51125, "f1": 0.041666666666666664}, "dna_protein_pair_rand_100": {"accuracy": 0.47625, "f1": 0.004750593824228029}, "dna_protein_pair_rand_full": {"accuracy": 0.545625, "f1": 0.12091898428053205}}
|
| 19 |
+
{"seed": 19, "en": {"accuracy": 0.8985, "f1": 0.8908015061861215}, "fr": {"accuracy": 0.7955, "f1": 0.8013598834385625}, "de": {"accuracy": 0.7795, "f1": 0.776255707762557}, "zh": {"accuracy": 0.725, "f1": 0.7132429614181439}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9572222222222222, "f1": 0.9553364269141531}, "dna_sim_pair_150bp": {"accuracy": 0.82225, "f1": 0.7853908843948083}, "dna_sim_pair_50bp": {"accuracy": 0.741, "f1": 0.7349027635619243}, "protein_sim_pair_150bp": {"accuracy": 0.9566666666666667, "f1": 0.9573304157549234}, "protein_sim_pair_450bp": {"accuracy": 0.9727777777777777, "f1": 0.9731506849315068}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.0297029702970297}, "dna_protein_pair_100": {"accuracy": 0.48, "f1": 0.028037383177570093}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.061946902654867256}, "dna_protein_pair_rand": {"accuracy": 0.500625, "f1": 0.04767580452920143}, "dna_protein_pair_rand_100": {"accuracy": 0.4625, "f1": 0.03803131991051454}, "dna_protein_pair_rand_full": {"accuracy": 0.515, "f1": 0.12415349887133183}}
|
| 20 |
+
{"seed": 20, "en": {"accuracy": 0.872, "f1": 0.8651211801896733}, "fr": {"accuracy": 0.779, "f1": 0.7833333333333333}, "de": {"accuracy": 0.7525, "f1": 0.7521281922884326}, "zh": {"accuracy": 0.734, "f1": 0.7007874015748031}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9041666666666667, "f1": 0.9040867389491243}, "dna_sim_pair_150bp": {"accuracy": 0.742, "f1": 0.693950177935943}, "dna_sim_pair_50bp": {"accuracy": 0.673, "f1": 0.7154046997389034}, "protein_sim_pair_150bp": {"accuracy": 0.9355555555555556, "f1": 0.9347581552305961}, "protein_sim_pair_450bp": {"accuracy": 0.9472222222222222, "f1": 0.9446709376820035}, "dna_protein_pair": {"accuracy": 0.48, "f1": 0.037037037037037035}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.51125, "f1": 0.041666666666666664}, "dna_protein_pair_rand_100": {"accuracy": 0.505625, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.519375, "f1": 0.015364916773367477}}
|
| 21 |
+
{"seed": 22, "en": {"accuracy": 0.882, "f1": 0.8737967914438503}, "fr": {"accuracy": 0.782, "f1": 0.7895752895752896}, "de": {"accuracy": 0.7575, "f1": 0.7597820703318474}, "zh": {"accuracy": 0.726, "f1": 0.7018498367791077}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9222222222222223, "f1": 0.92}, "dna_sim_pair_150bp": {"accuracy": 0.8355, "f1": 0.8183324130314743}, "dna_sim_pair_50bp": {"accuracy": 0.617, "f1": 0.6770657672849916}, "protein_sim_pair_150bp": {"accuracy": 0.8383333333333334, "f1": 0.8581179912237933}, "protein_sim_pair_450bp": {"accuracy": 0.8461111111111111, "f1": 0.8661188980183664}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.049019607843137254}, "dna_protein_pair_100": {"accuracy": 0.55, "f1": 0.19642857142857142}, "dna_protein_pair_full": {"accuracy": 0.3575, "f1": 0.48906560636182905}, "dna_protein_pair_rand": {"accuracy": 0.535625, "f1": 0.1753607103218646}, "dna_protein_pair_rand_100": {"accuracy": 0.545, "f1": 0.30134357005758156}, "dna_protein_pair_rand_full": {"accuracy": 0.578125, "f1": 0.6441750131787032}}
|
| 22 |
+
{"seed": 23, "en": {"accuracy": 0.88, "f1": 0.8727465535524921}, "fr": {"accuracy": 0.7975, "f1": 0.7978032950574139}, "de": {"accuracy": 0.768, "f1": 0.760577915376677}, "zh": {"accuracy": 0.715, "f1": 0.6928879310344828}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9355555555555556, "f1": 0.9343891402714932}, "dna_sim_pair_150bp": {"accuracy": 0.747, "f1": 0.6993464052287581}, "dna_sim_pair_50bp": {"accuracy": 0.724, "f1": 0.7639007698887939}, "protein_sim_pair_150bp": {"accuracy": 0.8972222222222223, "f1": 0.8980716253443526}, "protein_sim_pair_450bp": {"accuracy": 0.9283333333333333, "f1": 0.9270774448841154}, "dna_protein_pair": {"accuracy": 0.5175, "f1": 0.06763285024154589}, "dna_protein_pair_100": {"accuracy": 0.5275, "f1": 0.02072538860103627}, "dna_protein_pair_full": {"accuracy": 0.4275, "f1": 0.14232209737827714}, "dna_protein_pair_rand": {"accuracy": 0.53375, "f1": 0.12028301886792453}, "dna_protein_pair_rand_100": {"accuracy": 0.504375, "f1": 0.02937576499388005}, "dna_protein_pair_rand_full": {"accuracy": 0.5425, "f1": 0.2294736842105263}}
|
| 23 |
+
{"seed": 24, "en": {"accuracy": 0.8735, "f1": 0.8701898409440739}, "fr": {"accuracy": 0.7905, "f1": 0.797682279092226}, "de": {"accuracy": 0.74, "f1": 0.7549481621112158}, "zh": {"accuracy": 0.7135, "f1": 0.7041817243159525}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9419444444444445, "f1": 0.9409103760248798}, "dna_sim_pair_150bp": {"accuracy": 0.75075, "f1": 0.6650990930466913}, "dna_sim_pair_50bp": {"accuracy": 0.632, "f1": 0.6912751677852349}, "protein_sim_pair_150bp": {"accuracy": 0.9472222222222222, "f1": 0.9440847557386698}, "protein_sim_pair_450bp": {"accuracy": 0.8816666666666667, "f1": 0.8671241422333126}, "dna_protein_pair": {"accuracy": 0.47, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4675, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5275, "f1": 0.03076923076923077}, "dna_protein_pair_rand": {"accuracy": 0.485, "f1": 0.009615384615384616}, "dna_protein_pair_rand_100": {"accuracy": 0.49875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.5025, "f1": 0.009950248756218905}}
|
| 24 |
+
{"seed": 25, "en": {"accuracy": 0.8795, "f1": 0.8733578560168156}, "fr": {"accuracy": 0.7755, "f1": 0.7852702056432329}, "de": {"accuracy": 0.771, "f1": 0.7607105538140021}, "zh": {"accuracy": 0.706, "f1": 0.6842105263157895}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9325, "f1": 0.9326683291770573}, "dna_sim_pair_150bp": {"accuracy": 0.77225, "f1": 0.7369332948310713}, "dna_sim_pair_50bp": {"accuracy": 0.5825, "f1": 0.6840711312902006}, "protein_sim_pair_150bp": {"accuracy": 0.9466666666666667, "f1": 0.9470198675496688}, "protein_sim_pair_450bp": {"accuracy": 0.8538888888888889, "f1": 0.8383527965580824}, "dna_protein_pair": {"accuracy": 0.535, "f1": 0.10576923076923077}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.010582010582010581}, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.018433179723502304}, "dna_protein_pair_rand": {"accuracy": 0.5275, "f1": 0.12296983758700696}, "dna_protein_pair_rand_100": {"accuracy": 0.52875, "f1": 0.0893719806763285}, "dna_protein_pair_rand_full": {"accuracy": 0.5175, "f1": 0.05623471882640587}}
|
| 25 |
+
{"seed": 26, "en": {"accuracy": 0.888, "f1": 0.8827225130890053}, "fr": {"accuracy": 0.8, "f1": 0.8073217726396917}, "de": {"accuracy": 0.7645, "f1": 0.7678659438146871}, "zh": {"accuracy": 0.7145, "f1": 0.7094147582697201}, "dna_sim_pair_simple_150bp": {"accuracy": 0.935, "f1": 0.9311359623307828}, "dna_sim_pair_150bp": {"accuracy": 0.751, "f1": 0.6682211858760826}, "dna_sim_pair_50bp": {"accuracy": 0.7545, "f1": 0.6906112161310649}, "protein_sim_pair_150bp": {"accuracy": 0.9283333333333333, "f1": 0.9308310991957105}, "protein_sim_pair_450bp": {"accuracy": 0.8711111111111111, "f1": 0.8576687116564418}, "dna_protein_pair": {"accuracy": 0.47, "f1": 0.12396694214876033}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.06481481481481481}, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.13023255813953488}, "dna_protein_pair_rand": {"accuracy": 0.5025, "f1": 0.17083333333333334}, "dna_protein_pair_rand_100": {"accuracy": 0.5125, "f1": 0.051094890510948905}, "dna_protein_pair_rand_full": {"accuracy": 0.555625, "f1": 0.2767039674465921}}
|
| 26 |
+
{"seed": 27, "en": {"accuracy": 0.8905, "f1": 0.8807838867719108}, "fr": {"accuracy": 0.7985, "f1": 0.8027410670582477}, "de": {"accuracy": 0.7705, "f1": 0.771072319201995}, "zh": {"accuracy": 0.727, "f1": 0.7039045553145337}, "dna_sim_pair_simple_150bp": {"accuracy": 0.925, "f1": 0.9259462424574877}, "dna_sim_pair_150bp": {"accuracy": 0.7845, "f1": 0.7562217194570136}, "dna_sim_pair_50bp": {"accuracy": 0.6275, "f1": 0.707728520988623}, "protein_sim_pair_150bp": {"accuracy": 0.7683333333333333, "f1": 0.8093278463648834}, "protein_sim_pair_450bp": {"accuracy": 0.8972222222222223, "f1": 0.8988518316019682}, "dna_protein_pair": {"accuracy": 0.5, "f1": 0.12280701754385964}, "dna_protein_pair_100": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.020942408376963352}, "dna_protein_pair_rand": {"accuracy": 0.5325, "f1": 0.20930232558139536}, "dna_protein_pair_rand_100": {"accuracy": 0.52625, "f1": 0.04050632911392405}, "dna_protein_pair_rand_full": {"accuracy": 0.550625, "f1": 0.1764032073310424}}
|
| 27 |
+
{"seed": 28, "en": {"accuracy": 0.8895, "f1": 0.8815013404825738}, "fr": {"accuracy": 0.803, "f1": 0.7947916666666667}, "de": {"accuracy": 0.778, "f1": 0.7675392670157068}, "zh": {"accuracy": 0.7335, "f1": 0.7139023081052066}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9344444444444444, "f1": 0.9334085778781038}, "dna_sim_pair_150bp": {"accuracy": 0.72525, "f1": 0.6650411459920755}, "dna_sim_pair_50bp": {"accuracy": 0.602, "f1": 0.7084249084249085}, "protein_sim_pair_150bp": {"accuracy": 0.9538888888888889, "f1": 0.952050837666089}, "protein_sim_pair_450bp": {"accuracy": 0.8344444444444444, "f1": 0.8054830287206266}, "dna_protein_pair": {"accuracy": 0.4675, "f1": 0.009302325581395349}, "dna_protein_pair_100": {"accuracy": 0.4725, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.493125, "f1": 0.01696969696969697}, "dna_protein_pair_rand_100": {"accuracy": 0.491875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.5025, "f1": 0.005}}
|
| 28 |
+
{"seed": 29, "en": {"accuracy": 0.883, "f1": 0.8769716088328076}, "fr": {"accuracy": 0.791, "f1": 0.7944936086529006}, "de": {"accuracy": 0.755, "f1": 0.7635135135135135}, "zh": {"accuracy": 0.707, "f1": 0.7004089979550102}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9533333333333334, "f1": 0.9537953795379538}, "dna_sim_pair_150bp": {"accuracy": 0.797, "f1": 0.7597633136094675}, "dna_sim_pair_50bp": {"accuracy": 0.6665, "f1": 0.7267513314215486}, "protein_sim_pair_150bp": {"accuracy": 0.9055555555555556, "f1": 0.915506958250497}, "protein_sim_pair_450bp": {"accuracy": 0.81, "f1": 0.773209549071618}, "dna_protein_pair": {"accuracy": 0.54, "f1": 0.1559633027522936}, "dna_protein_pair_100": {"accuracy": 0.545, "f1": 0.031914893617021274}, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.055299539170506916}, "dna_protein_pair_rand": {"accuracy": 0.553125, "f1": 0.2969518190757129}, "dna_protein_pair_rand_100": {"accuracy": 0.516875, "f1": 0.07202881152460984}, "dna_protein_pair_rand_full": {"accuracy": 0.5275, "f1": 0.11267605633802817}}
|
| 29 |
+
{"seed": 30, "en": {"accuracy": 0.8895, "f1": 0.8836229594523434}, "fr": {"accuracy": 0.7805, "f1": 0.7932171455487518}, "de": {"accuracy": 0.757, "f1": 0.7629268292682927}, "zh": {"accuracy": 0.734, "f1": 0.718816067653277}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9386503067484663}, "dna_sim_pair_150bp": {"accuracy": 0.83525, "f1": 0.8192043895747599}, "dna_sim_pair_50bp": {"accuracy": 0.666, "f1": 0.7155025553662692}, "protein_sim_pair_150bp": {"accuracy": 0.8966666666666666, "f1": 0.905295315682281}, "protein_sim_pair_450bp": {"accuracy": 0.9094444444444445, "f1": 0.9139841688654353}, "dna_protein_pair": {"accuracy": 0.4975, "f1": 0.14468085106382977}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.06965174129353234}, "dna_protein_pair_full": {"accuracy": 0.5225, "f1": 0.1511111111111111}, "dna_protein_pair_rand": {"accuracy": 0.53125, "f1": 0.19181034482758622}, "dna_protein_pair_rand_100": {"accuracy": 0.538125, "f1": 0.1515499425947187}, "dna_protein_pair_rand_full": {"accuracy": 0.516875, "f1": 0.1245753114382786}}
|
| 30 |
+
{"seed": 31, "en": {"accuracy": 0.8675, "f1": 0.8637532133676092}, "fr": {"accuracy": 0.755, "f1": 0.7774750227066304}, "de": {"accuracy": 0.748, "f1": 0.7644859813084112}, "zh": {"accuracy": 0.7105, "f1": 0.7230989956958394}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8333333333333334, "f1": 0.8527245949926362}, "dna_sim_pair_150bp": {"accuracy": 0.74375, "f1": 0.7511531925224569}, "dna_sim_pair_50bp": {"accuracy": 0.498, "f1": 0.6624075319435104}, "protein_sim_pair_150bp": {"accuracy": 0.8222222222222222, "f1": 0.8461538461538461}, "protein_sim_pair_450bp": {"accuracy": 0.9288888888888889, "f1": 0.9262672811059908}, "dna_protein_pair": {"accuracy": 0.435, "f1": 0.3651685393258427}, "dna_protein_pair_100": {"accuracy": 0.4575, "f1": 0.1685823754789272}, "dna_protein_pair_full": {"accuracy": 0.3725, "f1": 0.512621359223301}, "dna_protein_pair_rand": {"accuracy": 0.511875, "f1": 0.37269076305220883}, "dna_protein_pair_rand_100": {"accuracy": 0.51375, "f1": 0.15250544662309368}, "dna_protein_pair_rand_full": {"accuracy": 0.464375, "f1": 0.5598356445814073}}
|
| 31 |
+
{"seed": 32, "en": {"accuracy": 0.882, "f1": 0.8747346072186837}, "fr": {"accuracy": 0.7955, "f1": 0.7970223325062035}, "de": {"accuracy": 0.7675, "f1": 0.7635993899339095}, "zh": {"accuracy": 0.708, "f1": 0.7165048543689321}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9505555555555556, "f1": 0.9480443666082895}, "dna_sim_pair_150bp": {"accuracy": 0.75125, "f1": 0.6801671488267438}, "dna_sim_pair_50bp": {"accuracy": 0.787, "f1": 0.7633333333333333}, "protein_sim_pair_150bp": {"accuracy": 0.9661111111111111, "f1": 0.9661674986134221}, "protein_sim_pair_450bp": {"accuracy": 0.9144444444444444, "f1": 0.903387703889586}, "dna_protein_pair": {"accuracy": 0.5025, "f1": 0.019704433497536946}, "dna_protein_pair_100": {"accuracy": 0.46, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.54, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.50875, "f1": 0.02962962962962963}, "dna_protein_pair_rand_100": {"accuracy": 0.496875, "f1": 0.0024783147459727386}, "dna_protein_pair_rand_full": {"accuracy": 0.5, "f1": 0.007444168734491315}}
|
| 32 |
+
{"seed": 33, "en": {"accuracy": 0.87, "f1": 0.8576122672508215}, "fr": {"accuracy": 0.7915, "f1": 0.785824345146379}, "de": {"accuracy": 0.7695, "f1": 0.7385138967668746}, "zh": {"accuracy": 0.718, "f1": 0.7065556711758585}, "dna_sim_pair_simple_150bp": {"accuracy": 0.5802777777777778, "f1": 0.6843534572801337}, "dna_sim_pair_150bp": {"accuracy": 0.515, "f1": 0.6231546231546231}, "dna_sim_pair_50bp": {"accuracy": 0.4905, "f1": 0.6511468675111264}, "protein_sim_pair_150bp": {"accuracy": 0.8583333333333333, "f1": 0.855031267765776}, "protein_sim_pair_450bp": {"accuracy": 0.82, "f1": 0.7931034482758621}, "dna_protein_pair": {"accuracy": 0.58, "f1": 0.288135593220339}, "dna_protein_pair_100": {"accuracy": 0.57, "f1": 0.47878787878787876}, "dna_protein_pair_full": {"accuracy": 0.5275, "f1": 0.1888412017167382}, "dna_protein_pair_rand": {"accuracy": 0.56625, "f1": 0.4403225806451613}, "dna_protein_pair_rand_100": {"accuracy": 0.51, "f1": 0.49872122762148335}, "dna_protein_pair_rand_full": {"accuracy": 0.573125, "f1": 0.3928888888888889}}
|
| 33 |
+
{"seed": 34, "en": {"accuracy": 0.879, "f1": 0.8707264957264957}, "fr": {"accuracy": 0.7825, "f1": 0.7911665866538646}, "de": {"accuracy": 0.765, "f1": 0.7659362549800797}, "zh": {"accuracy": 0.7105, "f1": 0.7023136246786632}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9525, "f1": 0.9524868018894137}, "dna_sim_pair_150bp": {"accuracy": 0.857, "f1": 0.8405797101449275}, "dna_sim_pair_50bp": {"accuracy": 0.749, "f1": 0.7972536348949919}, "protein_sim_pair_150bp": {"accuracy": 0.9072222222222223, "f1": 0.9117802430005283}, "protein_sim_pair_450bp": {"accuracy": 0.8788888888888889, "f1": 0.8716136631330977}, "dna_protein_pair": {"accuracy": 0.555, "f1": 0.03260869565217391}, "dna_protein_pair_100": {"accuracy": 0.525, "f1": 0.010416666666666666}, "dna_protein_pair_full": {"accuracy": 0.435, "f1": 0.02586206896551724}, "dna_protein_pair_rand": {"accuracy": 0.510625, "f1": 0.0416156670746634}, "dna_protein_pair_rand_100": {"accuracy": 0.529375, "f1": 0.0258732212160414}, "dna_protein_pair_rand_full": {"accuracy": 0.528125, "f1": 0.13516609392898052}}
|
| 34 |
+
{"seed": 35, "en": {"accuracy": 0.894, "f1": 0.8823529411764706}, "fr": {"accuracy": 0.811, "f1": 0.8045501551189245}, "de": {"accuracy": 0.777, "f1": 0.7669801462904912}, "zh": {"accuracy": 0.7325, "f1": 0.7032723239046035}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9419444444444445, "f1": 0.9372937293729373}, "dna_sim_pair_150bp": {"accuracy": 0.68575, "f1": 0.5404021937842779}, "dna_sim_pair_50bp": {"accuracy": 0.736, "f1": 0.6413043478260869}, "protein_sim_pair_150bp": {"accuracy": 0.9344444444444444, "f1": 0.929678188319428}, "protein_sim_pair_450bp": {"accuracy": 0.8605555555555555, "f1": 0.8330006653359947}, "dna_protein_pair": {"accuracy": 0.525, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.483125, "f1": 0.0048134777376654635}, "dna_protein_pair_rand_100": {"accuracy": 0.4975, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.495625, "f1": 0.0}}
|
| 35 |
+
{"seed": 36, "en": {"accuracy": 0.8955, "f1": 0.8862275449101796}, "fr": {"accuracy": 0.8045, "f1": 0.7989717223650386}, "de": {"accuracy": 0.7755, "f1": 0.766510660426417}, "zh": {"accuracy": 0.7325, "f1": 0.718272775144813}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9427777777777778, "f1": 0.9418079096045198}, "dna_sim_pair_150bp": {"accuracy": 0.74525, "f1": 0.6788528206744406}, "dna_sim_pair_50bp": {"accuracy": 0.582, "f1": 0.672156862745098}, "protein_sim_pair_150bp": {"accuracy": 0.9377777777777778, "f1": 0.940552016985138}, "protein_sim_pair_450bp": {"accuracy": 0.8783333333333333, "f1": 0.864898210980876}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.010471204188481676}, "dna_protein_pair_100": {"accuracy": 0.5125, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5375, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.503125, "f1": 0.01486988847583643}, "dna_protein_pair_rand_100": {"accuracy": 0.515625, "f1": 0.002574002574002574}, "dna_protein_pair_rand_full": {"accuracy": 0.48875, "f1": 0.0}}
|
| 36 |
+
{"seed": 37, "en": {"accuracy": 0.8795, "f1": 0.8702207862143242}, "fr": {"accuracy": 0.792, "f1": 0.7956777996070727}, "de": {"accuracy": 0.76, "f1": 0.7538461538461538}, "zh": {"accuracy": 0.7235, "f1": 0.7127272727272728}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9097222222222222, "f1": 0.9002149217070924}, "dna_sim_pair_150bp": {"accuracy": 0.65675, "f1": 0.47933257489571485}, "dna_sim_pair_50bp": {"accuracy": 0.758, "f1": 0.7305122494432071}, "protein_sim_pair_150bp": {"accuracy": 0.9716666666666667, "f1": 0.971900826446281}, "protein_sim_pair_450bp": {"accuracy": 0.9605555555555556, "f1": 0.9589358010410642}, "dna_protein_pair": {"accuracy": 0.48, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.54, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.50375, "f1": 0.012437810945273632}, "dna_protein_pair_rand_100": {"accuracy": 0.48125, "f1": 0.002403846153846154}, "dna_protein_pair_rand_full": {"accuracy": 0.4975, "f1": 0.007407407407407408}}
|
| 37 |
+
{"seed": 38, "en": {"accuracy": 0.887, "f1": 0.8825363825363826}, "fr": {"accuracy": 0.779, "f1": 0.790719696969697}, "de": {"accuracy": 0.755, "f1": 0.7574257425742574}, "zh": {"accuracy": 0.7115, "f1": 0.7030365414307771}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9530555555555555, "f1": 0.9527008116428771}, "dna_sim_pair_150bp": {"accuracy": 0.80025, "f1": 0.7631188852653424}, "dna_sim_pair_50bp": {"accuracy": 0.575, "f1": 0.6858832224685883}, "protein_sim_pair_150bp": {"accuracy": 0.8816666666666667, "f1": 0.8913819479857216}, "protein_sim_pair_450bp": {"accuracy": 0.9511111111111111, "f1": 0.9517014270032931}, "dna_protein_pair": {"accuracy": 0.535, "f1": 0.08823529411764706}, "dna_protein_pair_100": {"accuracy": 0.4925, "f1": 0.01932367149758454}, "dna_protein_pair_full": {"accuracy": 0.56, "f1": 0.10204081632653061}, "dna_protein_pair_rand": {"accuracy": 0.531875, "f1": 0.1814207650273224}, "dna_protein_pair_rand_100": {"accuracy": 0.505625, "f1": 0.08342989571263036}, "dna_protein_pair_rand_full": {"accuracy": 0.525, "f1": 0.16483516483516483}}
|
| 38 |
+
{"seed": 40, "en": {"accuracy": 0.895, "f1": 0.8884165781083954}, "fr": {"accuracy": 0.804, "f1": 0.8082191780821918}, "de": {"accuracy": 0.7735, "f1": 0.7742899850523169}, "zh": {"accuracy": 0.7045, "f1": 0.7055306427503737}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9422222222222222, "f1": 0.9411764705882353}, "dna_sim_pair_150bp": {"accuracy": 0.80025, "f1": 0.761989871909443}, "dna_sim_pair_50bp": {"accuracy": 0.6735, "f1": 0.6666666666666666}, "protein_sim_pair_150bp": {"accuracy": 0.975, "f1": 0.9745618993781797}, "protein_sim_pair_450bp": {"accuracy": 0.9477777777777778, "f1": 0.9439809296781884}, "dna_protein_pair": {"accuracy": 0.525, "f1": 0.020618556701030927}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.518125, "f1": 0.007722007722007722}, "dna_protein_pair_rand_100": {"accuracy": 0.49625, "f1": 0.0024752475247524753}, "dna_protein_pair_rand_full": {"accuracy": 0.489375, "f1": 0.0}}
|
| 39 |
+
{"seed": 41, "en": {"accuracy": 0.8945, "f1": 0.8893550078657577}, "fr": {"accuracy": 0.7835, "f1": 0.7931199235547062}, "de": {"accuracy": 0.7635, "f1": 0.7645594823295172}, "zh": {"accuracy": 0.711, "f1": 0.7026748971193416}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9358333333333333, "f1": 0.930776146239137}, "dna_sim_pair_150bp": {"accuracy": 0.70325, "f1": 0.5750089509488006}, "dna_sim_pair_50bp": {"accuracy": 0.825, "f1": 0.8099891422366993}, "protein_sim_pair_150bp": {"accuracy": 0.935, "f1": 0.9323308270676691}, "protein_sim_pair_450bp": {"accuracy": 0.8722222222222222, "f1": 0.8587223587223587}, "dna_protein_pair": {"accuracy": 0.4575, "f1": 0.0091324200913242}, "dna_protein_pair_100": {"accuracy": 0.5225, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5375, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.50625, "f1": 0.0025252525252525255}, "dna_protein_pair_rand_100": {"accuracy": 0.51875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.5075, "f1": 0.0}}
|
| 40 |
+
{"seed": 42, "en": {"accuracy": 0.8865, "f1": 0.8777598276790523}, "fr": {"accuracy": 0.7995, "f1": 0.7946748591909882}, "de": {"accuracy": 0.773, "f1": 0.7686034658511722}, "zh": {"accuracy": 0.717, "f1": 0.6933911159263272}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9583333333333334, "f1": 0.9569460390355913}, "dna_sim_pair_150bp": {"accuracy": 0.81025, "f1": 0.7633302151543498}, "dna_sim_pair_50bp": {"accuracy": 0.828, "f1": 0.843351548269581}, "protein_sim_pair_150bp": {"accuracy": 0.9772222222222222, "f1": 0.9770821688093907}, "protein_sim_pair_450bp": {"accuracy": 0.885, "f1": 0.8726153846153846}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.020942408376963352}, "dna_protein_pair_100": {"accuracy": 0.48, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.51625, "f1": 0.034912718204488775}, "dna_protein_pair_rand_100": {"accuracy": 0.50625, "f1": 0.0025252525252525255}, "dna_protein_pair_rand_full": {"accuracy": 0.508125, "f1": 0.0050568900126422255}}
|
| 41 |
+
{"seed": 43, "en": {"accuracy": 0.8895, "f1": 0.8826340945300053}, "fr": {"accuracy": 0.7975, "f1": 0.8013732221677293}, "de": {"accuracy": 0.769, "f1": 0.7694610778443114}, "zh": {"accuracy": 0.7145, "f1": 0.7024491922876498}, "dna_sim_pair_simple_150bp": {"accuracy": 0.945, "f1": 0.9437819420783645}, "dna_sim_pair_150bp": {"accuracy": 0.7815, "f1": 0.7125}, "dna_sim_pair_50bp": {"accuracy": 0.8105, "f1": 0.7761370348493798}, "protein_sim_pair_150bp": {"accuracy": 0.9561111111111111, "f1": 0.9566648381788261}, "protein_sim_pair_450bp": {"accuracy": 0.9411111111111111, "f1": 0.9394977168949772}, "dna_protein_pair": {"accuracy": 0.5025, "f1": 0.019704433497536946}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.02}, "dna_protein_pair_rand": {"accuracy": 0.5, "f1": 0.02912621359223301}, "dna_protein_pair_rand_100": {"accuracy": 0.495625, "f1": 0.007380073800738007}, "dna_protein_pair_rand_full": {"accuracy": 0.51625, "f1": 0.11238532110091744}}
|
| 42 |
+
{"seed": 44, "en": {"accuracy": 0.89, "f1": 0.8822269807280514}, "fr": {"accuracy": 0.7965, "f1": 0.8}, "de": {"accuracy": 0.7715, "f1": 0.7669556348801632}, "zh": {"accuracy": 0.7265, "f1": 0.7266366816591704}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9227777777777778, "f1": 0.9227777777777778}, "dna_sim_pair_150bp": {"accuracy": 0.7145, "f1": 0.6383787207093097}, "dna_sim_pair_50bp": {"accuracy": 0.583, "f1": 0.6669329073482428}, "protein_sim_pair_150bp": {"accuracy": 0.895, "f1": 0.9009952854897852}, "protein_sim_pair_450bp": {"accuracy": 0.8855555555555555, "f1": 0.8762019230769231}, "dna_protein_pair": {"accuracy": 0.55, "f1": 0.0425531914893617}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.0380952380952381}, "dna_protein_pair_rand": {"accuracy": 0.52, "f1": 0.03759398496240601}, "dna_protein_pair_rand_100": {"accuracy": 0.501875, "f1": 0.02447980416156671}, "dna_protein_pair_rand_full": {"accuracy": 0.530625, "f1": 0.18102508178844057}}
|
| 43 |
+
{"seed": 46, "en": {"accuracy": 0.881, "f1": 0.8717672413793104}, "fr": {"accuracy": 0.799, "f1": 0.7981927710843374}, "de": {"accuracy": 0.7675, "f1": 0.7606793618116315}, "zh": {"accuracy": 0.719, "f1": 0.6938997821350763}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9386111111111111, "f1": 0.9387981168651343}, "dna_sim_pair_150bp": {"accuracy": 0.84275, "f1": 0.8282828282828283}, "dna_sim_pair_50bp": {"accuracy": 0.669, "f1": 0.7328490718321227}, "protein_sim_pair_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9405405405405406}, "protein_sim_pair_450bp": {"accuracy": 0.9205555555555556, "f1": 0.9228278467350243}, "dna_protein_pair": {"accuracy": 0.4975, "f1": 0.04739336492890995}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.06030150753768844}, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.08571428571428572}, "dna_protein_pair_rand": {"accuracy": 0.5, "f1": 0.0888382687927107}, "dna_protein_pair_rand_100": {"accuracy": 0.5175, "f1": 0.10440835266821345}, "dna_protein_pair_rand_full": {"accuracy": 0.531875, "f1": 0.1380897583429229}}
|
| 44 |
+
{"seed": 47, "en": {"accuracy": 0.834, "f1": 0.8224598930481284}, "fr": {"accuracy": 0.7635, "f1": 0.7689301416707377}, "de": {"accuracy": 0.749, "f1": 0.7507447864945382}, "zh": {"accuracy": 0.6865, "f1": 0.7041057102406796}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7297222222222223, "f1": 0.7819852117409815}, "dna_sim_pair_150bp": {"accuracy": 0.65575, "f1": 0.7032967032967034}, "dna_sim_pair_50bp": {"accuracy": 0.4865, "f1": 0.6524534686971235}, "protein_sim_pair_150bp": {"accuracy": 0.5927777777777777, "f1": 0.716441005802708}, "protein_sim_pair_450bp": {"accuracy": 0.7344444444444445, "f1": 0.7864164432529044}, "dna_protein_pair": {"accuracy": 0.4925, "f1": 0.3867069486404834}, "dna_protein_pair_100": {"accuracy": 0.49, "f1": 0.08108108108108109}, "dna_protein_pair_full": {"accuracy": 0.4025, "f1": 0.37597911227154046}, "dna_protein_pair_rand": {"accuracy": 0.59375, "f1": 0.5015337423312883}, "dna_protein_pair_rand_100": {"accuracy": 0.536875, "f1": 0.21752903907074975}, "dna_protein_pair_rand_full": {"accuracy": 0.611875, "f1": 0.5806887238352465}}
|
| 45 |
+
{"seed": 48, "en": {"accuracy": 0.8855, "f1": 0.8785145888594165}, "fr": {"accuracy": 0.8, "f1": 0.8054474708171206}, "de": {"accuracy": 0.7585, "f1": 0.7509025270758123}, "zh": {"accuracy": 0.7235, "f1": 0.6939679026009962}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8538888888888889, "f1": 0.8681043129388164}, "dna_sim_pair_150bp": {"accuracy": 0.76, "f1": 0.7650513950073421}, "dna_sim_pair_50bp": {"accuracy": 0.4805, "f1": 0.6386086956521739}, "protein_sim_pair_150bp": {"accuracy": 0.9316666666666666, "f1": 0.9336211548839719}, "protein_sim_pair_450bp": {"accuracy": 0.8783333333333333, "f1": 0.8667072428484479}, "dna_protein_pair": {"accuracy": 0.495, "f1": 0.11403508771929824}, "dna_protein_pair_100": {"accuracy": 0.485, "f1": 0.009615384615384616}, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.009708737864077669}, "dna_protein_pair_rand": {"accuracy": 0.534375, "f1": 0.15819209039548024}, "dna_protein_pair_rand_100": {"accuracy": 0.475, "f1": 0.011764705882352941}, "dna_protein_pair_rand_full": {"accuracy": 0.5125, "f1": 0.007633587786259542}}
|
| 46 |
+
{"seed": 49, "en": {"accuracy": 0.8725, "f1": 0.8665620094191523}, "fr": {"accuracy": 0.7945, "f1": 0.7984306032368809}, "de": {"accuracy": 0.757, "f1": 0.7633885102239533}, "zh": {"accuracy": 0.709, "f1": 0.7133004926108374}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9344444444444444, "f1": 0.9349503858875413}, "dna_sim_pair_150bp": {"accuracy": 0.761, "f1": 0.7193188490898414}, "dna_sim_pair_50bp": {"accuracy": 0.5405, "f1": 0.6866689396522332}, "protein_sim_pair_150bp": {"accuracy": 0.8266666666666667, "f1": 0.8469087340529932}, "protein_sim_pair_450bp": {"accuracy": 0.9038888888888889, "f1": 0.904367053620785}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.11711711711711711}, "dna_protein_pair_100": {"accuracy": 0.5225, "f1": 0.059113300492610835}, "dna_protein_pair_full": {"accuracy": 0.415, "f1": 0.39690721649484534}, "dna_protein_pair_rand": {"accuracy": 0.516875, "f1": 0.14773980154355015}, "dna_protein_pair_rand_100": {"accuracy": 0.518125, "f1": 0.089728453364817}, "dna_protein_pair_rand_full": {"accuracy": 0.594375, "f1": 0.5647216633132126}}
|
| 47 |
+
{"seed": 50, "en": {"accuracy": 0.8835, "f1": 0.8739859383450513}, "fr": {"accuracy": 0.8145, "f1": 0.8086642599277978}, "de": {"accuracy": 0.7875, "f1": 0.7703943814154511}, "zh": {"accuracy": 0.721, "f1": 0.6807780320366132}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9288888888888889, "f1": 0.9247943595769683}, "dna_sim_pair_150bp": {"accuracy": 0.643, "f1": 0.4408770555990603}, "dna_sim_pair_50bp": {"accuracy": 0.601, "f1": 0.6329346826126955}, "protein_sim_pair_150bp": {"accuracy": 0.925, "f1": 0.9175320708613317}, "protein_sim_pair_450bp": {"accuracy": 0.8094444444444444, "f1": 0.7687120701281187}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_rand_100": {"accuracy": 0.509375, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.509375, "f1": 0.0025412960609911056}}
|
| 48 |
+
{"seed": 51, "en": {"accuracy": 0.8515, "f1": 0.837793555434189}, "fr": {"accuracy": 0.787, "f1": 0.780638516992791}, "de": {"accuracy": 0.7605, "f1": 0.7503908285565398}, "zh": {"accuracy": 0.7315, "f1": 0.6904899135446686}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9180555555555555, "f1": 0.9096477794793262}, "dna_sim_pair_150bp": {"accuracy": 0.71175, "f1": 0.5947275922671353}, "dna_sim_pair_50bp": {"accuracy": 0.575, "f1": 0.5350109409190372}, "protein_sim_pair_150bp": {"accuracy": 0.9122222222222223, "f1": 0.9035409035409036}, "protein_sim_pair_450bp": {"accuracy": 0.9566666666666667, "f1": 0.9544924154025671}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.505, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.425, "f1": 0.29878048780487804}, "dna_protein_pair_rand": {"accuracy": 0.50875, "f1": 0.0025380710659898475}, "dna_protein_pair_rand_100": {"accuracy": 0.499375, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.569375, "f1": 0.40034812880765885}}
|
| 49 |
+
{"seed": 52, "en": {"accuracy": 0.8845, "f1": 0.8798751950078003}, "fr": {"accuracy": 0.7985, "f1": 0.802547770700637}, "de": {"accuracy": 0.767, "f1": 0.7761767531219981}, "zh": {"accuracy": 0.7185, "f1": 0.7087428867046043}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8886111111111111, "f1": 0.898455305140542}, "dna_sim_pair_150bp": {"accuracy": 0.817, "f1": 0.8174563591022443}, "dna_sim_pair_50bp": {"accuracy": 0.6125, "f1": 0.689875950380152}, "protein_sim_pair_150bp": {"accuracy": 0.6583333333333333, "f1": 0.7453416149068323}, "protein_sim_pair_450bp": {"accuracy": 0.9066666666666666, "f1": 0.9127725856697819}, "dna_protein_pair": {"accuracy": 0.5125, "f1": 0.2471042471042471}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.11814345991561181}, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.4053333333333333}, "dna_protein_pair_rand": {"accuracy": 0.55875, "f1": 0.36510791366906475}, "dna_protein_pair_rand_100": {"accuracy": 0.535, "f1": 0.25301204819277107}, "dna_protein_pair_rand_full": {"accuracy": 0.66625, "f1": 0.6817640047675805}}
|
| 50 |
+
{"seed": 53, "en": {"accuracy": 0.871, "f1": 0.8679631525076765}, "fr": {"accuracy": 0.7545, "f1": 0.7754915409236397}, "de": {"accuracy": 0.727, "f1": 0.7524932003626473}, "zh": {"accuracy": 0.638, "f1": 0.6957983193277311}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7597222222222222, "f1": 0.8027366020524516}, "dna_sim_pair_150bp": {"accuracy": 0.6675, "f1": 0.7074351077870655}, "dna_sim_pair_50bp": {"accuracy": 0.5065, "f1": 0.6680121089808274}, "protein_sim_pair_150bp": {"accuracy": 0.8994444444444445, "f1": 0.9042834479111581}, "protein_sim_pair_450bp": {"accuracy": 0.925, "f1": 0.9220103986135182}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.14107883817427386}, "dna_protein_pair_100": {"accuracy": 0.545, "f1": 0.031914893617021274}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.541875, "f1": 0.22597676874340022}, "dna_protein_pair_rand_100": {"accuracy": 0.480625, "f1": 0.02120141342756184}, "dna_protein_pair_rand_full": {"accuracy": 0.505, "f1": 0.007518796992481203}}
|
| 51 |
+
{"seed": 54, "en": {"accuracy": 0.88, "f1": 0.8740818467995802}, "fr": {"accuracy": 0.767, "f1": 0.7803958529688972}, "de": {"accuracy": 0.761, "f1": 0.767056530214425}, "zh": {"accuracy": 0.694, "f1": 0.7054860442733397}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9063888888888889, "f1": 0.905892208880201}, "dna_sim_pair_150bp": {"accuracy": 0.7835, "f1": 0.7525714285714286}, "dna_sim_pair_50bp": {"accuracy": 0.5625, "f1": 0.6873883529832083}, "protein_sim_pair_150bp": {"accuracy": 0.98, "f1": 0.9793577981651376}, "protein_sim_pair_450bp": {"accuracy": 0.9127777777777778, "f1": 0.9051359516616314}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.04060913705583756}, "dna_protein_pair_100": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.53375, "f1": 0.09466019417475728}, "dna_protein_pair_rand_100": {"accuracy": 0.51, "f1": 0.02}, "dna_protein_pair_rand_full": {"accuracy": 0.490625, "f1": 0.004884004884004884}}
|
| 52 |
+
{"seed": 55, "en": {"accuracy": 0.8785, "f1": 0.867574931880109}, "fr": {"accuracy": 0.8015, "f1": 0.7969309462915601}, "de": {"accuracy": 0.761, "f1": 0.7536082474226804}, "zh": {"accuracy": 0.7275, "f1": 0.7016967706622879}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9163888888888889, "f1": 0.9167358229598893}, "dna_sim_pair_150bp": {"accuracy": 0.77325, "f1": 0.7457246986262966}, "dna_sim_pair_50bp": {"accuracy": 0.692, "f1": 0.7192342752962625}, "protein_sim_pair_150bp": {"accuracy": 0.8861111111111111, "f1": 0.8881614839061648}, "protein_sim_pair_450bp": {"accuracy": 0.8755555555555555, "f1": 0.8761061946902655}, "dna_protein_pair": {"accuracy": 0.505, "f1": 0.16101694915254236}, "dna_protein_pair_100": {"accuracy": 0.4625, "f1": 0.009216589861751152}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.028708133971291867}, "dna_protein_pair_rand": {"accuracy": 0.524375, "f1": 0.18435155412647375}, "dna_protein_pair_rand_100": {"accuracy": 0.511875, "f1": 0.044063647490820076}, "dna_protein_pair_rand_full": {"accuracy": 0.5475, "f1": 0.2505175983436853}}
|
| 53 |
+
{"seed": 56, "en": {"accuracy": 0.8905, "f1": 0.8836962294211365}, "fr": {"accuracy": 0.7965, "f1": 0.803666184273999}, "de": {"accuracy": 0.763, "f1": 0.76441351888668}, "zh": {"accuracy": 0.716, "f1": 0.7072164948453609}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9258333333333333, "f1": 0.928129205921938}, "dna_sim_pair_150bp": {"accuracy": 0.8035, "f1": 0.7763232783153102}, "dna_sim_pair_50bp": {"accuracy": 0.5485, "f1": 0.6859130434782609}, "protein_sim_pair_150bp": {"accuracy": 0.9416666666666667, "f1": 0.9421487603305785}, "protein_sim_pair_450bp": {"accuracy": 0.9088888888888889, "f1": 0.9021479713603818}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.06666666666666667}, "dna_protein_pair_100": {"accuracy": 0.4525, "f1": 0.00904977375565611}, "dna_protein_pair_full": {"accuracy": 0.5375, "f1": 0.04145077720207254}, "dna_protein_pair_rand": {"accuracy": 0.498125, "f1": 0.09470124013528748}, "dna_protein_pair_rand_100": {"accuracy": 0.516875, "f1": 0.022756005056890013}, "dna_protein_pair_rand_full": {"accuracy": 0.498125, "f1": 0.04290822407628129}}
|
| 54 |
+
{"seed": 57, "en": {"accuracy": 0.8785, "f1": 0.8662630709961475}, "fr": {"accuracy": 0.809, "f1": 0.8012486992715921}, "de": {"accuracy": 0.762, "f1": 0.7492096944151738}, "zh": {"accuracy": 0.744, "f1": 0.716500553709856}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9330555555555555, "f1": 0.9331484049930652}, "dna_sim_pair_150bp": {"accuracy": 0.72675, "f1": 0.6589703588143526}, "dna_sim_pair_50bp": {"accuracy": 0.495, "f1": 0.5483005366726297}, "protein_sim_pair_150bp": {"accuracy": 0.9361111111111111, "f1": 0.931178934769599}, "protein_sim_pair_450bp": {"accuracy": 0.9422222222222222, "f1": 0.9388954171562868}, "dna_protein_pair": {"accuracy": 0.5325, "f1": 0.010582010582010581}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.50875, "f1": 0.0199501246882793}, "dna_protein_pair_rand_100": {"accuracy": 0.4975, "f1": 0.007407407407407408}, "dna_protein_pair_rand_full": {"accuracy": 0.504375, "f1": 0.0}}
|
| 55 |
+
{"seed": 58, "en": {"accuracy": 0.884, "f1": 0.8744588744588745}, "fr": {"accuracy": 0.7825, "f1": 0.7935453251067869}, "de": {"accuracy": 0.775, "f1": 0.7661122661122661}, "zh": {"accuracy": 0.713, "f1": 0.6985294117647058}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9380555555555555, "f1": 0.9378657007522987}, "dna_sim_pair_150bp": {"accuracy": 0.763, "f1": 0.7219941348973608}, "dna_sim_pair_50bp": {"accuracy": 0.534, "f1": 0.6783988957902002}, "protein_sim_pair_150bp": {"accuracy": 0.8894444444444445, "f1": 0.8958660387231816}, "protein_sim_pair_450bp": {"accuracy": 0.9477777777777778, "f1": 0.948180815876516}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.10185185185185185}, "dna_protein_pair_100": {"accuracy": 0.5125, "f1": 0.03940886699507389}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.057692307692307696}, "dna_protein_pair_rand": {"accuracy": 0.50625, "f1": 0.1649048625792812}, "dna_protein_pair_rand_100": {"accuracy": 0.503125, "f1": 0.03636363636363636}, "dna_protein_pair_rand_full": {"accuracy": 0.524375, "f1": 0.14205186020293123}}
|
| 56 |
+
{"seed": 59, "en": {"accuracy": 0.885, "f1": 0.8783068783068783}, "fr": {"accuracy": 0.771, "f1": 0.7829383886255924}, "de": {"accuracy": 0.75, "f1": 0.7591522157996147}, "zh": {"accuracy": 0.7105, "f1": 0.7050433010697912}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8911111111111111, "f1": 0.8955780500799148}, "dna_sim_pair_150bp": {"accuracy": 0.773, "f1": 0.7527233115468409}, "dna_sim_pair_50bp": {"accuracy": 0.572, "f1": 0.666406858924396}, "protein_sim_pair_150bp": {"accuracy": 0.9172222222222223, "f1": 0.9148084619782733}, "protein_sim_pair_450bp": {"accuracy": 0.9116666666666666, "f1": 0.9073966220151427}, "dna_protein_pair": {"accuracy": 0.4825, "f1": 0.06334841628959276}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.010101010101010102}, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.1}, "dna_protein_pair_rand": {"accuracy": 0.501875, "f1": 0.06783625730994151}, "dna_protein_pair_rand_100": {"accuracy": 0.489375, "f1": 0.01684717208182912}, "dna_protein_pair_rand_full": {"accuracy": 0.525, "f1": 0.20168067226890757}}
|
| 57 |
+
{"seed": 60, "en": {"accuracy": 0.8575, "f1": 0.8534704370179949}, "fr": {"accuracy": 0.7545, "f1": 0.7732101616628175}, "de": {"accuracy": 0.7335, "f1": 0.7487034417727487}, "zh": {"accuracy": 0.683, "f1": 0.7067530064754857}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8894444444444445, "f1": 0.8941489361702127}, "dna_sim_pair_150bp": {"accuracy": 0.71375, "f1": 0.6800782341436156}, "dna_sim_pair_50bp": {"accuracy": 0.593, "f1": 0.7147862648913805}, "protein_sim_pair_150bp": {"accuracy": 0.9288888888888889, "f1": 0.9298245614035088}, "protein_sim_pair_450bp": {"accuracy": 0.9444444444444444, "f1": 0.943630214205186}, "dna_protein_pair": {"accuracy": 0.5275, "f1": 0.25882352941176473}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.019138755980861243}, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.019417475728155338}, "dna_protein_pair_rand": {"accuracy": 0.5175, "f1": 0.22954091816367264}, "dna_protein_pair_rand_100": {"accuracy": 0.490625, "f1": 0.06857142857142857}, "dna_protein_pair_rand_full": {"accuracy": 0.519375, "f1": 0.04234122042341221}}
|
| 58 |
+
{"seed": 63, "en": {"accuracy": 0.8895, "f1": 0.8845953002610966}, "fr": {"accuracy": 0.813, "f1": 0.8137450199203188}, "de": {"accuracy": 0.767, "f1": 0.77179236043095}, "zh": {"accuracy": 0.717, "f1": 0.7088477366255144}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9436111111111111, "f1": 0.9424113475177305}, "dna_sim_pair_150bp": {"accuracy": 0.751, "f1": 0.6710700132100397}, "dna_sim_pair_50bp": {"accuracy": 0.76, "f1": 0.7266514806378133}, "protein_sim_pair_150bp": {"accuracy": 0.9855555555555555, "f1": 0.9859002169197397}, "protein_sim_pair_450bp": {"accuracy": 0.9572222222222222, "f1": 0.9544108940201302}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.45, "f1": 0.043478260869565216}, "dna_protein_pair_rand": {"accuracy": 0.494375, "f1": 0.01701093560145808}, "dna_protein_pair_rand_100": {"accuracy": 0.503125, "f1": 0.02692778457772338}, "dna_protein_pair_rand_full": {"accuracy": 0.50625, "f1": 0.1595744680851064}}
|
| 59 |
+
{"seed": 64, "en": {"accuracy": 0.884, "f1": 0.8755364806866953}, "fr": {"accuracy": 0.7845, "f1": 0.7904715605250364}, "de": {"accuracy": 0.7595, "f1": 0.76340383669454}, "zh": {"accuracy": 0.693, "f1": 0.7111947318908749}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9211111111111111, "f1": 0.915826911677534}, "dna_sim_pair_150bp": {"accuracy": 0.7215, "f1": 0.6210884353741497}, "dna_sim_pair_50bp": {"accuracy": 0.683, "f1": 0.7174688057040999}, "protein_sim_pair_150bp": {"accuracy": 0.9, "f1": 0.9024918743228603}, "protein_sim_pair_450bp": {"accuracy": 0.9038888888888889, "f1": 0.8982951205173427}, "dna_protein_pair": {"accuracy": 0.4575, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.495, "f1": 0.00980392156862745}, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.208}, "dna_protein_pair_rand": {"accuracy": 0.486875, "f1": 0.03976608187134503}, "dna_protein_pair_rand_100": {"accuracy": 0.506875, "f1": 0.027127003699136867}, "dna_protein_pair_rand_full": {"accuracy": 0.566875, "f1": 0.34560906515580736}}
|
| 60 |
+
{"seed": 65, "en": {"accuracy": 0.875, "f1": 0.8697916666666666}, "fr": {"accuracy": 0.7785, "f1": 0.7850557981562348}, "de": {"accuracy": 0.762, "f1": 0.7650542941757157}, "zh": {"accuracy": 0.7245, "f1": 0.6990715456034954}, "dna_sim_pair_simple_150bp": {"accuracy": 0.95, "f1": 0.9495515695067265}, "dna_sim_pair_150bp": {"accuracy": 0.7825, "f1": 0.7284644194756554}, "dna_sim_pair_50bp": {"accuracy": 0.642, "f1": 0.6809269162210339}, "protein_sim_pair_150bp": {"accuracy": 0.9188888888888889, "f1": 0.9248197734294542}, "protein_sim_pair_450bp": {"accuracy": 0.9422222222222222, "f1": 0.9405714285714286}, "dna_protein_pair": {"accuracy": 0.47, "f1": 0.04504504504504504}, "dna_protein_pair_100": {"accuracy": 0.525, "f1": 0.010416666666666666}, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.2440677966101695}, "dna_protein_pair_rand": {"accuracy": 0.521875, "f1": 0.17118093174431204}, "dna_protein_pair_rand_100": {"accuracy": 0.51625, "f1": 0.046798029556650245}, "dna_protein_pair_rand_full": {"accuracy": 0.491875, "f1": 0.25753424657534246}}
|
| 61 |
+
{"seed": 66, "en": {"accuracy": 0.875, "f1": 0.8700623700623701}, "fr": {"accuracy": 0.7775, "f1": 0.789598108747045}, "de": {"accuracy": 0.762, "f1": 0.772683858643744}, "zh": {"accuracy": 0.69, "f1": 0.7024952015355086}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9405555555555556, "f1": 0.9398200224971879}, "dna_sim_pair_150bp": {"accuracy": 0.744, "f1": 0.6895087932080048}, "dna_sim_pair_50bp": {"accuracy": 0.717, "f1": 0.7647547797173733}, "protein_sim_pair_150bp": {"accuracy": 0.96, "f1": 0.9600443951165372}, "protein_sim_pair_450bp": {"accuracy": 0.8788888888888889, "f1": 0.8634085213032582}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.10526315789473684}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.08071748878923767}, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.33774834437086093}, "dna_protein_pair_rand": {"accuracy": 0.5025, "f1": 0.14038876889848811}, "dna_protein_pair_rand_100": {"accuracy": 0.47375, "f1": 0.09267241379310345}, "dna_protein_pair_rand_full": {"accuracy": 0.47625, "f1": 0.2049335863377609}}
|
| 62 |
+
{"seed": 67, "en": {"accuracy": 0.8685, "f1": 0.8616517622304051}, "fr": {"accuracy": 0.7935, "f1": 0.7908860759493671}, "de": {"accuracy": 0.753, "f1": 0.753}, "zh": {"accuracy": 0.695, "f1": 0.6894093686354379}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8944444444444445, "f1": 0.90041928721174}, "dna_sim_pair_150bp": {"accuracy": 0.80025, "f1": 0.7966403665054721}, "dna_sim_pair_50bp": {"accuracy": 0.493, "f1": 0.6558044806517311}, "protein_sim_pair_150bp": {"accuracy": 0.9533333333333334, "f1": 0.9538461538461539}, "protein_sim_pair_450bp": {"accuracy": 0.955, "f1": 0.9527696793002915}, "dna_protein_pair": {"accuracy": 0.495, "f1": 0.10619469026548672}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.05429864253393665}, "dna_protein_pair_full": {"accuracy": 0.4625, "f1": 0.24028268551236748}, "dna_protein_pair_rand": {"accuracy": 0.5275, "f1": 0.17647058823529413}, "dna_protein_pair_rand_100": {"accuracy": 0.525, "f1": 0.11214953271028037}, "dna_protein_pair_rand_full": {"accuracy": 0.61125, "f1": 0.45818815331010454}}
|
| 63 |
+
{"seed": 68, "en": {"accuracy": 0.9045, "f1": 0.8957992362247681}, "fr": {"accuracy": 0.8145, "f1": 0.8070722828913156}, "de": {"accuracy": 0.7795, "f1": 0.7556786703601108}, "zh": {"accuracy": 0.729, "f1": 0.7057546145494028}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9486111111111111, "f1": 0.9454116258483328}, "dna_sim_pair_150bp": {"accuracy": 0.76025, "f1": 0.6869082598759386}, "dna_sim_pair_50bp": {"accuracy": 0.7865, "f1": 0.7423053711526856}, "protein_sim_pair_150bp": {"accuracy": 0.9677777777777777, "f1": 0.9662790697674418}, "protein_sim_pair_450bp": {"accuracy": 0.9522222222222222, "f1": 0.9514124293785311}, "dna_protein_pair": {"accuracy": 0.4975, "f1": 0.009852216748768473}, "dna_protein_pair_100": {"accuracy": 0.515, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.496875, "f1": 0.0024783147459727386}, "dna_protein_pair_rand_100": {"accuracy": 0.510625, "f1": 0.005082592121982211}, "dna_protein_pair_rand_full": {"accuracy": 0.513125, "f1": 0.002560819462227913}}
|
| 64 |
+
{"seed": 69, "en": {"accuracy": 0.883, "f1": 0.8728260869565218}, "fr": {"accuracy": 0.783, "f1": 0.783433133732535}, "de": {"accuracy": 0.763, "f1": 0.7569230769230769}, "zh": {"accuracy": 0.7285, "f1": 0.6998341625207297}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8816666666666667, "f1": 0.8869426751592356}, "dna_sim_pair_150bp": {"accuracy": 0.782, "f1": 0.7826520438683948}, "dna_sim_pair_50bp": {"accuracy": 0.4945, "f1": 0.6039952996474736}, "protein_sim_pair_150bp": {"accuracy": 0.8827777777777778, "f1": 0.8888888888888888}, "protein_sim_pair_450bp": {"accuracy": 0.8127777777777778, "f1": 0.8303975842979366}, "dna_protein_pair": {"accuracy": 0.48, "f1": 0.028037383177570093}, "dna_protein_pair_100": {"accuracy": 0.5325, "f1": 0.06030150753768844}, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.20242914979757085}, "dna_protein_pair_rand": {"accuracy": 0.5125, "f1": 0.0625}, "dna_protein_pair_rand_100": {"accuracy": 0.5725, "f1": 0.24168514412416853}, "dna_protein_pair_rand_full": {"accuracy": 0.57, "f1": 0.3497164461247637}}
|
| 65 |
+
{"seed": 70, "en": {"accuracy": 0.8975, "f1": 0.8877941981390257}, "fr": {"accuracy": 0.8075, "f1": 0.8022598870056498}, "de": {"accuracy": 0.7795, "f1": 0.7534935718278368}, "zh": {"accuracy": 0.7145, "f1": 0.6790331646992692}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9011111111111111, "f1": 0.8921865536038764}, "dna_sim_pair_150bp": {"accuracy": 0.59625, "f1": 0.3290402991275447}, "dna_sim_pair_50bp": {"accuracy": 0.5805, "f1": 0.44620462046204623}, "protein_sim_pair_150bp": {"accuracy": 0.8294444444444444, "f1": 0.8070395977372722}, "protein_sim_pair_450bp": {"accuracy": 0.73, "f1": 0.6261538461538462}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.01020408163265306}, "dna_protein_pair_100": {"accuracy": 0.445, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.01015228426395939}, "dna_protein_pair_rand": {"accuracy": 0.491875, "f1": 0.00245398773006135}, "dna_protein_pair_rand_100": {"accuracy": 0.493125, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.528125, "f1": 0.03821656050955414}}
|
| 66 |
+
{"seed": 73, "en": {"accuracy": 0.8935, "f1": 0.8875989445910291}, "fr": {"accuracy": 0.7875, "f1": 0.7933884297520661}, "de": {"accuracy": 0.766, "f1": 0.7636363636363637}, "zh": {"accuracy": 0.706, "f1": 0.7074626865671642}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9566666666666667, "f1": 0.9558073654390935}, "dna_sim_pair_150bp": {"accuracy": 0.8345, "f1": 0.8091118800461361}, "dna_sim_pair_50bp": {"accuracy": 0.6435, "f1": 0.7267152165580683}, "protein_sim_pair_150bp": {"accuracy": 0.9361111111111111, "f1": 0.9386666666666666}, "protein_sim_pair_450bp": {"accuracy": 0.915, "f1": 0.9094138543516874}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.029556650246305417}, "dna_protein_pair_100": {"accuracy": 0.4825, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.05714285714285714}, "dna_protein_pair_rand": {"accuracy": 0.511875, "f1": 0.048721071863580996}, "dna_protein_pair_rand_100": {"accuracy": 0.496875, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.561875, "f1": 0.28976697061803447}}
|
| 67 |
+
{"seed": 75, "en": {"accuracy": 0.8905, "f1": 0.8797364085667215}, "fr": {"accuracy": 0.82, "f1": 0.8119122257053292}, "de": {"accuracy": 0.7825, "f1": 0.768}, "zh": {"accuracy": 0.7245, "f1": 0.6802089378990134}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9475, "f1": 0.945010183299389}, "dna_sim_pair_150bp": {"accuracy": 0.72675, "f1": 0.6232333678042055}, "dna_sim_pair_50bp": {"accuracy": 0.7485, "f1": 0.6838466373350094}, "protein_sim_pair_150bp": {"accuracy": 0.9327777777777778, "f1": 0.9301788805539527}, "protein_sim_pair_450bp": {"accuracy": 0.775, "f1": 0.7024246877296105}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.01020408163265306}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.009478672985781991}, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.010050251256281407}, "dna_protein_pair_rand": {"accuracy": 0.513125, "f1": 0.010165184243964422}, "dna_protein_pair_rand_100": {"accuracy": 0.503125, "f1": 0.002509410288582183}, "dna_protein_pair_rand_full": {"accuracy": 0.495625, "f1": 0.035842293906810034}}
|
| 68 |
+
{"seed": 76, "en": {"accuracy": 0.888, "f1": 0.8816067653276956}, "fr": {"accuracy": 0.799, "f1": 0.804284323271665}, "de": {"accuracy": 0.775, "f1": 0.7722672064777328}, "zh": {"accuracy": 0.7135, "f1": 0.6995280545359203}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9447222222222222, "f1": 0.9440854172520371}, "dna_sim_pair_150bp": {"accuracy": 0.82475, "f1": 0.7976911976911977}, "dna_sim_pair_50bp": {"accuracy": 0.7565, "f1": 0.7243916242218449}, "protein_sim_pair_150bp": {"accuracy": 0.9566666666666667, "f1": 0.9568106312292359}, "protein_sim_pair_450bp": {"accuracy": 0.915, "f1": 0.9115095430884904}, "dna_protein_pair": {"accuracy": 0.51, "f1": 0.06666666666666667}, "dna_protein_pair_100": {"accuracy": 0.53, "f1": 0.09615384615384616}, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.1092436974789916}, "dna_protein_pair_rand": {"accuracy": 0.49625, "f1": 0.09029345372460497}, "dna_protein_pair_rand_100": {"accuracy": 0.53625, "f1": 0.17738359201773837}, "dna_protein_pair_rand_full": {"accuracy": 0.52625, "f1": 0.0889423076923077}}
|
| 69 |
+
{"seed": 77, "en": {"accuracy": 0.8645, "f1": 0.8559276980329612}, "fr": {"accuracy": 0.7805, "f1": 0.782350024789291}, "de": {"accuracy": 0.756, "f1": 0.7489711934156379}, "zh": {"accuracy": 0.699, "f1": 0.6968781470292045}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9441666666666667, "f1": 0.9456021650879567}, "dna_sim_pair_150bp": {"accuracy": 0.824, "f1": 0.8041179744017808}, "dna_sim_pair_50bp": {"accuracy": 0.68, "f1": 0.7464342313787639}, "protein_sim_pair_150bp": {"accuracy": 0.935, "f1": 0.9366540335679481}, "protein_sim_pair_450bp": {"accuracy": 0.8944444444444445, "f1": 0.8879716981132075}, "dna_protein_pair": {"accuracy": 0.45, "f1": 0.20863309352517986}, "dna_protein_pair_100": {"accuracy": 0.4575, "f1": 0.08438818565400844}, "dna_protein_pair_full": {"accuracy": 0.45, "f1": 0.20863309352517986}, "dna_protein_pair_rand": {"accuracy": 0.56, "f1": 0.3669064748201439}, "dna_protein_pair_rand_100": {"accuracy": 0.556875, "f1": 0.19887005649717515}, "dna_protein_pair_rand_full": {"accuracy": 0.503125, "f1": 0.1829393627954779}}
|
| 70 |
+
{"seed": 78, "en": {"accuracy": 0.8585, "f1": 0.8571428571428571}, "fr": {"accuracy": 0.768, "f1": 0.7869605142332415}, "de": {"accuracy": 0.75, "f1": 0.7621313035204567}, "zh": {"accuracy": 0.6755, "f1": 0.7111704494882065}, "dna_sim_pair_simple_150bp": {"accuracy": 0.88, "f1": 0.8911290322580645}, "dna_sim_pair_150bp": {"accuracy": 0.7975, "f1": 0.8030155642023347}, "dna_sim_pair_50bp": {"accuracy": 0.522, "f1": 0.6802675585284281}, "protein_sim_pair_150bp": {"accuracy": 0.78, "f1": 0.8219424460431655}, "protein_sim_pair_450bp": {"accuracy": 0.9477777777777778, "f1": 0.9481236203090507}, "dna_protein_pair": {"accuracy": 0.5075, "f1": 0.2939068100358423}, "dna_protein_pair_100": {"accuracy": 0.4875, "f1": 0.00966183574879227}, "dna_protein_pair_full": {"accuracy": 0.4175, "f1": 0.3086053412462908}, "dna_protein_pair_rand": {"accuracy": 0.559375, "f1": 0.36083408884859475}, "dna_protein_pair_rand_100": {"accuracy": 0.485, "f1": 0.03286384976525822}, "dna_protein_pair_rand_full": {"accuracy": 0.591875, "f1": 0.47039740470397406}}
|
| 71 |
+
{"seed": 79, "en": {"accuracy": 0.872, "f1": 0.871356783919598}, "fr": {"accuracy": 0.7545, "f1": 0.7789284106258442}, "de": {"accuracy": 0.7325, "f1": 0.7558192606115929}, "zh": {"accuracy": 0.672, "f1": 0.7130358705161854}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9, "f1": 0.9051133368476542}, "dna_sim_pair_150bp": {"accuracy": 0.80025, "f1": 0.793058793058793}, "dna_sim_pair_50bp": {"accuracy": 0.5835, "f1": 0.6958744067177802}, "protein_sim_pair_150bp": {"accuracy": 0.9011111111111111, "f1": 0.9078674948240165}, "protein_sim_pair_450bp": {"accuracy": 0.9511111111111111, "f1": 0.9506172839506173}, "dna_protein_pair": {"accuracy": 0.4875, "f1": 0.14225941422594143}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.0297029702970297}, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.10666666666666667}, "dna_protein_pair_rand": {"accuracy": 0.500625, "f1": 0.18386108273748722}, "dna_protein_pair_rand_100": {"accuracy": 0.483125, "f1": 0.04171494785631518}, "dna_protein_pair_rand_full": {"accuracy": 0.505, "f1": 0.10609480812641084}}
|
| 72 |
+
{"seed": 80, "en": {"accuracy": 0.869, "f1": 0.8649484536082475}, "fr": {"accuracy": 0.769, "f1": 0.7830985915492957}, "de": {"accuracy": 0.739, "f1": 0.7528409090909091}, "zh": {"accuracy": 0.706, "f1": 0.6947040498442367}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9655555555555555, "f1": 0.9663226507332972}, "dna_sim_pair_150bp": {"accuracy": 0.83775, "f1": 0.8129143845488613}, "dna_sim_pair_50bp": {"accuracy": 0.862, "f1": 0.8614457831325302}, "protein_sim_pair_150bp": {"accuracy": 0.9805555555555555, "f1": 0.9801474758933636}, "protein_sim_pair_450bp": {"accuracy": 0.9594444444444444, "f1": 0.9598238855255916}, "dna_protein_pair": {"accuracy": 0.435, "f1": 0.12403100775193798}, "dna_protein_pair_100": {"accuracy": 0.42, "f1": 0.46543778801843316}, "dna_protein_pair_full": {"accuracy": 0.5175, "f1": 0.34576271186440677}, "dna_protein_pair_rand": {"accuracy": 0.520625, "f1": 0.1562156215621562}, "dna_protein_pair_rand_100": {"accuracy": 0.431875, "f1": 0.328159645232816}, "dna_protein_pair_rand_full": {"accuracy": 0.439375, "f1": 0.1416267942583732}}
|
| 73 |
+
{"seed": 81, "en": {"accuracy": 0.9075, "f1": 0.8987411056376574}, "fr": {"accuracy": 0.802, "f1": 0.7958762886597938}, "de": {"accuracy": 0.792, "f1": 0.7716794731064764}, "zh": {"accuracy": 0.72, "f1": 0.6755504055619931}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9544444444444444, "f1": 0.9519061583577713}, "dna_sim_pair_150bp": {"accuracy": 0.77575, "f1": 0.7079127320091175}, "dna_sim_pair_50bp": {"accuracy": 0.794, "f1": 0.7506053268765133}, "protein_sim_pair_150bp": {"accuracy": 0.9627777777777777, "f1": 0.9613832853025936}, "protein_sim_pair_450bp": {"accuracy": 0.9388888888888889, "f1": 0.9375}, "dna_protein_pair": {"accuracy": 0.5175, "f1": 0.02030456852791878}, "dna_protein_pair_100": {"accuracy": 0.4775, "f1": 0.009478672985781991}, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.4825, "f1": 0.028169014084507043}, "dna_protein_pair_rand_100": {"accuracy": 0.50625, "f1": 0.0125}, "dna_protein_pair_rand_full": {"accuracy": 0.485625, "f1": 0.02140309155766944}}
|
| 74 |
+
{"seed": 82, "en": {"accuracy": 0.891, "f1": 0.8778026905829597}, "fr": {"accuracy": 0.8055, "f1": 0.7914209115281501}, "de": {"accuracy": 0.7645, "f1": 0.7543035993740219}, "zh": {"accuracy": 0.7195, "f1": 0.6835871404399323}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9416666666666667, "f1": 0.9387397899649942}, "dna_sim_pair_150bp": {"accuracy": 0.69175, "f1": 0.5550342836521112}, "dna_sim_pair_50bp": {"accuracy": 0.7675, "f1": 0.7576862949452841}, "protein_sim_pair_150bp": {"accuracy": 0.9355555555555556, "f1": 0.9292682926829269}, "protein_sim_pair_450bp": {"accuracy": 0.7711111111111111, "f1": 0.7086280056577087}, "dna_protein_pair": {"accuracy": 0.4975, "f1": 0.0}, "dna_protein_pair_100": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.4775, "f1": 0.0}, "dna_protein_pair_rand": {"accuracy": 0.496875, "f1": 0.0024783147459727386}, "dna_protein_pair_rand_100": {"accuracy": 0.49375, "f1": 0.004914004914004914}, "dna_protein_pair_rand_full": {"accuracy": 0.503125, "f1": 0.07450523864959255}}
|
| 75 |
+
{"seed": 83, "en": {"accuracy": 0.876, "f1": 0.8693361433087461}, "fr": {"accuracy": 0.773, "f1": 0.7866541353383458}, "de": {"accuracy": 0.747, "f1": 0.7529296875}, "zh": {"accuracy": 0.7115, "f1": 0.7208514755684567}, "dna_sim_pair_simple_150bp": {"accuracy": 0.8608333333333333, "f1": 0.8733249051833123}, "dna_sim_pair_150bp": {"accuracy": 0.74925, "f1": 0.7611336032388664}, "dna_sim_pair_50bp": {"accuracy": 0.4935, "f1": 0.6590373611578593}, "protein_sim_pair_150bp": {"accuracy": 0.9144444444444444, "f1": 0.9165763813651138}, "protein_sim_pair_450bp": {"accuracy": 0.9205555555555556, "f1": 0.9230769230769231}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.2916666666666667}, "dna_protein_pair_100": {"accuracy": 0.4475, "f1": 0.19047619047619047}, "dna_protein_pair_full": {"accuracy": 0.3725, "f1": 0.4308390022675737}, "dna_protein_pair_rand": {"accuracy": 0.559375, "f1": 0.3710972346119536}, "dna_protein_pair_rand_100": {"accuracy": 0.52875, "f1": 0.22745901639344263}, "dna_protein_pair_rand_full": {"accuracy": 0.52875, "f1": 0.49395973154362416}}
|
| 76 |
+
{"seed": 84, "en": {"accuracy": 0.889, "f1": 0.8776185226019846}, "fr": {"accuracy": 0.7965, "f1": 0.7845420857596612}, "de": {"accuracy": 0.775, "f1": 0.7511061946902655}, "zh": {"accuracy": 0.7285, "f1": 0.7146610614818707}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9291666666666667, "f1": 0.9300027449903925}, "dna_sim_pair_150bp": {"accuracy": 0.79625, "f1": 0.7724099413571628}, "dna_sim_pair_50bp": {"accuracy": 0.5215, "f1": 0.6414387411015362}, "protein_sim_pair_150bp": {"accuracy": 0.9294444444444444, "f1": 0.9333333333333333}, "protein_sim_pair_450bp": {"accuracy": 0.9694444444444444, "f1": 0.9688737973967176}, "dna_protein_pair": {"accuracy": 0.54, "f1": 0.031578947368421054}, "dna_protein_pair_100": {"accuracy": 0.475, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.09009009009009009}, "dna_protein_pair_rand": {"accuracy": 0.494375, "f1": 0.03575685339690107}, "dna_protein_pair_rand_100": {"accuracy": 0.476875, "f1": 0.009467455621301775}, "dna_protein_pair_rand_full": {"accuracy": 0.5375, "f1": 0.1759465478841871}}
|
| 77 |
+
{"seed": 85, "en": {"accuracy": 0.878, "f1": 0.8675352877307275}, "fr": {"accuracy": 0.7915, "f1": 0.7822454308093995}, "de": {"accuracy": 0.763, "f1": 0.7489406779661016}, "zh": {"accuracy": 0.722, "f1": 0.7154554759467758}, "dna_sim_pair_simple_150bp": {"accuracy": 0.7969444444444445, "f1": 0.8218376797465269}, "dna_sim_pair_150bp": {"accuracy": 0.71975, "f1": 0.7503896682253396}, "dna_sim_pair_50bp": {"accuracy": 0.507, "f1": 0.6574009728978457}, "protein_sim_pair_150bp": {"accuracy": 0.8277777777777777, "f1": 0.8451548451548452}, "protein_sim_pair_450bp": {"accuracy": 0.9555555555555556, "f1": 0.9572649572649573}, "dna_protein_pair": {"accuracy": 0.515, "f1": 0.049019607843137254}, "dna_protein_pair_100": {"accuracy": 0.51, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.5375, "f1": 0.021164021164021163}, "dna_protein_pair_rand": {"accuracy": 0.525, "f1": 0.15178571428571427}, "dna_protein_pair_rand_100": {"accuracy": 0.515, "f1": 0.022670025188916875}, "dna_protein_pair_rand_full": {"accuracy": 0.510625, "f1": 0.024906600249066}}
|
| 78 |
+
{"seed": 86, "en": {"accuracy": 0.887, "f1": 0.8774403470715835}, "fr": {"accuracy": 0.802, "f1": 0.7995951417004049}, "de": {"accuracy": 0.7835, "f1": 0.7650569723277265}, "zh": {"accuracy": 0.7165, "f1": 0.6879471656576774}, "dna_sim_pair_simple_150bp": {"accuracy": 0.9388888888888889, "f1": 0.9373932840068299}, "dna_sim_pair_150bp": {"accuracy": 0.72075, "f1": 0.6309877766765775}, "dna_sim_pair_50bp": {"accuracy": 0.739, "f1": 0.7661290322580645}, "protein_sim_pair_150bp": {"accuracy": 0.9722222222222222, "f1": 0.972972972972973}, "protein_sim_pair_450bp": {"accuracy": 0.9411111111111111, "f1": 0.9368295589988082}, "dna_protein_pair": {"accuracy": 0.49, "f1": 0.009708737864077669}, "dna_protein_pair_100": {"accuracy": 0.4375, "f1": 0.0}, "dna_protein_pair_full": {"accuracy": 0.48, "f1": 0.018867924528301886}, "dna_protein_pair_rand": {"accuracy": 0.493125, "f1": 0.0073439412484700125}, "dna_protein_pair_rand_100": {"accuracy": 0.505625, "f1": 0.0025220680958385876}, "dna_protein_pair_rand_full": {"accuracy": 0.4875, "f1": 0.00966183574879227}}
|
finetune/gpt2_gene_multiv2_ft_en2.jsonl
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"seed": 9377, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.24444444444444444}, "dna_protein_pair_rand_full": {"accuracy": 0.633, "f1": 0.5068861269734632}}
|
| 2 |
+
{"seed": 4277, "dna_protein_pair_full": {"accuracy": 0.3975, "f1": 0.5111561866125761}, "dna_protein_pair_rand_full": {"accuracy": 0.611375, "f1": 0.7062269677785127}}
|
| 3 |
+
{"seed": 4248, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.12396694214876033}, "dna_protein_pair_rand_full": {"accuracy": 0.573125, "f1": 0.32947182407225606}}
|
| 4 |
+
{"seed": 1491, "dna_protein_pair_full": {"accuracy": 0.55, "f1": 0.25}, "dna_protein_pair_rand_full": {"accuracy": 0.551625, "f1": 0.3258785942492013}}
|
| 5 |
+
{"seed": 7840, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.02912621359223301}, "dna_protein_pair_rand_full": {"accuracy": 0.504625, "f1": 0.017356806347632037}}
|
| 6 |
+
{"seed": 9385, "dna_protein_pair_full": {"accuracy": 0.545, "f1": 0.19469026548672566}, "dna_protein_pair_rand_full": {"accuracy": 0.644, "f1": 0.5427103403982017}}
|
| 7 |
+
{"seed": 4471, "dna_protein_pair_full": {"accuracy": 0.5425, "f1": 0.24066390041493776}, "dna_protein_pair_rand_full": {"accuracy": 0.69375, "f1": 0.6466685895586963}}
|
| 8 |
+
{"seed": 3747, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.019138755980861243}, "dna_protein_pair_rand_full": {"accuracy": 0.535125, "f1": 0.1733718604134252}}
|
| 9 |
+
{"seed": 7580, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.05714285714285714}, "dna_protein_pair_rand_full": {"accuracy": 0.5785, "f1": 0.30128470783257355}}
|
| 10 |
+
{"seed": 4841, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.125}, "dna_protein_pair_rand_full": {"accuracy": 0.504375, "f1": 0.0755420844019585}}
|
| 11 |
+
{"seed": 3364, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.03755868544600939}, "dna_protein_pair_rand_full": {"accuracy": 0.49925, "f1": 0.01765571358509073}}
|
| 12 |
+
{"seed": 757, "dna_protein_pair_full": {"accuracy": 0.4225, "f1": 0.5792349726775956}, "dna_protein_pair_rand_full": {"accuracy": 0.53425, "f1": 0.6640822214208438}}
|
| 13 |
+
{"seed": 3390, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.16964285714285715}, "dna_protein_pair_rand_full": {"accuracy": 0.557875, "f1": 0.27801592161665645}}
|
| 14 |
+
{"seed": 8608, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.508875, "f1": 0.05756776205325018}}
|
| 15 |
+
{"seed": 3639, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.3630573248407643}, "dna_protein_pair_rand_full": {"accuracy": 0.69125, "f1": 0.6803830227743272}}
|
| 16 |
+
{"seed": 9238, "dna_protein_pair_full": {"accuracy": 0.4475, "f1": 0.12648221343873517}, "dna_protein_pair_rand_full": {"accuracy": 0.507375, "f1": 0.09630818619582665}}
|
| 17 |
+
{"seed": 2142, "dna_protein_pair_full": {"accuracy": 0.375, "f1": 0.34210526315789475}, "dna_protein_pair_rand_full": {"accuracy": 0.473, "f1": 0.2817717206132879}}
|
| 18 |
+
{"seed": 1568, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.14785992217898833}, "dna_protein_pair_rand_full": {"accuracy": 0.571625, "f1": 0.3382892450279977}}
|
| 19 |
+
{"seed": 7389, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.25263157894736843}, "dna_protein_pair_rand_full": {"accuracy": 0.4845, "f1": 0.28872024836150395}}
|
| 20 |
+
{"seed": 1632, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.4293193717277487}, "dna_protein_pair_rand_full": {"accuracy": 0.748, "f1": 0.7583313354111724}}
|
| 21 |
+
{"seed": 2150, "dna_protein_pair_full": {"accuracy": 0.4225, "f1": 0.03347280334728033}, "dna_protein_pair_rand_full": {"accuracy": 0.504875, "f1": 0.046231639778473395}}
|
| 22 |
+
{"seed": 4923, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.22813688212927757}, "dna_protein_pair_rand_full": {"accuracy": 0.576125, "f1": 0.3910935536002873}}
|
| 23 |
+
{"seed": 7349, "dna_protein_pair_full": {"accuracy": 0.47, "f1": 0.04504504504504504}, "dna_protein_pair_rand_full": {"accuracy": 0.54125, "f1": 0.23060796645702306}}
|
| 24 |
+
{"seed": 8540, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.1890909090909091}, "dna_protein_pair_rand_full": {"accuracy": 0.591, "f1": 0.3854244928625094}}
|
| 25 |
+
{"seed": 6505, "dna_protein_pair_full": {"accuracy": 0.385, "f1": 0.22641509433962265}, "dna_protein_pair_rand_full": {"accuracy": 0.59225, "f1": 0.4062613760465963}}
|
| 26 |
+
{"seed": 7670, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.667779632721202}, "dna_protein_pair_rand_full": {"accuracy": 0.560375, "f1": 0.6925968009789354}}
|
| 27 |
+
{"seed": 1702, "dna_protein_pair_full": {"accuracy": 0.3325, "f1": 0.46060606060606063}, "dna_protein_pair_rand_full": {"accuracy": 0.530375, "f1": 0.5694969634467744}}
|
| 28 |
+
{"seed": 6106, "dna_protein_pair_full": {"accuracy": 0.3775, "f1": 0.5202312138728323}, "dna_protein_pair_rand_full": {"accuracy": 0.717375, "f1": 0.7624750499001997}}
|
| 29 |
+
{"seed": 8233, "dna_protein_pair_full": {"accuracy": 0.445, "f1": 0.26}, "dna_protein_pair_rand_full": {"accuracy": 0.54075, "f1": 0.2577777777777778}}
|
| 30 |
+
{"seed": 2369, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.34951456310679613}, "dna_protein_pair_rand_full": {"accuracy": 0.68375, "f1": 0.6386746643816053}}
|
| 31 |
+
{"seed": 8519, "dna_protein_pair_full": {"accuracy": 0.53, "f1": 0.14545454545454545}, "dna_protein_pair_rand_full": {"accuracy": 0.549125, "f1": 0.2542898490800083}}
|
| 32 |
+
{"seed": 691, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.06481481481481481}, "dna_protein_pair_rand_full": {"accuracy": 0.527125, "f1": 0.14120317820658343}}
|
| 33 |
+
{"seed": 1606, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.09917355371900827}, "dna_protein_pair_rand_full": {"accuracy": 0.519375, "f1": 0.12394622920938711}}
|
| 34 |
+
{"seed": 1324, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.037914691943127965}, "dna_protein_pair_rand_full": {"accuracy": 0.52675, "f1": 0.10156620787850024}}
|
| 35 |
+
{"seed": 104, "dna_protein_pair_full": {"accuracy": 0.45, "f1": 0.3413173652694611}, "dna_protein_pair_rand_full": {"accuracy": 0.65025, "f1": 0.6153423150948584}}
|
| 36 |
+
{"seed": 8031, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.5073891625615764}, "dna_protein_pair_rand_full": {"accuracy": 0.703125, "f1": 0.7563852702841317}}
|
| 37 |
+
{"seed": 1318, "dna_protein_pair_full": {"accuracy": 0.4, "f1": 0.23076923076923078}, "dna_protein_pair_rand_full": {"accuracy": 0.5535, "f1": 0.3250188964474679}}
|
| 38 |
+
{"seed": 2368, "dna_protein_pair_full": {"accuracy": 0.4275, "f1": 0.5278350515463918}, "dna_protein_pair_rand_full": {"accuracy": 0.612375, "f1": 0.6792179580014482}}
|
| 39 |
+
{"seed": 9727, "dna_protein_pair_full": {"accuracy": 0.5325, "f1": 0.010582010582010581}, "dna_protein_pair_rand_full": {"accuracy": 0.556125, "f1": 0.2241642997596679}}
|
| 40 |
+
{"seed": 8341, "dna_protein_pair_full": {"accuracy": 0.5475, "f1": 0.15023474178403756}, "dna_protein_pair_rand_full": {"accuracy": 0.575375, "f1": 0.3405164045816346}}
|
| 41 |
+
{"seed": 8485, "dna_protein_pair_full": {"accuracy": 0.525, "f1": 0.08653846153846154}, "dna_protein_pair_rand_full": {"accuracy": 0.528375, "f1": 0.14425039691540031}}
|
| 42 |
+
{"seed": 4596, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.04672897196261682}, "dna_protein_pair_rand_full": {"accuracy": 0.51775, "f1": 0.14266666666666666}}
|
| 43 |
+
{"seed": 6157, "dna_protein_pair_full": {"accuracy": 0.4075, "f1": 0.4261501210653753}, "dna_protein_pair_rand_full": {"accuracy": 0.615625, "f1": 0.5785939427161847}}
|
| 44 |
+
{"seed": 9356, "dna_protein_pair_full": {"accuracy": 0.43, "f1": 0.14285714285714285}, "dna_protein_pair_rand_full": {"accuracy": 0.516125, "f1": 0.10248087178298168}}
|
| 45 |
+
{"seed": 6565, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.506625, "f1": 0.012509382036527395}}
|
| 46 |
+
{"seed": 4526, "dna_protein_pair_full": {"accuracy": 0.4425, "f1": 0.6039076376554174}, "dna_protein_pair_rand_full": {"accuracy": 0.539125, "f1": 0.674666901967705}}
|
| 47 |
+
{"seed": 3552, "dna_protein_pair_full": {"accuracy": 0.53, "f1": 0.45348837209302323}, "dna_protein_pair_rand_full": {"accuracy": 0.748875, "f1": 0.7654955060114392}}
|
| 48 |
+
{"seed": 2017, "dna_protein_pair_full": {"accuracy": 0.5625, "f1": 0.5179063360881543}, "dna_protein_pair_rand_full": {"accuracy": 0.73175, "f1": 0.7463356973995272}}
|
| 49 |
+
{"seed": 2615, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.4708994708994709}, "dna_protein_pair_rand_full": {"accuracy": 0.729875, "f1": 0.763126164638825}}
|
| 50 |
+
{"seed": 5587, "dna_protein_pair_full": {"accuracy": 0.525, "f1": 0.30656934306569344}, "dna_protein_pair_rand_full": {"accuracy": 0.701, "f1": 0.6584808680753855}}
|
| 51 |
+
{"seed": 3478, "dna_protein_pair_full": {"accuracy": 0.445, "f1": 0.40641711229946526}, "dna_protein_pair_rand_full": {"accuracy": 0.646875, "f1": 0.6221746689848869}}
|
| 52 |
+
{"seed": 2621, "dna_protein_pair_full": {"accuracy": 0.415, "f1": 0.4090909090909091}, "dna_protein_pair_rand_full": {"accuracy": 0.76025, "f1": 0.7766130910784999}}
|
| 53 |
+
{"seed": 7761, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.43304843304843305}, "dna_protein_pair_rand_full": {"accuracy": 0.691375, "f1": 0.6828516377649325}}
|
| 54 |
+
{"seed": 208, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.4263157894736842}, "dna_protein_pair_rand_full": {"accuracy": 0.73275, "f1": 0.7495900679315999}}
|
| 55 |
+
{"seed": 3926, "dna_protein_pair_full": {"accuracy": 0.375, "f1": 0.4212962962962963}, "dna_protein_pair_rand_full": {"accuracy": 0.497375, "f1": 0.45961564305872865}}
|
| 56 |
+
{"seed": 1128, "dna_protein_pair_full": {"accuracy": 0.4475, "f1": 0.23529411764705882}, "dna_protein_pair_rand_full": {"accuracy": 0.571875, "f1": 0.3975373790677221}}
|
| 57 |
+
{"seed": 6132, "dna_protein_pair_full": {"accuracy": 0.43, "f1": 0.5714285714285714}, "dna_protein_pair_rand_full": {"accuracy": 0.59675, "f1": 0.697430125679985}}
|
| 58 |
+
{"seed": 5647, "dna_protein_pair_full": {"accuracy": 0.53, "f1": 0.4303030303030303}, "dna_protein_pair_rand_full": {"accuracy": 0.702375, "f1": 0.7012172167147698}}
|
| 59 |
+
{"seed": 7083, "dna_protein_pair_full": {"accuracy": 0.385, "f1": 0.5232558139534884}, "dna_protein_pair_rand_full": {"accuracy": 0.517625, "f1": 0.6022059581486444}}
|
| 60 |
+
{"seed": 2020, "dna_protein_pair_full": {"accuracy": 0.4175, "f1": 0.1824561403508772}, "dna_protein_pair_rand_full": {"accuracy": 0.5575, "f1": 0.3442015561319007}}
|
| 61 |
+
{"seed": 5151, "dna_protein_pair_full": {"accuracy": 0.4225, "f1": 0.21160409556313994}, "dna_protein_pair_rand_full": {"accuracy": 0.615, "f1": 0.42920681986656783}}
|
| 62 |
+
{"seed": 2881, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.009852216748768473}, "dna_protein_pair_rand_full": {"accuracy": 0.50275, "f1": 0.02975609756097561}}
|
| 63 |
+
{"seed": 6216, "dna_protein_pair_full": {"accuracy": 0.4575, "f1": 0.1422924901185771}, "dna_protein_pair_rand_full": {"accuracy": 0.548625, "f1": 0.23382134521536177}}
|
| 64 |
+
{"seed": 5399, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.16216216216216217}, "dna_protein_pair_rand_full": {"accuracy": 0.53825, "f1": 0.18634361233480176}}
|
| 65 |
+
{"seed": 6209, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.6365280289330922}, "dna_protein_pair_rand_full": {"accuracy": 0.604, "f1": 0.7133031674208145}}
|
| 66 |
+
{"seed": 3661, "dna_protein_pair_full": {"accuracy": 0.46, "f1": 0.07692307692307693}, "dna_protein_pair_rand_full": {"accuracy": 0.527125, "f1": 0.11632796075683252}}
|
| 67 |
+
{"seed": 2554, "dna_protein_pair_full": {"accuracy": 0.4925, "f1": 0.00975609756097561}, "dna_protein_pair_rand_full": {"accuracy": 0.509, "f1": 0.022399203583872575}}
|
| 68 |
+
{"seed": 792, "dna_protein_pair_full": {"accuracy": 0.445, "f1": 0.6063829787234043}, "dna_protein_pair_rand_full": {"accuracy": 0.463625, "f1": 0.5924589229746414}}
|
| 69 |
+
{"seed": 9490, "dna_protein_pair_full": {"accuracy": 0.42, "f1": 0.2}, "dna_protein_pair_rand_full": {"accuracy": 0.548, "f1": 0.3700348432055749}}
|
| 70 |
+
{"seed": 8747, "dna_protein_pair_full": {"accuracy": 0.535, "f1": 0.44642857142857145}, "dna_protein_pair_rand_full": {"accuracy": 0.741, "f1": 0.7396984924623116}}
|
| 71 |
+
{"seed": 8740, "dna_protein_pair_full": {"accuracy": 0.46, "f1": 0.01818181818181818}, "dna_protein_pair_rand_full": {"accuracy": 0.526625, "f1": 0.10366863905325444}}
|
| 72 |
+
{"seed": 6640, "dna_protein_pair_full": {"accuracy": 0.46, "f1": 0.6142857142857143}, "dna_protein_pair_rand_full": {"accuracy": 0.565625, "f1": 0.6598139990210474}}
|
| 73 |
+
{"seed": 5929, "dna_protein_pair_full": {"accuracy": 0.48, "f1": 0.045871559633027525}, "dna_protein_pair_rand_full": {"accuracy": 0.531125, "f1": 0.17397049108125964}}
|
| 74 |
+
{"seed": 4092, "dna_protein_pair_full": {"accuracy": 0.48, "f1": 0.35}, "dna_protein_pair_rand_full": {"accuracy": 0.5145, "f1": 0.3636959370904325}}
|
| 75 |
+
{"seed": 5868, "dna_protein_pair_full": {"accuracy": 0.4975, "f1": 0.1518987341772152}, "dna_protein_pair_rand_full": {"accuracy": 0.595625, "f1": 0.3625615763546798}}
|
| 76 |
+
{"seed": 2852, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.07239819004524888}, "dna_protein_pair_rand_full": {"accuracy": 0.5245, "f1": 0.11534883720930232}}
|
| 77 |
+
{"seed": 3192, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.06796116504854369}, "dna_protein_pair_rand_full": {"accuracy": 0.53, "f1": 0.14855072463768115}}
|
| 78 |
+
{"seed": 6069, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.6217616580310881}, "dna_protein_pair_rand_full": {"accuracy": 0.532, "f1": 0.6772413793103448}}
|
| 79 |
+
{"seed": 9895, "dna_protein_pair_full": {"accuracy": 0.43, "f1": 0.5854545454545454}, "dna_protein_pair_rand_full": {"accuracy": 0.3955, "f1": 0.48222698072805137}}
|
| 80 |
+
{"seed": 4622, "dna_protein_pair_full": {"accuracy": 0.505, "f1": 0.08333333333333333}, "dna_protein_pair_rand_full": {"accuracy": 0.512625, "f1": 0.1140649852306294}}
|
| 81 |
+
{"seed": 690, "dna_protein_pair_full": {"accuracy": 0.455, "f1": 0.043859649122807015}, "dna_protein_pair_rand_full": {"accuracy": 0.494, "f1": 0.04483246814535158}}
|
| 82 |
+
{"seed": 2905, "dna_protein_pair_full": {"accuracy": 0.42, "f1": 0.12781954887218044}, "dna_protein_pair_rand_full": {"accuracy": 0.533875, "f1": 0.21412012644889358}}
|
| 83 |
+
{"seed": 1038, "dna_protein_pair_full": {"accuracy": 0.445, "f1": 0.15267175572519084}, "dna_protein_pair_rand_full": {"accuracy": 0.638125, "f1": 0.4925503943908852}}
|
| 84 |
+
{"seed": 4612, "dna_protein_pair_full": {"accuracy": 0.5175, "f1": 0.4469914040114613}, "dna_protein_pair_rand_full": {"accuracy": 0.593375, "f1": 0.546114134226315}}
|
| 85 |
+
{"seed": 277, "dna_protein_pair_full": {"accuracy": 0.37, "f1": 0.411214953271028}, "dna_protein_pair_rand_full": {"accuracy": 0.5925, "f1": 0.5316091954022989}}
|
| 86 |
+
{"seed": 6277, "dna_protein_pair_full": {"accuracy": 0.5675, "f1": 0.2100456621004566}, "dna_protein_pair_rand_full": {"accuracy": 0.572125, "f1": 0.3481241668253666}}
|
| 87 |
+
{"seed": 2345, "dna_protein_pair_full": {"accuracy": 0.52, "f1": 0.02040816326530612}, "dna_protein_pair_rand_full": {"accuracy": 0.508125, "f1": 0.04141291108404385}}
|
| 88 |
+
{"seed": 8403, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.009950248756218905}, "dna_protein_pair_rand_full": {"accuracy": 0.501875, "f1": 0.0216056960471397}}
|
| 89 |
+
{"seed": 4328, "dna_protein_pair_full": {"accuracy": 0.4, "f1": 0.5020746887966805}, "dna_protein_pair_rand_full": {"accuracy": 0.583375, "f1": 0.6376780084791825}}
|
| 90 |
+
{"seed": 8255, "dna_protein_pair_full": {"accuracy": 0.4525, "f1": 0.13438735177865613}, "dna_protein_pair_rand_full": {"accuracy": 0.511125, "f1": 0.15801937567276642}}
|
| 91 |
+
{"seed": 7781, "dna_protein_pair_full": {"accuracy": 0.4675, "f1": 0.5125858123569794}, "dna_protein_pair_rand_full": {"accuracy": 0.655375, "f1": 0.6845898638599702}}
|
| 92 |
+
{"seed": 8414, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.10138248847926268}, "dna_protein_pair_rand_full": {"accuracy": 0.533625, "f1": 0.1772877618522602}}
|
| 93 |
+
{"seed": 7077, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.06334841628959276}, "dna_protein_pair_rand_full": {"accuracy": 0.511625, "f1": 0.08135433811427228}}
|
| 94 |
+
{"seed": 1349, "dna_protein_pair_full": {"accuracy": 0.44, "f1": 0.2631578947368421}, "dna_protein_pair_rand_full": {"accuracy": 0.5775, "f1": 0.38004402054292}}
|
| 95 |
+
{"seed": 2336, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.5894736842105263}, "dna_protein_pair_rand_full": {"accuracy": 0.68, "f1": 0.722161927501628}}
|
| 96 |
+
{"seed": 5417, "dna_protein_pair_full": {"accuracy": 0.395, "f1": 0.33879781420765026}, "dna_protein_pair_rand_full": {"accuracy": 0.4325, "f1": 0.18168709444844988}}
|
| 97 |
+
{"seed": 17, "dna_protein_pair_full": {"accuracy": 0.55, "f1": 0.6234309623430963}, "dna_protein_pair_rand_full": {"accuracy": 0.57725, "f1": 0.6246392896781354}}
|
| 98 |
+
{"seed": 3656, "dna_protein_pair_full": {"accuracy": 0.525, "f1": 0.020618556701030927}, "dna_protein_pair_rand_full": {"accuracy": 0.592875, "f1": 0.3698974656606694}}
|
| 99 |
+
{"seed": 8342, "dna_protein_pair_full": {"accuracy": 0.4875, "f1": 0.07239819004524888}, "dna_protein_pair_rand_full": {"accuracy": 0.5275, "f1": 0.16776750330250992}}
|
| 100 |
+
{"seed": 8521, "dna_protein_pair_full": {"accuracy": 0.44, "f1": 0.20567375886524822}, "dna_protein_pair_rand_full": {"accuracy": 0.612, "f1": 0.42497221193034457}}
|
| 101 |
+
{"seed": 7440, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.3269230769230769}, "dna_protein_pair_rand_full": {"accuracy": 0.603875, "f1": 0.47663088356729977}}
|
| 102 |
+
{"seed": 5855, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.4069767441860465}, "dna_protein_pair_rand_full": {"accuracy": 0.64875, "f1": 0.6561429270680372}}
|
| 103 |
+
{"seed": 6990, "dna_protein_pair_full": {"accuracy": 0.4125, "f1": 0.4418052256532066}, "dna_protein_pair_rand_full": {"accuracy": 0.62225, "f1": 0.640665873959572}}
|
| 104 |
+
{"seed": 354, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.184}, "dna_protein_pair_rand_full": {"accuracy": 0.64475, "f1": 0.5163376446562288}}
|
| 105 |
+
{"seed": 6884, "dna_protein_pair_full": {"accuracy": 0.4075, "f1": 0.45011600928074247}, "dna_protein_pair_rand_full": {"accuracy": 0.59125, "f1": 0.5594179466451091}}
|
| 106 |
+
{"seed": 7496, "dna_protein_pair_full": {"accuracy": 0.46, "f1": 0.3532934131736527}, "dna_protein_pair_rand_full": {"accuracy": 0.582125, "f1": 0.45331152902698285}}
|
| 107 |
+
{"seed": 8078, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.4350282485875706}, "dna_protein_pair_rand_full": {"accuracy": 0.651875, "f1": 0.6102169349195241}}
|
| 108 |
+
{"seed": 633, "dna_protein_pair_full": {"accuracy": 0.4825, "f1": 0.15510204081632653}, "dna_protein_pair_rand_full": {"accuracy": 0.5255, "f1": 0.17871051492860235}}
|
| 109 |
+
{"seed": 3696, "dna_protein_pair_full": {"accuracy": 0.475, "f1": 0.03669724770642202}, "dna_protein_pair_rand_full": {"accuracy": 0.495125, "f1": 0.02037351443123939}}
|
| 110 |
+
{"seed": 5461, "dna_protein_pair_full": {"accuracy": 0.49, "f1": 0.5233644859813084}, "dna_protein_pair_rand_full": {"accuracy": 0.687625, "f1": 0.7250522609748047}}
|
| 111 |
+
{"seed": 2135, "dna_protein_pair_full": {"accuracy": 0.495, "f1": 0.26277372262773724}, "dna_protein_pair_rand_full": {"accuracy": 0.667875, "f1": 0.5391153512575889}}
|
| 112 |
+
{"seed": 4135, "dna_protein_pair_full": {"accuracy": 0.3775, "f1": 0.15593220338983052}, "dna_protein_pair_rand_full": {"accuracy": 0.52925, "f1": 0.1932305055698372}}
|
| 113 |
+
{"seed": 5194, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.10909090909090909}, "dna_protein_pair_rand_full": {"accuracy": 0.634625, "f1": 0.47437511238985797}}
|
| 114 |
+
{"seed": 1689, "dna_protein_pair_full": {"accuracy": 0.3925, "f1": 0.26586102719033233}, "dna_protein_pair_rand_full": {"accuracy": 0.727375, "f1": 0.7038696537678207}}
|
| 115 |
+
{"seed": 299, "dna_protein_pair_full": {"accuracy": 0.54, "f1": 0.34285714285714286}, "dna_protein_pair_rand_full": {"accuracy": 0.71375, "f1": 0.6547044632086851}}
|
| 116 |
+
{"seed": 5598, "dna_protein_pair_full": {"accuracy": 0.5075, "f1": 0.0}, "dna_protein_pair_rand_full": {"accuracy": 0.506375, "f1": 0.009530975670930524}}
|
| 117 |
+
{"seed": 7204, "dna_protein_pair_full": {"accuracy": 0.6675, "f1": 0.6683291770573566}, "dna_protein_pair_rand_full": {"accuracy": 0.6345, "f1": 0.7026037428803905}}
|
| 118 |
+
{"seed": 5368, "dna_protein_pair_full": {"accuracy": 0.38, "f1": 0.40669856459330145}, "dna_protein_pair_rand_full": {"accuracy": 0.46225, "f1": 0.281563126252505}}
|
| 119 |
+
{"seed": 2689, "dna_protein_pair_full": {"accuracy": 0.3875, "f1": 0.449438202247191}, "dna_protein_pair_rand_full": {"accuracy": 0.586625, "f1": 0.63128553907905}}
|
| 120 |
+
{"seed": 7058, "dna_protein_pair_full": {"accuracy": 0.435, "f1": 0.5568627450980392}, "dna_protein_pair_rand_full": {"accuracy": 0.6725, "f1": 0.7355672184093661}}
|
| 121 |
+
{"seed": 8135, "dna_protein_pair_full": {"accuracy": 0.5, "f1": 0.05660377358490566}, "dna_protein_pair_rand_full": {"accuracy": 0.54, "f1": 0.1704238052299369}}
|
| 122 |
+
{"seed": 9685, "dna_protein_pair_full": {"accuracy": 0.5125, "f1": 0.25287356321839083}, "dna_protein_pair_rand_full": {"accuracy": 0.619875, "f1": 0.5038342307064774}}
|
| 123 |
+
{"seed": 6034, "dna_protein_pair_full": {"accuracy": 0.51, "f1": 0.125}, "dna_protein_pair_rand_full": {"accuracy": 0.574625, "f1": 0.34494706448508183}}
|
| 124 |
+
{"seed": 311, "dna_protein_pair_full": {"accuracy": 0.5025, "f1": 0.17427385892116182}, "dna_protein_pair_rand_full": {"accuracy": 0.624875, "f1": 0.43452044469568496}}
|
finetune/gpt2_gene_multiv2_ft_en3.jsonl
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
finetune/gpt2_gene_multiv2_ft_en_test_others.py
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
|
| 3 |
+
# # 设置环境变量
|
| 4 |
+
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
| 5 |
+
|
| 6 |
+
# # 打印环境变量以确认设置成功
|
| 7 |
+
# print(os.environ.get('HF_ENDPOINT'))
|
| 8 |
+
|
| 9 |
+
# import subprocess
|
| 10 |
+
# import os
|
| 11 |
+
|
| 12 |
+
# result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 13 |
+
# output = result.stdout
|
| 14 |
+
# for line in output.splitlines():
|
| 15 |
+
# if '=' in line:
|
| 16 |
+
# var, value = line.split('=', 1)
|
| 17 |
+
# os.environ[var] = value
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
from datasets import load_dataset
|
| 21 |
+
from transformers import AutoTokenizer, DataCollatorWithPadding
|
| 22 |
+
from transformers import Trainer
|
| 23 |
+
import evaluate
|
| 24 |
+
import numpy as np
|
| 25 |
+
from transformers import TrainingArguments
|
| 26 |
+
from transformers import AutoModelForSequenceClassification
|
| 27 |
+
import json
|
| 28 |
+
from transformers import set_seed
|
| 29 |
+
import random
|
| 30 |
+
import numpy as np
|
| 31 |
+
import torch
|
| 32 |
+
import sys
|
| 33 |
+
|
| 34 |
+
# seed = 42
|
| 35 |
+
# random.seed(seed)
|
| 36 |
+
# np.random.seed(seed)
|
| 37 |
+
# torch.manual_seed(seed)
|
| 38 |
+
# torch.cuda.manual_seed_all(seed)
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
# 动态生成随机种子
|
| 42 |
+
import random
|
| 43 |
+
#seed = random.randint(0, 10000)
|
| 44 |
+
seed = int(sys.argv[1])
|
| 45 |
+
#print(f"Generated seed: {seed}")
|
| 46 |
+
set_seed(seed)
|
| 47 |
+
result = {}
|
| 48 |
+
result["seed"] = seed
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象
|
| 53 |
+
raw_datasets = load_dataset('paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 54 |
+
|
| 55 |
+
#分词器
|
| 56 |
+
tokenizer = AutoTokenizer.from_pretrained("dnagpt/gpt2_gene_multi_v2")
|
| 57 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 58 |
+
|
| 59 |
+
# 修改分词器的填充方向为左侧,默认有右侧,分类问题建议左侧
|
| 60 |
+
#tokenizer.padding_side = "left"
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
#分词函数
|
| 64 |
+
def tokenize_function(example):
|
| 65 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256)
|
| 66 |
+
return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256, padding="max_length")
|
| 67 |
+
#return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=1024) #padding="max_length")
|
| 68 |
+
|
| 69 |
+
#构建分词后的数据集
|
| 70 |
+
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
|
| 71 |
+
|
| 72 |
+
#训练数据构建
|
| 73 |
+
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
#指标函数定义
|
| 77 |
+
def compute_metrics(eval_pred):
|
| 78 |
+
predictions, labels = eval_pred
|
| 79 |
+
predictions = np.argmax(predictions, axis=1)
|
| 80 |
+
return {'accuracy': (predictions==labels).sum() / len(labels)}
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
training_args = TrainingArguments(
|
| 85 |
+
output_dir="ds_job_dna_2222",
|
| 86 |
+
learning_rate=1e-5,
|
| 87 |
+
lr_scheduler_type="constant_with_warmup",
|
| 88 |
+
warmup_ratio=0.1,
|
| 89 |
+
optim='adamw_torch',
|
| 90 |
+
weight_decay=0.0,
|
| 91 |
+
seed=seed, # 使用动态生成的随机种子
|
| 92 |
+
per_device_train_batch_size=20,
|
| 93 |
+
per_device_eval_batch_size=20,
|
| 94 |
+
num_train_epochs=4, #训练多少轮
|
| 95 |
+
evaluation_strategy="epoch",
|
| 96 |
+
save_strategy="epoch",
|
| 97 |
+
logging_strategy="epoch",
|
| 98 |
+
load_best_model_at_end=True
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
#模型定义,文本分类模型
|
| 102 |
+
model = AutoModelForSequenceClassification.from_pretrained("dnagpt/gpt2_gene_multi_v2", num_labels=2)
|
| 103 |
+
model.config.pad_token_id = model.config.eos_token_id
|
| 104 |
+
|
| 105 |
+
trainer = Trainer(
|
| 106 |
+
model,
|
| 107 |
+
training_args,
|
| 108 |
+
train_dataset=tokenized_datasets["train"],
|
| 109 |
+
eval_dataset=tokenized_datasets["validation"],
|
| 110 |
+
data_collator=data_collator,
|
| 111 |
+
tokenizer=tokenizer,
|
| 112 |
+
compute_metrics=compute_metrics,
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
trainer.train() #模型训练
|
| 116 |
+
|
| 117 |
+
#模型测试,英文数据集
|
| 118 |
+
predictions = trainer.predict(tokenized_datasets["test"])
|
| 119 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 120 |
+
metric = evaluate.load("glue", "mrpc")
|
| 121 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 122 |
+
result["en"] = ret
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
#模型测试,法文数据集
|
| 126 |
+
raw_datasets_fr = load_dataset('paws-x', 'fr') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 127 |
+
tokenized_datasets_fr = raw_datasets_fr.map(tokenize_function, batched=True)
|
| 128 |
+
|
| 129 |
+
predictions = trainer.predict(tokenized_datasets_fr["test"])
|
| 130 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 131 |
+
metric = evaluate.load("glue", "mrpc")
|
| 132 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 133 |
+
result["fr"] = ret
|
| 134 |
+
|
| 135 |
+
#模型测试,德文数据集
|
| 136 |
+
raw_datasets_de = load_dataset('google-research-datasets/paws-x', 'de') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 137 |
+
tokenized_datasets_de = raw_datasets_de.map(tokenize_function, batched=True)
|
| 138 |
+
predictions = trainer.predict(tokenized_datasets_de["test"])
|
| 139 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 140 |
+
metric = evaluate.load("glue", "mrpc")
|
| 141 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 142 |
+
result["de"] = ret
|
| 143 |
+
|
| 144 |
+
#模型测试,中文数据集
|
| 145 |
+
raw_datasets_zh = load_dataset('google-research-datasets/paws-x', 'zh') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-
|
| 146 |
+
tokenized_datasets_zh = raw_datasets_zh.map(tokenize_function, batched=True)
|
| 147 |
+
|
| 148 |
+
predictions = trainer.predict(tokenized_datasets_zh["test"])
|
| 149 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 150 |
+
metric = evaluate.load("glue", "mrpc")
|
| 151 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 152 |
+
result["zh"] = ret
|
| 153 |
+
|
| 154 |
+
#模型测试 dna数据集,150 bp长度 简单版本
|
| 155 |
+
raw_datasets_dna =load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_simple_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 156 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 157 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 158 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 159 |
+
metric = evaluate.load("glue", "mrpc")
|
| 160 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 161 |
+
result["dna_sim_pair_simple_150bp"] = ret
|
| 162 |
+
|
| 163 |
+
#模型测试 dna数据集,150长度,复杂版本 不相似
|
| 164 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_150bp')['train'].train_test_split(test_size=0.2) #默认已经shuffle
|
| 165 |
+
tokenized_datasets_dna= raw_datasets_dna.map(tokenize_function, batched=True)
|
| 166 |
+
|
| 167 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 168 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 169 |
+
metric = evaluate.load("glue", "mrpc")
|
| 170 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 171 |
+
result["dna_sim_pair_150bp"] = ret
|
| 172 |
+
|
| 173 |
+
#模型测试 dna数据集,50长度,复杂版本 不相似
|
| 174 |
+
raw_datasets_dna = load_dataset('dnagpt/gene_lan_transfer', 'dna_sim_pair_50bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 175 |
+
tokenized_datasets_dna = raw_datasets_dna.map(tokenize_function, batched=True)
|
| 176 |
+
predictions = trainer.predict(tokenized_datasets_dna["test"])
|
| 177 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 178 |
+
metric = evaluate.load("glue", "mrpc")
|
| 179 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 180 |
+
result["dna_sim_pair_50bp"] = ret
|
| 181 |
+
|
| 182 |
+
#模型测试 蛋白质数据集,50长度/150bp,复杂版本 不相似
|
| 183 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_150bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 184 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 185 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 186 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 187 |
+
metric = evaluate.load("glue", "mrpc")
|
| 188 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 189 |
+
result["protein_sim_pair_150bp"] = ret
|
| 190 |
+
|
| 191 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 192 |
+
|
| 193 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'protein_sim_pair_450bp')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 194 |
+
tokenized_datasets_dna_protein = raw_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 195 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 196 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 197 |
+
metric = evaluate.load("glue", "mrpc")
|
| 198 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 199 |
+
result["protein_sim_pair_450bp"] = ret
|
| 200 |
+
|
| 201 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 202 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 203 |
+
|
| 204 |
+
# 定义翻转标签的函数
|
| 205 |
+
def flip_labels(example):
|
| 206 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 207 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 208 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 209 |
+
example['label'] = 1 - example['label']
|
| 210 |
+
return example
|
| 211 |
+
|
| 212 |
+
# 应用翻转标签函数
|
| 213 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 214 |
+
|
| 215 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 216 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 217 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 218 |
+
metric = evaluate.load("glue", "mrpc")
|
| 219 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 220 |
+
result["dna_protein_pair"] = ret
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 224 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 225 |
+
|
| 226 |
+
# 定义翻转标签的函数
|
| 227 |
+
def flip_labels(example):
|
| 228 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 229 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 230 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 231 |
+
example['label'] = 1 - example['label']
|
| 232 |
+
return example
|
| 233 |
+
|
| 234 |
+
# 应用翻转标签函数
|
| 235 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 236 |
+
|
| 237 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 238 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 239 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 240 |
+
metric = evaluate.load("glue", "mrpc")
|
| 241 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 242 |
+
result["dna_protein_pair_100"] = ret
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
|
| 248 |
+
|
| 249 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 250 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 251 |
+
|
| 252 |
+
# 定义翻转标签的函数
|
| 253 |
+
def flip_labels(example):
|
| 254 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 255 |
+
example["sentence1"] = example["sentence1"]
|
| 256 |
+
example["sentence2"] = example["sentence2"]
|
| 257 |
+
example['label'] = 1 - example['label']
|
| 258 |
+
return example
|
| 259 |
+
|
| 260 |
+
# 应用翻转标签函数
|
| 261 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 262 |
+
|
| 263 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 264 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 265 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 266 |
+
metric = evaluate.load("glue", "mrpc")
|
| 267 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 268 |
+
result["dna_protein_pair_full"] = ret
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
|
| 273 |
+
|
| 274 |
+
#模型测试 蛋白质数据集,随机版本
|
| 275 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 276 |
+
|
| 277 |
+
# 定义翻转标签的函数
|
| 278 |
+
def flip_labels(example):
|
| 279 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 280 |
+
example["sentence1"] = example["sentence1"][:150]
|
| 281 |
+
example["sentence2"] = example["sentence2"][:50]
|
| 282 |
+
example['label'] = 1 - example['label']
|
| 283 |
+
return example
|
| 284 |
+
|
| 285 |
+
# 应用翻转标签函数
|
| 286 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 287 |
+
|
| 288 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 289 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 290 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 291 |
+
metric = evaluate.load("glue", "mrpc")
|
| 292 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 293 |
+
result["dna_protein_pair_rand"] = ret
|
| 294 |
+
|
| 295 |
+
|
| 296 |
+
#模型测试 蛋白质数据集,随机版本
|
| 297 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 298 |
+
|
| 299 |
+
# 定义翻转标签的函数
|
| 300 |
+
def flip_labels(example):
|
| 301 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 302 |
+
example["sentence1"] = example["sentence1"][:300]
|
| 303 |
+
example["sentence2"] = example["sentence2"][:100]
|
| 304 |
+
example['label'] = 1 - example['label']
|
| 305 |
+
return example
|
| 306 |
+
|
| 307 |
+
# 应用翻转标签函数
|
| 308 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 309 |
+
|
| 310 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 311 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 312 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 313 |
+
metric = evaluate.load("glue", "mrpc")
|
| 314 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 315 |
+
result["dna_protein_pair_rand_100"] = ret
|
| 316 |
+
|
| 317 |
+
|
| 318 |
+
|
| 319 |
+
|
| 320 |
+
#模型测试 蛋白质数据集,随机版本
|
| 321 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 322 |
+
|
| 323 |
+
# 定义翻转标签的函数
|
| 324 |
+
def flip_labels(example):
|
| 325 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 326 |
+
example["sentence1"] = example["sentence1"]
|
| 327 |
+
example["sentence2"] = example["sentence2"]
|
| 328 |
+
example['label'] = 1 - example['label']
|
| 329 |
+
return example
|
| 330 |
+
|
| 331 |
+
# 应用翻转标签函数
|
| 332 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 333 |
+
|
| 334 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True)
|
| 335 |
+
predictions = trainer.predict(tokenized_datasets_dna_protein["test"])
|
| 336 |
+
preds = np.argmax(predictions.predictions, axis=-1)
|
| 337 |
+
metric = evaluate.load("glue", "mrpc")
|
| 338 |
+
ret = metric.compute(predictions=preds, references=predictions.label_ids)
|
| 339 |
+
result["dna_protein_pair_rand_full"] = ret
|
| 340 |
+
|
| 341 |
+
|
| 342 |
+
|
| 343 |
+
print(json.dumps(result))
|
| 344 |
+
|
finetune/gpt2_gene_multiv2_ft_en_test_others2.py
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import os
|
| 2 |
+
|
| 3 |
+
# # 设置环境变量
|
| 4 |
+
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
| 5 |
+
|
| 6 |
+
# # 打印环境变量以确认设置成功
|
| 7 |
+
# print(os.environ.get('HF_ENDPOINT'))
|
| 8 |
+
|
| 9 |
+
# import subprocess
|
| 10 |
+
# import os
|
| 11 |
+
|
| 12 |
+
# result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 13 |
+
# output = result.stdout
|
| 14 |
+
# for line in output.splitlines():
|
| 15 |
+
# if '=' in line:
|
| 16 |
+
# var, value = line.split('=', 1)
|
| 17 |
+
# os.environ[var] = value
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
from datasets import load_dataset
|
| 21 |
+
from transformers import AutoTokenizer, DataCollatorWithPadding
|
| 22 |
+
from transformers import Trainer
|
| 23 |
+
import evaluate
|
| 24 |
+
import numpy as np
|
| 25 |
+
from transformers import TrainingArguments
|
| 26 |
+
from transformers import AutoModelForSequenceClassification
|
| 27 |
+
import json
|
| 28 |
+
from transformers import set_seed
|
| 29 |
+
import random
|
| 30 |
+
import numpy as np
|
| 31 |
+
import torch
|
| 32 |
+
from tqdm import tqdm
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
# seed = 42
|
| 36 |
+
# random.seed(seed)
|
| 37 |
+
# np.random.seed(seed)
|
| 38 |
+
# torch.manual_seed(seed)
|
| 39 |
+
# torch.cuda.manual_seed_all(seed)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
# 动态生成随机种子
|
| 43 |
+
import random
|
| 44 |
+
seed = random.randint(0, 10000)
|
| 45 |
+
#print(f"Generated seed: {seed}")
|
| 46 |
+
set_seed(seed)
|
| 47 |
+
result = {}
|
| 48 |
+
result["seed"] = seed
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# 假设你的JSON文件名为 'data.json' 并且每行是一个独立的JSON对象
|
| 53 |
+
raw_datasets = load_dataset('paws-x', 'en') # 或者指定特定语言如 'zh' 表示中文,https://huggingface.co/datasets/google-research-datasets/paws-x
|
| 54 |
+
|
| 55 |
+
#分词器
|
| 56 |
+
tokenizer = AutoTokenizer.from_pretrained("dnagpt/gpt2_gene_multi_v2")
|
| 57 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
#分词函数
|
| 61 |
+
def tokenize_function(example):
|
| 62 |
+
return tokenizer(example["sentence1"], example["sentence2"], truncation=True,max_length=256, padding="max_length")
|
| 63 |
+
|
| 64 |
+
#构建分词后的数据集
|
| 65 |
+
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
|
| 66 |
+
|
| 67 |
+
#训练数据构建
|
| 68 |
+
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
#指标函数定义
|
| 72 |
+
def compute_metrics(eval_pred):
|
| 73 |
+
predictions, labels = eval_pred
|
| 74 |
+
predictions = np.argmax(predictions, axis=1)
|
| 75 |
+
return {'accuracy': (predictions==labels).sum() / len(labels)}
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
training_args = TrainingArguments(
|
| 80 |
+
output_dir="ds_job_dna_2222",
|
| 81 |
+
learning_rate=1e-5,
|
| 82 |
+
lr_scheduler_type="constant_with_warmup",
|
| 83 |
+
warmup_ratio=0.1,
|
| 84 |
+
optim='adamw_torch',
|
| 85 |
+
weight_decay=0.0,
|
| 86 |
+
seed=seed, # 使用动态生成的随机种子
|
| 87 |
+
per_device_train_batch_size=64,
|
| 88 |
+
per_device_eval_batch_size=64,
|
| 89 |
+
num_train_epochs=4, #训练多少轮
|
| 90 |
+
evaluation_strategy="epoch",
|
| 91 |
+
save_strategy="epoch",
|
| 92 |
+
logging_strategy="epoch",
|
| 93 |
+
load_best_model_at_end=True
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
#模型定义,文本分类模型
|
| 97 |
+
model = AutoModelForSequenceClassification.from_pretrained("dnagpt/gpt2_gene_multi_v2", num_labels=2)
|
| 98 |
+
model.config.pad_token_id = model.config.eos_token_id
|
| 99 |
+
|
| 100 |
+
trainer = Trainer(
|
| 101 |
+
model,
|
| 102 |
+
training_args,
|
| 103 |
+
train_dataset=tokenized_datasets["train"],
|
| 104 |
+
eval_dataset=tokenized_datasets["validation"],
|
| 105 |
+
data_collator=data_collator,
|
| 106 |
+
tokenizer=tokenizer,
|
| 107 |
+
compute_metrics=compute_metrics,
|
| 108 |
+
)
|
| 109 |
+
|
| 110 |
+
trainer.train() #模型训练
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
#模型测试 蛋白质数据集,150长度/450bp,复杂版本 不相似
|
| 116 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair')['train'].train_test_split(test_size=0.1) #默认已经shuffle
|
| 117 |
+
|
| 118 |
+
# 定义翻转标签的函数
|
| 119 |
+
def flip_labels(example):
|
| 120 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 121 |
+
example["sentence1"] = example["sentence1"]
|
| 122 |
+
example["sentence2"] = example["sentence2"]
|
| 123 |
+
example['label'] = 1 - example['label']
|
| 124 |
+
return example
|
| 125 |
+
|
| 126 |
+
# 应用翻转标签函数
|
| 127 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 128 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
# 确保模型在 GPU 上
|
| 133 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 134 |
+
model.to(device)
|
| 135 |
+
model.eval() # 进入推理模式,加速推理
|
| 136 |
+
|
| 137 |
+
# 取出测试集数据
|
| 138 |
+
test_dataset = tokenized_datasets_dna_protein["test"]
|
| 139 |
+
|
| 140 |
+
# 预存预测结果
|
| 141 |
+
preds = []
|
| 142 |
+
labels = []
|
| 143 |
+
|
| 144 |
+
# 批量大小(建议 64、128、256 视显存大小调整)
|
| 145 |
+
batch_size = 64
|
| 146 |
+
|
| 147 |
+
# 直接遍历数据集进行推理
|
| 148 |
+
for i in tqdm(range(0, len(test_dataset), batch_size), desc="Predicting"):
|
| 149 |
+
batch = test_dataset[i : i + batch_size]
|
| 150 |
+
|
| 151 |
+
# 转换为 Tensor 并移动到 GPU
|
| 152 |
+
inputs = {
|
| 153 |
+
"input_ids": torch.tensor(batch["input_ids"]).to(device),
|
| 154 |
+
"attention_mask": torch.tensor(batch["attention_mask"]).to(device),
|
| 155 |
+
}
|
| 156 |
+
batch_labels = batch["label"] # 原始标签
|
| 157 |
+
|
| 158 |
+
with torch.no_grad(): # 关闭梯度计算,减少内存占用
|
| 159 |
+
outputs = model(**inputs)
|
| 160 |
+
batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别
|
| 161 |
+
|
| 162 |
+
preds.extend(batch_preds)
|
| 163 |
+
labels.extend(batch_labels)
|
| 164 |
+
|
| 165 |
+
metric = evaluate.load("glue", "mrpc")
|
| 166 |
+
ret = metric.compute(predictions=preds, references=labels)
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
result["dna_protein_pair_full"] = ret
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
#############################################################
|
| 175 |
+
#模型测试 蛋白质数据集,随机版本
|
| 176 |
+
raw_datasets_dna_protein = load_dataset('dnagpt/gene_lan_transfer', 'dna_protein_pair_rand')['train'].train_test_split(test_size=0.5) #默认已经shuffle
|
| 177 |
+
|
| 178 |
+
# 定义翻转标签的函数
|
| 179 |
+
def flip_labels(example):
|
| 180 |
+
# 截取 sentence1 和 sentence2 的前 50 个字符,如果dna序列过长,bert分词会产生错误,只生成unk一个token
|
| 181 |
+
example["sentence1"] = example["sentence1"]
|
| 182 |
+
example["sentence2"] = example["sentence2"]
|
| 183 |
+
example['label'] = 1 - example['label']
|
| 184 |
+
return example
|
| 185 |
+
|
| 186 |
+
# 应用翻转标签函数
|
| 187 |
+
flipped_datasets_dna_protein = raw_datasets_dna_protein.map(flip_labels, batched=False)
|
| 188 |
+
tokenized_datasets_dna_protein = flipped_datasets_dna_protein.map(tokenize_function, batched=True,num_proc=4)
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
# 确保模型在 GPU 上
|
| 192 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 193 |
+
model.to(device)
|
| 194 |
+
model.eval() # 进入推理模式,加速推理
|
| 195 |
+
|
| 196 |
+
# 取出测试集数据
|
| 197 |
+
test_dataset = tokenized_datasets_dna_protein["test"]
|
| 198 |
+
|
| 199 |
+
# 预存预测结果
|
| 200 |
+
preds = []
|
| 201 |
+
labels = []
|
| 202 |
+
|
| 203 |
+
# 批量大小(建议 64、128、256 视显存大小调整)
|
| 204 |
+
batch_size = 64
|
| 205 |
+
|
| 206 |
+
# 直接遍历数据集进行推理
|
| 207 |
+
for i in tqdm(range(0, len(test_dataset), batch_size), desc="Predicting"):
|
| 208 |
+
batch = test_dataset[i : i + batch_size]
|
| 209 |
+
|
| 210 |
+
# 转换为 Tensor 并移动到 GPU
|
| 211 |
+
inputs = {
|
| 212 |
+
"input_ids": torch.tensor(batch["input_ids"]).to(device),
|
| 213 |
+
"attention_mask": torch.tensor(batch["attention_mask"]).to(device),
|
| 214 |
+
}
|
| 215 |
+
batch_labels = batch["label"] # 原始标签
|
| 216 |
+
|
| 217 |
+
with torch.no_grad(): # 关闭梯度计算,减少内存占用
|
| 218 |
+
outputs = model(**inputs)
|
| 219 |
+
batch_preds = torch.argmax(outputs.logits, axis=-1).cpu().numpy() # 取最大概率的类别
|
| 220 |
+
|
| 221 |
+
preds.extend(batch_preds)
|
| 222 |
+
labels.extend(batch_labels)
|
| 223 |
+
metric = evaluate.load("glue", "mrpc")
|
| 224 |
+
ret = metric.compute(predictions=preds, references=labels)
|
| 225 |
+
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
result["dna_protein_pair_rand_full"] = ret
|
| 229 |
+
|
| 230 |
+
|
| 231 |
+
|
| 232 |
+
print(json.dumps(result))
|
| 233 |
+
|
finetune/run_ft_all_2.sh
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
#source /etc/network_turbo
|
| 3 |
+
|
| 4 |
+
export HF_ENDPOINT=https://hf-mirror.com
|
| 5 |
+
|
| 6 |
+
for ((i=0;i<1000;i++))
|
| 7 |
+
do
|
| 8 |
+
echo "----------------------------------------------"$i
|
| 9 |
+
python gpt2_gene_multiv1_ft_en_test_others2.py >> gpt2_gene_multiv1_ft_en2.json
|
| 10 |
+
done
|
pretrain/gpt2_gene_multi_v1/ds_zero2_no_offload.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"fp16": {
|
| 3 |
+
"enabled": "auto",
|
| 4 |
+
"loss_scale": 0,
|
| 5 |
+
"loss_scale_window": 100,
|
| 6 |
+
"initial_scale_power": 16,
|
| 7 |
+
"hysteresis": 2,
|
| 8 |
+
"min_loss_scale": 1e-10
|
| 9 |
+
},
|
| 10 |
+
|
| 11 |
+
"zero_optimization": {
|
| 12 |
+
"stage": 2,
|
| 13 |
+
"allgather_partitions": true,
|
| 14 |
+
"allgather_bucket_size": 1e8,
|
| 15 |
+
"overlap_comm": true,
|
| 16 |
+
"reduce_scatter": true,
|
| 17 |
+
"reduce_bucket_size": 1e8,
|
| 18 |
+
"contiguous_gradients": true
|
| 19 |
+
},
|
| 20 |
+
|
| 21 |
+
"gradient_accumulation_steps": "auto",
|
| 22 |
+
"gradient_clipping": "auto",
|
| 23 |
+
"steps_per_print": 2000,
|
| 24 |
+
"train_batch_size": "auto",
|
| 25 |
+
"train_micro_batch_size_per_gpu": "auto",
|
| 26 |
+
"wall_clock_breakdown": false
|
| 27 |
+
}
|
pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/special_tokens_map-checkpoint.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"eos_token": "<|endoftext|>",
|
| 3 |
+
"pad_token": "<pad>",
|
| 4 |
+
"unk_token": "<unk>"
|
| 5 |
+
}
|
pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/tokenizer_config-checkpoint.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"added_tokens_decoder": {
|
| 3 |
+
"0": {
|
| 4 |
+
"content": "<|endoftext|>",
|
| 5 |
+
"lstrip": false,
|
| 6 |
+
"normalized": false,
|
| 7 |
+
"rstrip": false,
|
| 8 |
+
"single_word": false,
|
| 9 |
+
"special": true
|
| 10 |
+
},
|
| 11 |
+
"1": {
|
| 12 |
+
"content": "<pad>",
|
| 13 |
+
"lstrip": false,
|
| 14 |
+
"normalized": false,
|
| 15 |
+
"rstrip": false,
|
| 16 |
+
"single_word": false,
|
| 17 |
+
"special": true
|
| 18 |
+
},
|
| 19 |
+
"2": {
|
| 20 |
+
"content": "<unk>",
|
| 21 |
+
"lstrip": false,
|
| 22 |
+
"normalized": false,
|
| 23 |
+
"rstrip": false,
|
| 24 |
+
"single_word": false,
|
| 25 |
+
"special": true
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"clean_up_tokenization_spaces": false,
|
| 29 |
+
"eos_token": "<|endoftext|>",
|
| 30 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 31 |
+
"pad_token": "<pad>",
|
| 32 |
+
"tokenizer_class": "PreTrainedTokenizerFast",
|
| 33 |
+
"unk_token": "<unk>"
|
| 34 |
+
}
|
pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/special_tokens_map.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"eos_token": "<|endoftext|>",
|
| 3 |
+
"pad_token": "<pad>",
|
| 4 |
+
"unk_token": "<unk>"
|
| 5 |
+
}
|
pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/tokenizer.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
pretrain/gpt2_gene_multi_v1/gpt2_gene_multi_tokenizer/tokenizer_config.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"added_tokens_decoder": {
|
| 3 |
+
"0": {
|
| 4 |
+
"content": "<|endoftext|>",
|
| 5 |
+
"lstrip": false,
|
| 6 |
+
"normalized": false,
|
| 7 |
+
"rstrip": false,
|
| 8 |
+
"single_word": false,
|
| 9 |
+
"special": true
|
| 10 |
+
},
|
| 11 |
+
"1": {
|
| 12 |
+
"content": "<pad>",
|
| 13 |
+
"lstrip": false,
|
| 14 |
+
"normalized": false,
|
| 15 |
+
"rstrip": false,
|
| 16 |
+
"single_word": false,
|
| 17 |
+
"special": true
|
| 18 |
+
},
|
| 19 |
+
"2": {
|
| 20 |
+
"content": "<unk>",
|
| 21 |
+
"lstrip": false,
|
| 22 |
+
"normalized": false,
|
| 23 |
+
"rstrip": false,
|
| 24 |
+
"single_word": false,
|
| 25 |
+
"special": true
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"clean_up_tokenization_spaces": false,
|
| 29 |
+
"eos_token": "<|endoftext|>",
|
| 30 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 31 |
+
"pad_token": "<pad>",
|
| 32 |
+
"tokenizer_class": "PreTrainedTokenizerFast",
|
| 33 |
+
"unk_token": "<unk>"
|
| 34 |
+
}
|
pretrain/gpt2_gene_multi_v1/run_clm_pt.py
ADDED
|
@@ -0,0 +1,646 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
# coding=utf-8
|
| 3 |
+
# Copyright 2020 The HuggingFace Inc. team. All rights reserved.
|
| 4 |
+
#
|
| 5 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 6 |
+
# you may not use this file except in compliance with the License.
|
| 7 |
+
# You may obtain a copy of the License at
|
| 8 |
+
#
|
| 9 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 10 |
+
#
|
| 11 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 12 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 13 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 14 |
+
# See the License for the specific language governing permissions and
|
| 15 |
+
# limitations under the License.
|
| 16 |
+
"""
|
| 17 |
+
Fine-tuning the library models for causal language modeling (GPT, GPT-2, CTRL, ...) on a text file or a dataset.
|
| 18 |
+
|
| 19 |
+
Here is the full list of checkpoints on the hub that can be fine-tuned by this script:
|
| 20 |
+
https://huggingface.co/models?filter=text-generation
|
| 21 |
+
"""
|
| 22 |
+
# You can also adapt this script on your own causal language modeling task. Pointers for this are left as comments.
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
import subprocess
|
| 26 |
+
import os
|
| 27 |
+
|
| 28 |
+
result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
|
| 29 |
+
output = result.stdout
|
| 30 |
+
for line in output.splitlines():
|
| 31 |
+
if '=' in line:
|
| 32 |
+
var, value = line.split('=', 1)
|
| 33 |
+
os.environ[var] = value
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
import logging
|
| 38 |
+
import numpy as np
|
| 39 |
+
import math
|
| 40 |
+
import os
|
| 41 |
+
import sys
|
| 42 |
+
from dataclasses import dataclass, field
|
| 43 |
+
from itertools import chain
|
| 44 |
+
from typing import Optional, List, Dict, Any, Mapping
|
| 45 |
+
from pathlib import Path
|
| 46 |
+
import datasets
|
| 47 |
+
import torch
|
| 48 |
+
from datasets import load_dataset, concatenate_datasets
|
| 49 |
+
|
| 50 |
+
import transformers
|
| 51 |
+
from transformers import (
|
| 52 |
+
CONFIG_MAPPING,
|
| 53 |
+
MODEL_FOR_CAUSAL_LM_MAPPING,
|
| 54 |
+
AutoConfig,
|
| 55 |
+
AutoModelForCausalLM,
|
| 56 |
+
LlamaForCausalLM,
|
| 57 |
+
LlamaTokenizer,
|
| 58 |
+
AutoTokenizer,
|
| 59 |
+
HfArgumentParser,
|
| 60 |
+
Trainer,
|
| 61 |
+
TrainingArguments,
|
| 62 |
+
is_torch_tpu_available,
|
| 63 |
+
set_seed,
|
| 64 |
+
)
|
| 65 |
+
from transformers.testing_utils import CaptureLogger
|
| 66 |
+
from transformers.trainer_utils import get_last_checkpoint
|
| 67 |
+
from transformers.utils import send_example_telemetry
|
| 68 |
+
from transformers.utils.versions import require_version
|
| 69 |
+
|
| 70 |
+
from sklearn.metrics import accuracy_score
|
| 71 |
+
from peft import LoraConfig, TaskType, get_peft_model, PeftModel, get_peft_model_state_dict
|
| 72 |
+
from transformers.trainer_utils import PREFIX_CHECKPOINT_DIR
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
class SavePeftModelCallback(transformers.TrainerCallback):
|
| 76 |
+
def save_model(self, args, state, kwargs):
|
| 77 |
+
if state.best_model_checkpoint is not None:
|
| 78 |
+
checkpoint_folder = os.path.join(state.best_model_checkpoint, "pt_lora_model")
|
| 79 |
+
else:
|
| 80 |
+
checkpoint_folder = os.path.join(args.output_dir, f"{PREFIX_CHECKPOINT_DIR}-{state.global_step}")
|
| 81 |
+
|
| 82 |
+
peft_model_path = os.path.join(checkpoint_folder, "pt_lora_model")
|
| 83 |
+
kwargs["model"].save_pretrained(peft_model_path)
|
| 84 |
+
kwargs["tokenizer"].save_pretrained(peft_model_path)
|
| 85 |
+
|
| 86 |
+
def on_save(self, args, state, control, **kwargs):
|
| 87 |
+
self.save_model(args, state, kwargs)
|
| 88 |
+
return control
|
| 89 |
+
|
| 90 |
+
def on_train_end(self, args, state, control, **kwargs):
|
| 91 |
+
peft_model_path = os.path.join(args.output_dir, "pt_lora_model")
|
| 92 |
+
kwargs["model"].save_pretrained(peft_model_path)
|
| 93 |
+
kwargs["tokenizer"].save_pretrained(peft_model_path)
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
def accuracy(predictions, references, normalize=True, sample_weight=None):
|
| 97 |
+
return {
|
| 98 |
+
"accuracy": float(
|
| 99 |
+
accuracy_score(references, predictions, normalize=normalize, sample_weight=sample_weight)
|
| 100 |
+
)
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
def compute_metrics(eval_preds):
|
| 105 |
+
preds, labels = eval_preds
|
| 106 |
+
# preds have the same shape as the labels, after the argmax(-1) has been calculated
|
| 107 |
+
# by preprocess_logits_for_metrics but we need to shift the labels
|
| 108 |
+
labels = labels[:, 1:].reshape(-1)
|
| 109 |
+
preds = preds[:, :-1].reshape(-1)
|
| 110 |
+
return accuracy(predictions=preds, references=labels)
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
def preprocess_logits_for_metrics(logits, labels):
|
| 114 |
+
if isinstance(logits, tuple):
|
| 115 |
+
# Depending on the model and config, logits may contain extra tensors,
|
| 116 |
+
# like past_key_values, but logits always come first
|
| 117 |
+
logits = logits[0]
|
| 118 |
+
return logits.argmax(dim=-1)
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
def fault_tolerance_data_collator(features: List) -> Dict[str, Any]:
|
| 122 |
+
if not isinstance(features[0], Mapping):
|
| 123 |
+
features = [vars(f) for f in features]
|
| 124 |
+
first = features[0]
|
| 125 |
+
batch = {}
|
| 126 |
+
|
| 127 |
+
# Special handling for labels.
|
| 128 |
+
# Ensure that tensor is created with the correct type
|
| 129 |
+
# (it should be automatically the case, but let's make sure of it.)
|
| 130 |
+
if "label" in first and first["label"] is not None:
|
| 131 |
+
label = first["label"].item() if isinstance(first["label"], torch.Tensor) else first["label"]
|
| 132 |
+
dtype = torch.long if isinstance(label, int) else torch.float
|
| 133 |
+
batch["labels"] = torch.tensor([f["label"] for f in features], dtype=dtype)
|
| 134 |
+
elif "label_ids" in first and first["label_ids"] is not None:
|
| 135 |
+
if isinstance(first["label_ids"], torch.Tensor):
|
| 136 |
+
batch["labels"] = torch.stack([f["label_ids"] for f in features])
|
| 137 |
+
else:
|
| 138 |
+
dtype = torch.long if isinstance(first["label_ids"][0], int) else torch.float
|
| 139 |
+
batch["labels"] = torch.tensor([f["label_ids"] for f in features], dtype=dtype)
|
| 140 |
+
|
| 141 |
+
# Handling of all other possible keys.
|
| 142 |
+
# Again, we will use the first element to figure out which key/values are not None for this model.
|
| 143 |
+
|
| 144 |
+
try:
|
| 145 |
+
for k, v in first.items():
|
| 146 |
+
if k not in ("label", "label_ids") and v is not None and not isinstance(v, str):
|
| 147 |
+
if isinstance(v, torch.Tensor):
|
| 148 |
+
batch[k] = torch.stack([f[k] for f in features])
|
| 149 |
+
elif isinstance(v, np.ndarray):
|
| 150 |
+
batch[k] = torch.tensor(np.stack([f[k] for f in features]))
|
| 151 |
+
else:
|
| 152 |
+
batch[k] = torch.tensor([f[k] for f in features])
|
| 153 |
+
except ValueError: # quick fix by simply take the first example
|
| 154 |
+
for k, v in first.items():
|
| 155 |
+
if k not in ("label", "label_ids") and v is not None and not isinstance(v, str):
|
| 156 |
+
if isinstance(v, torch.Tensor):
|
| 157 |
+
batch[k] = torch.stack([features[0][k]] * len(features))
|
| 158 |
+
elif isinstance(v, np.ndarray):
|
| 159 |
+
batch[k] = torch.tensor(np.stack([features[0][k]] * len(features)))
|
| 160 |
+
else:
|
| 161 |
+
batch[k] = torch.tensor([features[0][k]] * len(features))
|
| 162 |
+
|
| 163 |
+
return batch
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
MODEL_CONFIG_CLASSES = list(MODEL_FOR_CAUSAL_LM_MAPPING.keys())
|
| 167 |
+
MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES)
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
@dataclass
|
| 171 |
+
class ModelArguments:
|
| 172 |
+
"""
|
| 173 |
+
Arguments pertaining to which model/config/tokenizer we are going to fine-tune, or train from scratch.
|
| 174 |
+
"""
|
| 175 |
+
|
| 176 |
+
model_name_or_path: Optional[str] = field(
|
| 177 |
+
default=None,
|
| 178 |
+
metadata={
|
| 179 |
+
"help": (
|
| 180 |
+
"The model checkpoint for weights initialization.Don't set if you want to train a model from scratch."
|
| 181 |
+
)
|
| 182 |
+
},
|
| 183 |
+
)
|
| 184 |
+
tokenizer_name_or_path: Optional[str] = field(
|
| 185 |
+
default=None,
|
| 186 |
+
metadata={
|
| 187 |
+
"help": (
|
| 188 |
+
"The tokenizer for weights initialization.Don't set if you want to train a model from scratch."
|
| 189 |
+
)
|
| 190 |
+
},
|
| 191 |
+
)
|
| 192 |
+
model_type: Optional[str] = field(
|
| 193 |
+
default=None,
|
| 194 |
+
metadata={"help": "If training from scratch, pass a model type from the list: " + ", ".join(MODEL_TYPES)},
|
| 195 |
+
)
|
| 196 |
+
config_overrides: Optional[str] = field(
|
| 197 |
+
default=None,
|
| 198 |
+
metadata={
|
| 199 |
+
"help": (
|
| 200 |
+
"Override some existing default config settings when a model is trained from scratch. Example: "
|
| 201 |
+
"n_embd=10,resid_pdrop=0.2,scale_attn_weights=false,summary_type=cls_index"
|
| 202 |
+
)
|
| 203 |
+
},
|
| 204 |
+
)
|
| 205 |
+
config_name: Optional[str] = field(
|
| 206 |
+
default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"}
|
| 207 |
+
)
|
| 208 |
+
tokenizer_name: Optional[str] = field(
|
| 209 |
+
default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"}
|
| 210 |
+
)
|
| 211 |
+
cache_dir: Optional[str] = field(
|
| 212 |
+
default=None,
|
| 213 |
+
metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"},
|
| 214 |
+
)
|
| 215 |
+
use_fast_tokenizer: bool = field(
|
| 216 |
+
default=True,
|
| 217 |
+
metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."},
|
| 218 |
+
)
|
| 219 |
+
model_revision: str = field(
|
| 220 |
+
default="main",
|
| 221 |
+
metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."},
|
| 222 |
+
)
|
| 223 |
+
use_auth_token: bool = field(
|
| 224 |
+
default=False,
|
| 225 |
+
metadata={
|
| 226 |
+
"help": (
|
| 227 |
+
"Will use the token generated when running `huggingface-cli login` (necessary to use this script "
|
| 228 |
+
"with private models)."
|
| 229 |
+
)
|
| 230 |
+
},
|
| 231 |
+
)
|
| 232 |
+
torch_dtype: Optional[str] = field(
|
| 233 |
+
default=None,
|
| 234 |
+
metadata={
|
| 235 |
+
"help": (
|
| 236 |
+
"Override the default `torch.dtype` and load the model under this dtype. If `auto` is passed, the "
|
| 237 |
+
"dtype will be automatically derived from the model's weights."
|
| 238 |
+
),
|
| 239 |
+
"choices": ["auto", "bfloat16", "float16", "float32"],
|
| 240 |
+
},
|
| 241 |
+
)
|
| 242 |
+
|
| 243 |
+
def __post_init__(self):
|
| 244 |
+
if self.config_overrides is not None and (self.config_name is not None or self.model_name_or_path is not None):
|
| 245 |
+
raise ValueError(
|
| 246 |
+
"--config_overrides can't be used in combination with --config_name or --model_name_or_path"
|
| 247 |
+
)
|
| 248 |
+
|
| 249 |
+
|
| 250 |
+
@dataclass
|
| 251 |
+
class DataTrainingArguments:
|
| 252 |
+
"""
|
| 253 |
+
Arguments pertaining to what data we are going to input our model for training and eval.
|
| 254 |
+
"""
|
| 255 |
+
|
| 256 |
+
dataset_dir: Optional[str] = field(
|
| 257 |
+
default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."}
|
| 258 |
+
)
|
| 259 |
+
dataset_config_name: Optional[str] = field(
|
| 260 |
+
default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."}
|
| 261 |
+
)
|
| 262 |
+
train_file: Optional[str] = field(default=None, metadata={"help": "The input training data file (a text file)."})
|
| 263 |
+
validation_file: Optional[str] = field(
|
| 264 |
+
default=None,
|
| 265 |
+
metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."},
|
| 266 |
+
)
|
| 267 |
+
max_train_samples: Optional[int] = field(
|
| 268 |
+
default=None,
|
| 269 |
+
metadata={
|
| 270 |
+
"help": (
|
| 271 |
+
"For debugging purposes or quicker training, truncate the number of training examples to this "
|
| 272 |
+
"value if set."
|
| 273 |
+
)
|
| 274 |
+
},
|
| 275 |
+
)
|
| 276 |
+
max_eval_samples: Optional[int] = field(
|
| 277 |
+
default=None,
|
| 278 |
+
metadata={
|
| 279 |
+
"help": (
|
| 280 |
+
"For debugging purposes or quicker training, truncate the number of evaluation examples to this "
|
| 281 |
+
"value if set."
|
| 282 |
+
)
|
| 283 |
+
},
|
| 284 |
+
)
|
| 285 |
+
streaming: bool = field(default=False, metadata={"help": "Enable streaming mode"})
|
| 286 |
+
block_size: Optional[int] = field(
|
| 287 |
+
default=None,
|
| 288 |
+
metadata={
|
| 289 |
+
"help": (
|
| 290 |
+
"Optional input sequence length after tokenization. "
|
| 291 |
+
"The training dataset will be truncated in block of this size for training. "
|
| 292 |
+
"Default to the model max input length for single sentence inputs (take into account special tokens)."
|
| 293 |
+
)
|
| 294 |
+
},
|
| 295 |
+
)
|
| 296 |
+
overwrite_cache: bool = field(
|
| 297 |
+
default=False, metadata={"help": "Overwrite the cached training and evaluation sets"}
|
| 298 |
+
)
|
| 299 |
+
validation_split_percentage: Optional[float] = field(
|
| 300 |
+
default=0.05,
|
| 301 |
+
metadata={
|
| 302 |
+
"help": "The percentage of the train set used as validation set in case there's no validation split"
|
| 303 |
+
},
|
| 304 |
+
)
|
| 305 |
+
preprocessing_num_workers: Optional[int] = field(
|
| 306 |
+
default=None,
|
| 307 |
+
metadata={"help": "The number of processes to use for the preprocessing."},
|
| 308 |
+
)
|
| 309 |
+
keep_linebreaks: bool = field(
|
| 310 |
+
default=True, metadata={"help": "Whether to keep line breaks when using TXT files or not."}
|
| 311 |
+
)
|
| 312 |
+
data_cache_dir: Optional[str] = field(default="./", metadata={"help": "The datasets processed stored"})
|
| 313 |
+
|
| 314 |
+
def __post_init__(self):
|
| 315 |
+
if self.streaming:
|
| 316 |
+
require_version("datasets>=2.0.0", "The streaming feature requires `datasets>=2.0.0`")
|
| 317 |
+
|
| 318 |
+
|
| 319 |
+
@dataclass
|
| 320 |
+
class MyTrainingArguments(TrainingArguments):
|
| 321 |
+
trainable : Optional[str] = field(default="q_proj,v_proj")
|
| 322 |
+
lora_rank : Optional[int] = field(default=8)
|
| 323 |
+
lora_dropout : Optional[float] = field(default=0.1)
|
| 324 |
+
lora_alpha : Optional[float] = field(default=32.)
|
| 325 |
+
modules_to_save : Optional[str] = field(default=None)
|
| 326 |
+
debug_mode : Optional[bool] = field(default=False)
|
| 327 |
+
peft_path : Optional[str] = field(default=None)
|
| 328 |
+
|
| 329 |
+
|
| 330 |
+
logger = logging.getLogger(__name__)
|
| 331 |
+
|
| 332 |
+
|
| 333 |
+
def main():
|
| 334 |
+
|
| 335 |
+
parser = HfArgumentParser((ModelArguments, DataTrainingArguments, MyTrainingArguments))
|
| 336 |
+
if len(sys.argv) == 2 and sys.argv[1].endswith(".json"):
|
| 337 |
+
# If we pass only one argument to the script and it's the path to a json file,
|
| 338 |
+
# let's parse it to get our arguments.
|
| 339 |
+
model_args, data_args, training_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]))
|
| 340 |
+
else:
|
| 341 |
+
model_args, data_args, training_args = parser.parse_args_into_dataclasses()
|
| 342 |
+
|
| 343 |
+
# Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The
|
| 344 |
+
# information sent is the one passed as arguments along with your Python/PyTorch versions.
|
| 345 |
+
send_example_telemetry("run_clm", model_args, data_args)
|
| 346 |
+
|
| 347 |
+
# Setup logging
|
| 348 |
+
logging.basicConfig(format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",datefmt="%m/%d/%Y %H:%M:%S",
|
| 349 |
+
level=logging.INFO, # if training_args.local_rank in [-1, 0] else logging.WARN,
|
| 350 |
+
handlers=[logging.StreamHandler(sys.stdout)],)
|
| 351 |
+
|
| 352 |
+
|
| 353 |
+
if training_args.should_log:
|
| 354 |
+
# The default of training_args.log_level is passive, so we set log level at info here to have that default.
|
| 355 |
+
transformers.utils.logging.set_verbosity_info()
|
| 356 |
+
|
| 357 |
+
log_level = training_args.get_process_log_level()
|
| 358 |
+
logger.setLevel(log_level)
|
| 359 |
+
datasets.utils.logging.set_verbosity(log_level)
|
| 360 |
+
transformers.utils.logging.set_verbosity(log_level)
|
| 361 |
+
transformers.utils.logging.enable_default_handler()
|
| 362 |
+
transformers.utils.logging.enable_explicit_format()
|
| 363 |
+
# transformers.tokenization_utils.logging.set_verbosity_warning()
|
| 364 |
+
|
| 365 |
+
# Log on each process the small summary:
|
| 366 |
+
logger.warning(
|
| 367 |
+
f"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}"
|
| 368 |
+
+ f"distributed training: {bool(training_args.local_rank != -1)}, 16-bits training: {training_args.fp16}"
|
| 369 |
+
)
|
| 370 |
+
|
| 371 |
+
# Detecting last checkpoint.
|
| 372 |
+
last_checkpoint = None
|
| 373 |
+
if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir:
|
| 374 |
+
last_checkpoint = get_last_checkpoint(training_args.output_dir)
|
| 375 |
+
if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0:
|
| 376 |
+
raise ValueError(
|
| 377 |
+
f"Output directory ({training_args.output_dir}) already exists and is not empty. "
|
| 378 |
+
"Use --overwrite_output_dir to overcome."
|
| 379 |
+
)
|
| 380 |
+
elif last_checkpoint is not None and training_args.resume_from_checkpoint is None:
|
| 381 |
+
logger.info(
|
| 382 |
+
f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change "
|
| 383 |
+
"the `--output_dir` or add `--overwrite_output_dir` to train from scratch."
|
| 384 |
+
)
|
| 385 |
+
|
| 386 |
+
# Set seed before initializing model.
|
| 387 |
+
set_seed(training_args.seed)
|
| 388 |
+
|
| 389 |
+
config_kwargs = {
|
| 390 |
+
"cache_dir": model_args.cache_dir,
|
| 391 |
+
"revision": model_args.model_revision,
|
| 392 |
+
"use_auth_token": True if model_args.use_auth_token else None,
|
| 393 |
+
}
|
| 394 |
+
if model_args.config_name:
|
| 395 |
+
config = AutoConfig.from_pretrained(model_args.config_name, **config_kwargs)
|
| 396 |
+
elif model_args.model_name_or_path:
|
| 397 |
+
config = AutoConfig.from_pretrained(model_args.model_name_or_path, **config_kwargs)
|
| 398 |
+
else:
|
| 399 |
+
config = CONFIG_MAPPING[model_args.model_type]()
|
| 400 |
+
logger.warning("You are instantiating a new config instance from scratch.")
|
| 401 |
+
if model_args.config_overrides is not None:
|
| 402 |
+
logger.info(f"Overriding config: {model_args.config_overrides}")
|
| 403 |
+
config.update_from_string(model_args.config_overrides)
|
| 404 |
+
logger.info(f"New config: {config}")
|
| 405 |
+
|
| 406 |
+
tokenizer_kwargs = {
|
| 407 |
+
"cache_dir": model_args.cache_dir,
|
| 408 |
+
"use_fast": model_args.use_fast_tokenizer,
|
| 409 |
+
"revision": model_args.model_revision,
|
| 410 |
+
"use_auth_token": True if model_args.use_auth_token else None,
|
| 411 |
+
}
|
| 412 |
+
if model_args.tokenizer_name:
|
| 413 |
+
tokenizer = AutoTokenizer.from_pretrained(model_args.tokenizer_name, **tokenizer_kwargs)
|
| 414 |
+
elif model_args.tokenizer_name_or_path:
|
| 415 |
+
tokenizer = AutoTokenizer.from_pretrained(model_args.tokenizer_name_or_path, **tokenizer_kwargs)
|
| 416 |
+
else:
|
| 417 |
+
raise ValueError(
|
| 418 |
+
"You are instantiating a new tokenizer from scratch. This is not supported by this script."
|
| 419 |
+
"You can do it from another script, save it, and load it from here, using --tokenizer_name."
|
| 420 |
+
)
|
| 421 |
+
|
| 422 |
+
# Preprocessing the datasets.
|
| 423 |
+
# First we tokenize all the texts.
|
| 424 |
+
# since this will be pickled to avoid _LazyModule error in Hasher force logger loading before tokenize_function
|
| 425 |
+
tok_logger = transformers.utils.logging.get_logger("transformers.tokenization_utils_base")
|
| 426 |
+
|
| 427 |
+
def tokenize_function(examples):
|
| 428 |
+
with CaptureLogger(tok_logger) as cl:
|
| 429 |
+
output = tokenizer(examples["text"])
|
| 430 |
+
# clm input could be much much longer than block_size
|
| 431 |
+
if "Token indices sequence length is longer than the" in cl.out:
|
| 432 |
+
tok_logger.warning(
|
| 433 |
+
"^^^^^^^^^^^^^^^^ Please ignore the warning above - this long input will be chunked into smaller bits"
|
| 434 |
+
" before being passed to the model."
|
| 435 |
+
)
|
| 436 |
+
return output
|
| 437 |
+
if data_args.block_size is None:
|
| 438 |
+
block_size = tokenizer.model_max_length
|
| 439 |
+
if block_size > 1024:
|
| 440 |
+
logger.warning(
|
| 441 |
+
"The chosen tokenizer supports a `model_max_length` that is longer than the default `block_size` value"
|
| 442 |
+
" of 1024. If you would like to use a longer `block_size` up to `tokenizer.model_max_length` you can"
|
| 443 |
+
" override this default with `--block_size xxx`."
|
| 444 |
+
)
|
| 445 |
+
block_size = 1024
|
| 446 |
+
else:
|
| 447 |
+
if data_args.block_size > tokenizer.model_max_length:
|
| 448 |
+
logger.warning(
|
| 449 |
+
f"The block_size passed ({data_args.block_size}) is larger than the maximum length for the model"
|
| 450 |
+
f"({tokenizer.model_max_length}). Using block_size={tokenizer.model_max_length}."
|
| 451 |
+
)
|
| 452 |
+
block_size = min(data_args.block_size, tokenizer.model_max_length)
|
| 453 |
+
|
| 454 |
+
# Main data processing function that will concatenate all texts from our dataset and generate chunks of block_size.
|
| 455 |
+
def group_texts(examples):
|
| 456 |
+
# Concatenate all texts.
|
| 457 |
+
concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
|
| 458 |
+
total_length = len(concatenated_examples[list(examples.keys())[0]])
|
| 459 |
+
# We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
|
| 460 |
+
# customize this part to your needs.
|
| 461 |
+
if total_length >= block_size:
|
| 462 |
+
total_length = (total_length // block_size) * block_size
|
| 463 |
+
# Split by chunks of max_len.
|
| 464 |
+
result = {
|
| 465 |
+
k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
|
| 466 |
+
for k, t in concatenated_examples.items()
|
| 467 |
+
}
|
| 468 |
+
result["labels"] = result["input_ids"].copy()
|
| 469 |
+
return result
|
| 470 |
+
with training_args.main_process_first(desc="dataset map tokenization and grouping"):
|
| 471 |
+
lm_datasets = []
|
| 472 |
+
path = Path(data_args.dataset_dir)
|
| 473 |
+
files = [file.name for file in path.glob("*.txt")]
|
| 474 |
+
if training_args.debug_mode is True:
|
| 475 |
+
files = [files[0]]
|
| 476 |
+
for idx, file in enumerate(files):
|
| 477 |
+
data_file = os.path.join(path, file)
|
| 478 |
+
filename = ''.join(file.split(".")[:-1])
|
| 479 |
+
cache_path = os.path.join(data_args.data_cache_dir, filename)
|
| 480 |
+
os.makedirs(cache_path, exist_ok=True)
|
| 481 |
+
try:
|
| 482 |
+
processed_dataset = datasets.load_from_disk(cache_path, keep_in_memory=False)
|
| 483 |
+
logger.info(f'training datasets-{filename} has been loaded from disk')
|
| 484 |
+
except Exception:
|
| 485 |
+
cache_dir = os.path.join(data_args.data_cache_dir, filename+"_text")
|
| 486 |
+
os.makedirs(cache_dir, exist_ok=True)
|
| 487 |
+
raw_dataset = load_dataset("text", data_files=data_file, cache_dir=cache_dir, keep_in_memory=False)
|
| 488 |
+
logger.info(f"{file} has been loaded")
|
| 489 |
+
tokenized_dataset = raw_dataset.map(
|
| 490 |
+
tokenize_function,
|
| 491 |
+
batched=True,
|
| 492 |
+
num_proc=data_args.preprocessing_num_workers,
|
| 493 |
+
remove_columns="text",
|
| 494 |
+
load_from_cache_file=True,
|
| 495 |
+
keep_in_memory=False,
|
| 496 |
+
cache_file_names = {k: os.path.join(cache_dir, 'tokenized.arrow') for k in raw_dataset},
|
| 497 |
+
desc="Running tokenizer on dataset",
|
| 498 |
+
)
|
| 499 |
+
grouped_datasets = tokenized_dataset.map(
|
| 500 |
+
group_texts,
|
| 501 |
+
batched=True,
|
| 502 |
+
num_proc=data_args.preprocessing_num_workers,
|
| 503 |
+
load_from_cache_file=True,
|
| 504 |
+
keep_in_memory=False,
|
| 505 |
+
cache_file_names = {k: os.path.join(cache_dir, 'grouped.arrow') for k in tokenized_dataset},
|
| 506 |
+
desc=f"Grouping texts in chunks of {block_size}",
|
| 507 |
+
)
|
| 508 |
+
processed_dataset = grouped_datasets
|
| 509 |
+
processed_dataset.save_to_disk(cache_path)
|
| 510 |
+
if idx == 0:
|
| 511 |
+
lm_datasets = processed_dataset['train']
|
| 512 |
+
else:
|
| 513 |
+
assert lm_datasets.features.type == processed_dataset["train"].features.type
|
| 514 |
+
lm_datasets = concatenate_datasets([lm_datasets, processed_dataset["train"]])
|
| 515 |
+
|
| 516 |
+
lm_datasets = lm_datasets.train_test_split(test_size = data_args.validation_split_percentage)
|
| 517 |
+
|
| 518 |
+
if training_args.do_train:
|
| 519 |
+
train_dataset = lm_datasets['train']
|
| 520 |
+
if data_args.max_train_samples is not None:
|
| 521 |
+
max_train_samples = min(len(train_dataset), data_args.max_train_samples)
|
| 522 |
+
train_dataset = train_dataset.select(range(max_train_samples))
|
| 523 |
+
logger.info(f"Num train_samples {len(train_dataset)}")
|
| 524 |
+
logger.info("training example:")
|
| 525 |
+
logger.info(tokenizer.decode(train_dataset[0]['input_ids']))
|
| 526 |
+
if training_args.do_eval:
|
| 527 |
+
eval_dataset = lm_datasets["test"]
|
| 528 |
+
if data_args.max_eval_samples is not None:
|
| 529 |
+
max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples)
|
| 530 |
+
eval_dataset = eval_dataset.select(range(max_eval_samples))
|
| 531 |
+
logger.info(f"Num eval_samples {len(eval_dataset)}")
|
| 532 |
+
logger.info("training example:")
|
| 533 |
+
logger.info(tokenizer.decode(eval_dataset[0]['input_ids']))
|
| 534 |
+
|
| 535 |
+
|
| 536 |
+
|
| 537 |
+
if model_args.model_name_or_path:
|
| 538 |
+
torch_dtype = (
|
| 539 |
+
model_args.torch_dtype
|
| 540 |
+
if model_args.torch_dtype in ["auto", None]
|
| 541 |
+
else getattr(torch, model_args.torch_dtype)
|
| 542 |
+
)
|
| 543 |
+
model = LlamaForCausalLM.from_pretrained(
|
| 544 |
+
model_args.model_name_or_path,
|
| 545 |
+
from_tf=bool(".ckpt" in model_args.model_name_or_path),
|
| 546 |
+
config=config,
|
| 547 |
+
cache_dir=model_args.cache_dir,
|
| 548 |
+
revision=model_args.model_revision,
|
| 549 |
+
use_auth_token=True if model_args.use_auth_token else None,
|
| 550 |
+
torch_dtype=torch_dtype,
|
| 551 |
+
low_cpu_mem_usage=True
|
| 552 |
+
)
|
| 553 |
+
else:
|
| 554 |
+
model = AutoModelForCausalLM.from_config(config)
|
| 555 |
+
n_params = sum({p.data_ptr(): p.numel() for p in model.parameters()}.values())
|
| 556 |
+
logger.info(f"Training new model from scratch - Total size={n_params/2**20:.2f}M params")
|
| 557 |
+
|
| 558 |
+
model_vocab_size = model.get_output_embeddings().weight.size(0)
|
| 559 |
+
|
| 560 |
+
model.resize_token_embeddings(len(tokenizer))
|
| 561 |
+
|
| 562 |
+
"""
|
| 563 |
+
if training_args.peft_path is not None:
|
| 564 |
+
logger.info("Peft from pre-trained model")
|
| 565 |
+
model = PeftModel.from_pretrained(model, training_args.peft_path)
|
| 566 |
+
else:
|
| 567 |
+
logger.info("Init new peft model")
|
| 568 |
+
target_modules = training_args.trainable.split(',')
|
| 569 |
+
modules_to_save = training_args.modules_to_save
|
| 570 |
+
if modules_to_save is not None:
|
| 571 |
+
modules_to_save = modules_to_save.split(',')
|
| 572 |
+
lora_rank = training_args.lora_rank
|
| 573 |
+
lora_dropout = training_args.lora_dropout
|
| 574 |
+
lora_alpha = training_args.lora_alpha
|
| 575 |
+
logger.info(f"target_modules: {target_modules}")
|
| 576 |
+
logger.info(f"lora_rank: {lora_rank}")
|
| 577 |
+
peft_config = LoraConfig(
|
| 578 |
+
task_type=TaskType.CAUSAL_LM,
|
| 579 |
+
target_modules=target_modules,
|
| 580 |
+
inference_mode=False,
|
| 581 |
+
r=lora_rank, lora_alpha=lora_alpha,
|
| 582 |
+
lora_dropout=lora_dropout,
|
| 583 |
+
modules_to_save=modules_to_save)
|
| 584 |
+
model = get_peft_model(model, peft_config)
|
| 585 |
+
model.print_trainable_parameters()
|
| 586 |
+
old_state_dict = model.state_dict
|
| 587 |
+
model.state_dict = (
|
| 588 |
+
lambda self, *_, **__: get_peft_model_state_dict(self, old_state_dict())
|
| 589 |
+
).__get__(model, type(model))
|
| 590 |
+
"""
|
| 591 |
+
|
| 592 |
+
|
| 593 |
+
# Initialize our Trainer
|
| 594 |
+
trainer = Trainer(
|
| 595 |
+
model=model,
|
| 596 |
+
args=training_args,
|
| 597 |
+
train_dataset=train_dataset if training_args.do_train else None,
|
| 598 |
+
eval_dataset=eval_dataset if training_args.do_eval else None,
|
| 599 |
+
tokenizer=tokenizer,
|
| 600 |
+
data_collator=fault_tolerance_data_collator,
|
| 601 |
+
compute_metrics=compute_metrics if training_args.do_eval and not is_torch_tpu_available() else None,
|
| 602 |
+
preprocess_logits_for_metrics=preprocess_logits_for_metrics
|
| 603 |
+
if training_args.do_eval and not is_torch_tpu_available()
|
| 604 |
+
else None,
|
| 605 |
+
)
|
| 606 |
+
trainer.add_callback(SavePeftModelCallback)
|
| 607 |
+
# Training
|
| 608 |
+
if training_args.do_train:
|
| 609 |
+
checkpoint = None
|
| 610 |
+
if training_args.resume_from_checkpoint is not None:
|
| 611 |
+
checkpoint = training_args.resume_from_checkpoint
|
| 612 |
+
elif last_checkpoint is not None:
|
| 613 |
+
checkpoint = last_checkpoint
|
| 614 |
+
train_result = trainer.train(resume_from_checkpoint=checkpoint)
|
| 615 |
+
|
| 616 |
+
metrics = train_result.metrics
|
| 617 |
+
|
| 618 |
+
max_train_samples = (
|
| 619 |
+
data_args.max_train_samples if data_args.max_train_samples is not None else len(train_dataset)
|
| 620 |
+
)
|
| 621 |
+
metrics["train_samples"] = min(max_train_samples, len(train_dataset))
|
| 622 |
+
|
| 623 |
+
trainer.log_metrics("train", metrics)
|
| 624 |
+
trainer.save_metrics("train", metrics)
|
| 625 |
+
trainer.save_state()
|
| 626 |
+
|
| 627 |
+
# Evaluation
|
| 628 |
+
if training_args.do_eval:
|
| 629 |
+
logger.info("*** Evaluate ***")
|
| 630 |
+
|
| 631 |
+
metrics = trainer.evaluate()
|
| 632 |
+
|
| 633 |
+
max_eval_samples = data_args.max_eval_samples if data_args.max_eval_samples is not None else len(eval_dataset)
|
| 634 |
+
metrics["eval_samples"] = min(max_eval_samples, len(eval_dataset))
|
| 635 |
+
try:
|
| 636 |
+
perplexity = math.exp(metrics["eval_loss"])
|
| 637 |
+
except OverflowError:
|
| 638 |
+
perplexity = float("inf")
|
| 639 |
+
metrics["perplexity"] = perplexity
|
| 640 |
+
|
| 641 |
+
trainer.log_metrics("eval", metrics)
|
| 642 |
+
trainer.save_metrics("eval", metrics)
|
| 643 |
+
|
| 644 |
+
|
| 645 |
+
if __name__ == "__main__":
|
| 646 |
+
main()
|
pretrain/gpt2_gene_multi_v1/run_pt_gpt2.sh
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
lr=2e-4
|
| 2 |
+
# lora_rank=8
|
| 3 |
+
# lora_alpha=32
|
| 4 |
+
# lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
|
| 5 |
+
# modules_to_save="embed_tokens,lm_head"
|
| 6 |
+
# lora_dropout=0.05
|
| 7 |
+
|
| 8 |
+
dna_eng_tokenizer_path=./gpt2_gene_multi_tokenizer
|
| 9 |
+
dataset_dir=./train_data
|
| 10 |
+
data_cache=temp_data_cache_dir
|
| 11 |
+
per_device_train_batch_size=32
|
| 12 |
+
per_device_eval_batch_size=32
|
| 13 |
+
gradient_accumulation_steps=8
|
| 14 |
+
output_dir=gpt2_gene_multi_v1
|
| 15 |
+
|
| 16 |
+
deepspeed_config_file=ds_zero2_no_offload.json
|
| 17 |
+
|
| 18 |
+
torchrun --nnodes 1 --nproc_per_node 6 run_clm_pt.py \
|
| 19 |
+
--config_name gene_eng_gpt2_v1 \
|
| 20 |
+
--deepspeed ${deepspeed_config_file} \
|
| 21 |
+
--tokenizer_name_or_path ${dna_eng_tokenizer_path} \
|
| 22 |
+
--dataset_dir ${dataset_dir} \
|
| 23 |
+
--data_cache_dir ${data_cache} \
|
| 24 |
+
--validation_split_percentage 0.001 \
|
| 25 |
+
--per_device_train_batch_size ${per_device_train_batch_size} \
|
| 26 |
+
--per_device_eval_batch_size ${per_device_eval_batch_size} \
|
| 27 |
+
--do_train \
|
| 28 |
+
--seed $RANDOM \
|
| 29 |
+
--fp16 \
|
| 30 |
+
--num_train_epochs 1 \
|
| 31 |
+
--lr_scheduler_type cosine \
|
| 32 |
+
--learning_rate ${lr} \
|
| 33 |
+
--warmup_ratio 0.05 \
|
| 34 |
+
--weight_decay 0.01 \
|
| 35 |
+
--logging_strategy steps \
|
| 36 |
+
--logging_steps 10 \
|
| 37 |
+
--save_strategy steps \
|
| 38 |
+
--save_total_limit 3 \
|
| 39 |
+
--save_steps 1000 \
|
| 40 |
+
--gradient_accumulation_steps ${gradient_accumulation_steps} \
|
| 41 |
+
--preprocessing_num_workers 128 \
|
| 42 |
+
--block_size 256 \
|
| 43 |
+
--output_dir ${output_dir} \
|
| 44 |
+
--overwrite_output_dir \
|
| 45 |
+
--ddp_timeout 30000 \
|
| 46 |
+
--logging_first_step True \
|
| 47 |
+
--torch_dtype float16 \
|
| 48 |
+
--gradient_checkpointing \
|
| 49 |
+
--ddp_find_unused_parameters False
|
pretrain/gpt2_gene_multi_v2/ds_zero2_no_offload.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"fp16": {
|
| 3 |
+
"enabled": "auto",
|
| 4 |
+
"loss_scale": 0,
|
| 5 |
+
"loss_scale_window": 100,
|
| 6 |
+
"initial_scale_power": 16,
|
| 7 |
+
"hysteresis": 2,
|
| 8 |
+
"min_loss_scale": 1e-10
|
| 9 |
+
},
|
| 10 |
+
|
| 11 |
+
"zero_optimization": {
|
| 12 |
+
"stage": 2,
|
| 13 |
+
"allgather_partitions": true,
|
| 14 |
+
"allgather_bucket_size": 1e8,
|
| 15 |
+
"overlap_comm": true,
|
| 16 |
+
"reduce_scatter": true,
|
| 17 |
+
"reduce_bucket_size": 1e8,
|
| 18 |
+
"contiguous_gradients": true
|
| 19 |
+
},
|
| 20 |
+
|
| 21 |
+
"gradient_accumulation_steps": "auto",
|
| 22 |
+
"gradient_clipping": "auto",
|
| 23 |
+
"steps_per_print": 2000,
|
| 24 |
+
"train_batch_size": "auto",
|
| 25 |
+
"train_micro_batch_size_per_gpu": "auto",
|
| 26 |
+
"wall_clock_breakdown": false
|
| 27 |
+
}
|
pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/special_tokens_map-checkpoint.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"eos_token": "<|endoftext|>",
|
| 3 |
+
"pad_token": "<pad>",
|
| 4 |
+
"unk_token": "<unk>"
|
| 5 |
+
}
|
pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/.ipynb_checkpoints/tokenizer_config-checkpoint.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"added_tokens_decoder": {
|
| 3 |
+
"0": {
|
| 4 |
+
"content": "<|endoftext|>",
|
| 5 |
+
"lstrip": false,
|
| 6 |
+
"normalized": false,
|
| 7 |
+
"rstrip": false,
|
| 8 |
+
"single_word": false,
|
| 9 |
+
"special": true
|
| 10 |
+
},
|
| 11 |
+
"1": {
|
| 12 |
+
"content": "<pad>",
|
| 13 |
+
"lstrip": false,
|
| 14 |
+
"normalized": false,
|
| 15 |
+
"rstrip": false,
|
| 16 |
+
"single_word": false,
|
| 17 |
+
"special": true
|
| 18 |
+
},
|
| 19 |
+
"2": {
|
| 20 |
+
"content": "<unk>",
|
| 21 |
+
"lstrip": false,
|
| 22 |
+
"normalized": false,
|
| 23 |
+
"rstrip": false,
|
| 24 |
+
"single_word": false,
|
| 25 |
+
"special": true
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"clean_up_tokenization_spaces": false,
|
| 29 |
+
"eos_token": "<|endoftext|>",
|
| 30 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 31 |
+
"pad_token": "<pad>",
|
| 32 |
+
"tokenizer_class": "PreTrainedTokenizerFast",
|
| 33 |
+
"unk_token": "<unk>"
|
| 34 |
+
}
|
pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/special_tokens_map.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"eos_token": "<|endoftext|>",
|
| 3 |
+
"pad_token": "<pad>",
|
| 4 |
+
"unk_token": "<unk>"
|
| 5 |
+
}
|
pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/tokenizer.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
pretrain/gpt2_gene_multi_v2/gpt2_gene_multi_tokenizer/tokenizer_config.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"added_tokens_decoder": {
|
| 3 |
+
"0": {
|
| 4 |
+
"content": "<|endoftext|>",
|
| 5 |
+
"lstrip": false,
|
| 6 |
+
"normalized": false,
|
| 7 |
+
"rstrip": false,
|
| 8 |
+
"single_word": false,
|
| 9 |
+
"special": true
|
| 10 |
+
},
|
| 11 |
+
"1": {
|
| 12 |
+
"content": "<pad>",
|
| 13 |
+
"lstrip": false,
|
| 14 |
+
"normalized": false,
|
| 15 |
+
"rstrip": false,
|
| 16 |
+
"single_word": false,
|
| 17 |
+
"special": true
|
| 18 |
+
},
|
| 19 |
+
"2": {
|
| 20 |
+
"content": "<unk>",
|
| 21 |
+
"lstrip": false,
|
| 22 |
+
"normalized": false,
|
| 23 |
+
"rstrip": false,
|
| 24 |
+
"single_word": false,
|
| 25 |
+
"special": true
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"clean_up_tokenization_spaces": false,
|
| 29 |
+
"eos_token": "<|endoftext|>",
|
| 30 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 31 |
+
"pad_token": "<pad>",
|
| 32 |
+
"tokenizer_class": "PreTrainedTokenizerFast",
|
| 33 |
+
"unk_token": "<unk>"
|
| 34 |
+
}
|
pretrain/gpt2_gene_multi_v2/run_clm_formal.py
ADDED
|
@@ -0,0 +1,657 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
# coding=utf-8
|
| 3 |
+
# Copyright 2020 The HuggingFace Inc. team. All rights reserved.
|
| 4 |
+
#
|
| 5 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 6 |
+
# you may not use this file except in compliance with the License.
|
| 7 |
+
# You may obtain a copy of the License at
|
| 8 |
+
#
|
| 9 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 10 |
+
#
|
| 11 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 12 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 13 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 14 |
+
# See the License for the specific language governing permissions and
|
| 15 |
+
# limitations under the License.
|
| 16 |
+
"""
|
| 17 |
+
Fine-tuning the library models for causal language modeling (GPT, GPT-2, CTRL, ...) on a text file or a dataset.
|
| 18 |
+
|
| 19 |
+
Here is the full list of checkpoints on the hub that can be fine-tuned by this script:
|
| 20 |
+
https://huggingface.co/models?filter=text-generation
|
| 21 |
+
"""
|
| 22 |
+
# You can also adapt this script on your own causal language modeling task. Pointers for this are left as comments.
|
| 23 |
+
|
| 24 |
+
import logging
|
| 25 |
+
import math
|
| 26 |
+
import os
|
| 27 |
+
import sys
|
| 28 |
+
from dataclasses import dataclass, field
|
| 29 |
+
from itertools import chain
|
| 30 |
+
from typing import Optional
|
| 31 |
+
|
| 32 |
+
import datasets
|
| 33 |
+
import evaluate
|
| 34 |
+
import torch
|
| 35 |
+
from datasets import load_dataset
|
| 36 |
+
|
| 37 |
+
import transformers
|
| 38 |
+
from transformers import (
|
| 39 |
+
CONFIG_MAPPING,
|
| 40 |
+
MODEL_FOR_CAUSAL_LM_MAPPING,
|
| 41 |
+
AutoConfig,
|
| 42 |
+
AutoModelForCausalLM,
|
| 43 |
+
AutoTokenizer,
|
| 44 |
+
HfArgumentParser,
|
| 45 |
+
Trainer,
|
| 46 |
+
TrainingArguments,
|
| 47 |
+
default_data_collator,
|
| 48 |
+
is_torch_xla_available,
|
| 49 |
+
set_seed,
|
| 50 |
+
)
|
| 51 |
+
from transformers.testing_utils import CaptureLogger
|
| 52 |
+
from transformers.trainer_utils import get_last_checkpoint
|
| 53 |
+
from transformers.utils import check_min_version, send_example_telemetry
|
| 54 |
+
from transformers.utils.versions import require_version
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
# Will error if the minimal version of Transformers is not installed. Remove at your own risks.
|
| 58 |
+
#check_min_version("4.49.0.dev0")
|
| 59 |
+
|
| 60 |
+
require_version("datasets>=2.14.0", "To fix: pip install -r examples/pytorch/language-modeling/requirements.txt")
|
| 61 |
+
|
| 62 |
+
logger = logging.getLogger(__name__)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
MODEL_CONFIG_CLASSES = list(MODEL_FOR_CAUSAL_LM_MAPPING.keys())
|
| 66 |
+
MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES)
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
@dataclass
|
| 70 |
+
class ModelArguments:
|
| 71 |
+
"""
|
| 72 |
+
Arguments pertaining to which model/config/tokenizer we are going to fine-tune, or train from scratch.
|
| 73 |
+
"""
|
| 74 |
+
|
| 75 |
+
model_name_or_path: Optional[str] = field(
|
| 76 |
+
default=None,
|
| 77 |
+
metadata={
|
| 78 |
+
"help": (
|
| 79 |
+
"The model checkpoint for weights initialization. Don't set if you want to train a model from scratch."
|
| 80 |
+
)
|
| 81 |
+
},
|
| 82 |
+
)
|
| 83 |
+
model_type: Optional[str] = field(
|
| 84 |
+
default=None,
|
| 85 |
+
metadata={"help": "If training from scratch, pass a model type from the list: " + ", ".join(MODEL_TYPES)},
|
| 86 |
+
)
|
| 87 |
+
config_overrides: Optional[str] = field(
|
| 88 |
+
default=None,
|
| 89 |
+
metadata={
|
| 90 |
+
"help": (
|
| 91 |
+
"Override some existing default config settings when a model is trained from scratch. Example: "
|
| 92 |
+
"n_embd=10,resid_pdrop=0.2,scale_attn_weights=false,summary_type=cls_index"
|
| 93 |
+
)
|
| 94 |
+
},
|
| 95 |
+
)
|
| 96 |
+
config_name: Optional[str] = field(
|
| 97 |
+
default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"}
|
| 98 |
+
)
|
| 99 |
+
tokenizer_name: Optional[str] = field(
|
| 100 |
+
default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"}
|
| 101 |
+
)
|
| 102 |
+
cache_dir: Optional[str] = field(
|
| 103 |
+
default=None,
|
| 104 |
+
metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"},
|
| 105 |
+
)
|
| 106 |
+
use_fast_tokenizer: bool = field(
|
| 107 |
+
default=True,
|
| 108 |
+
metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."},
|
| 109 |
+
)
|
| 110 |
+
model_revision: str = field(
|
| 111 |
+
default="main",
|
| 112 |
+
metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."},
|
| 113 |
+
)
|
| 114 |
+
token: str = field(
|
| 115 |
+
default=None,
|
| 116 |
+
metadata={
|
| 117 |
+
"help": (
|
| 118 |
+
"The token to use as HTTP bearer authorization for remote files. If not specified, will use the token "
|
| 119 |
+
"generated when running `huggingface-cli login` (stored in `~/.huggingface`)."
|
| 120 |
+
)
|
| 121 |
+
},
|
| 122 |
+
)
|
| 123 |
+
trust_remote_code: bool = field(
|
| 124 |
+
default=False,
|
| 125 |
+
metadata={
|
| 126 |
+
"help": (
|
| 127 |
+
"Whether to trust the execution of code from datasets/models defined on the Hub."
|
| 128 |
+
" This option should only be set to `True` for repositories you trust and in which you have read the"
|
| 129 |
+
" code, as it will execute code present on the Hub on your local machine."
|
| 130 |
+
)
|
| 131 |
+
},
|
| 132 |
+
)
|
| 133 |
+
torch_dtype: Optional[str] = field(
|
| 134 |
+
default=None,
|
| 135 |
+
metadata={
|
| 136 |
+
"help": (
|
| 137 |
+
"Override the default `torch.dtype` and load the model under this dtype. If `auto` is passed, the "
|
| 138 |
+
"dtype will be automatically derived from the model's weights."
|
| 139 |
+
),
|
| 140 |
+
"choices": ["auto", "bfloat16", "float16", "float32"],
|
| 141 |
+
},
|
| 142 |
+
)
|
| 143 |
+
low_cpu_mem_usage: bool = field(
|
| 144 |
+
default=False,
|
| 145 |
+
metadata={
|
| 146 |
+
"help": (
|
| 147 |
+
"It is an option to create the model as an empty shell, then only materialize its parameters when the pretrained weights are loaded. "
|
| 148 |
+
"set True will benefit LLM loading time and RAM consumption."
|
| 149 |
+
)
|
| 150 |
+
},
|
| 151 |
+
)
|
| 152 |
+
|
| 153 |
+
def __post_init__(self):
|
| 154 |
+
if self.config_overrides is not None and (self.config_name is not None or self.model_name_or_path is not None):
|
| 155 |
+
raise ValueError(
|
| 156 |
+
"--config_overrides can't be used in combination with --config_name or --model_name_or_path"
|
| 157 |
+
)
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
@dataclass
|
| 161 |
+
class DataTrainingArguments:
|
| 162 |
+
"""
|
| 163 |
+
Arguments pertaining to what data we are going to input our model for training and eval.
|
| 164 |
+
"""
|
| 165 |
+
|
| 166 |
+
dataset_name: Optional[str] = field(
|
| 167 |
+
default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."}
|
| 168 |
+
)
|
| 169 |
+
dataset_config_name: Optional[str] = field(
|
| 170 |
+
default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."}
|
| 171 |
+
)
|
| 172 |
+
train_file: Optional[str] = field(default=None, metadata={"help": "The input training data file (a text file)."})
|
| 173 |
+
validation_file: Optional[str] = field(
|
| 174 |
+
default=None,
|
| 175 |
+
metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."},
|
| 176 |
+
)
|
| 177 |
+
max_train_samples: Optional[int] = field(
|
| 178 |
+
default=None,
|
| 179 |
+
metadata={
|
| 180 |
+
"help": (
|
| 181 |
+
"For debugging purposes or quicker training, truncate the number of training examples to this "
|
| 182 |
+
"value if set."
|
| 183 |
+
)
|
| 184 |
+
},
|
| 185 |
+
)
|
| 186 |
+
max_eval_samples: Optional[int] = field(
|
| 187 |
+
default=None,
|
| 188 |
+
metadata={
|
| 189 |
+
"help": (
|
| 190 |
+
"For debugging purposes or quicker training, truncate the number of evaluation examples to this "
|
| 191 |
+
"value if set."
|
| 192 |
+
)
|
| 193 |
+
},
|
| 194 |
+
)
|
| 195 |
+
streaming: bool = field(default=False, metadata={"help": "Enable streaming mode"})
|
| 196 |
+
block_size: Optional[int] = field(
|
| 197 |
+
default=None,
|
| 198 |
+
metadata={
|
| 199 |
+
"help": (
|
| 200 |
+
"Optional input sequence length after tokenization. "
|
| 201 |
+
"The training dataset will be truncated in block of this size for training. "
|
| 202 |
+
"Default to the model max input length for single sentence inputs (take into account special tokens)."
|
| 203 |
+
)
|
| 204 |
+
},
|
| 205 |
+
)
|
| 206 |
+
overwrite_cache: bool = field(
|
| 207 |
+
default=False, metadata={"help": "Overwrite the cached training and evaluation sets"}
|
| 208 |
+
)
|
| 209 |
+
validation_split_percentage: Optional[int] = field(
|
| 210 |
+
default=5,
|
| 211 |
+
metadata={
|
| 212 |
+
"help": "The percentage of the train set used as validation set in case there's no validation split"
|
| 213 |
+
},
|
| 214 |
+
)
|
| 215 |
+
preprocessing_num_workers: Optional[int] = field(
|
| 216 |
+
default=None,
|
| 217 |
+
metadata={"help": "The number of processes to use for the preprocessing."},
|
| 218 |
+
)
|
| 219 |
+
keep_linebreaks: bool = field(
|
| 220 |
+
default=True, metadata={"help": "Whether to keep line breaks when using TXT files or not."}
|
| 221 |
+
)
|
| 222 |
+
|
| 223 |
+
def __post_init__(self):
|
| 224 |
+
if self.streaming:
|
| 225 |
+
require_version("datasets>=2.0.0", "The streaming feature requires `datasets>=2.0.0`")
|
| 226 |
+
|
| 227 |
+
if self.dataset_name is None and self.train_file is None and self.validation_file is None:
|
| 228 |
+
raise ValueError("Need either a dataset name or a training/validation file.")
|
| 229 |
+
else:
|
| 230 |
+
if self.train_file is not None:
|
| 231 |
+
extension = self.train_file.split(".")[-1]
|
| 232 |
+
assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, a json or a txt file."
|
| 233 |
+
if self.validation_file is not None:
|
| 234 |
+
extension = self.validation_file.split(".")[-1]
|
| 235 |
+
assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, a json or a txt file."
|
| 236 |
+
|
| 237 |
+
|
| 238 |
+
def main():
|
| 239 |
+
# See all possible arguments in src/transformers/training_args.py
|
| 240 |
+
# or by passing the --help flag to this script.
|
| 241 |
+
# We now keep distinct sets of args, for a cleaner separation of concerns.
|
| 242 |
+
|
| 243 |
+
parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TrainingArguments))
|
| 244 |
+
if len(sys.argv) == 2 and sys.argv[1].endswith(".json"):
|
| 245 |
+
# If we pass only one argument to the script and it's the path to a json file,
|
| 246 |
+
# let's parse it to get our arguments.
|
| 247 |
+
model_args, data_args, training_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]))
|
| 248 |
+
else:
|
| 249 |
+
model_args, data_args, training_args = parser.parse_args_into_dataclasses()
|
| 250 |
+
|
| 251 |
+
# Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The
|
| 252 |
+
# information sent is the one passed as arguments along with your Python/PyTorch versions.
|
| 253 |
+
send_example_telemetry("run_clm", model_args, data_args)
|
| 254 |
+
|
| 255 |
+
# Setup logging
|
| 256 |
+
logging.basicConfig(
|
| 257 |
+
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
|
| 258 |
+
datefmt="%m/%d/%Y %H:%M:%S",
|
| 259 |
+
handlers=[logging.StreamHandler(sys.stdout)],
|
| 260 |
+
)
|
| 261 |
+
|
| 262 |
+
if training_args.should_log:
|
| 263 |
+
# The default of training_args.log_level is passive, so we set log level at info here to have that default.
|
| 264 |
+
transformers.utils.logging.set_verbosity_info()
|
| 265 |
+
|
| 266 |
+
log_level = training_args.get_process_log_level()
|
| 267 |
+
logger.setLevel(log_level)
|
| 268 |
+
datasets.utils.logging.set_verbosity(log_level)
|
| 269 |
+
transformers.utils.logging.set_verbosity(log_level)
|
| 270 |
+
transformers.utils.logging.enable_default_handler()
|
| 271 |
+
transformers.utils.logging.enable_explicit_format()
|
| 272 |
+
|
| 273 |
+
# Log on each process the small summary:
|
| 274 |
+
logger.warning(
|
| 275 |
+
f"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}, "
|
| 276 |
+
+ f"distributed training: {training_args.parallel_mode.value == 'distributed'}, 16-bits training: {training_args.fp16}"
|
| 277 |
+
)
|
| 278 |
+
logger.info(f"Training/evaluation parameters {training_args}")
|
| 279 |
+
|
| 280 |
+
# Detecting last checkpoint.
|
| 281 |
+
last_checkpoint = None
|
| 282 |
+
if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir:
|
| 283 |
+
last_checkpoint = get_last_checkpoint(training_args.output_dir)
|
| 284 |
+
if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0:
|
| 285 |
+
raise ValueError(
|
| 286 |
+
f"Output directory ({training_args.output_dir}) already exists and is not empty. "
|
| 287 |
+
"Use --overwrite_output_dir to overcome."
|
| 288 |
+
)
|
| 289 |
+
elif last_checkpoint is not None and training_args.resume_from_checkpoint is None:
|
| 290 |
+
logger.info(
|
| 291 |
+
f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change "
|
| 292 |
+
"the `--output_dir` or add `--overwrite_output_dir` to train from scratch."
|
| 293 |
+
)
|
| 294 |
+
|
| 295 |
+
# Set seed before initializing model.
|
| 296 |
+
set_seed(training_args.seed)
|
| 297 |
+
|
| 298 |
+
# Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below)
|
| 299 |
+
# or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/
|
| 300 |
+
# (the dataset will be downloaded automatically from the datasets Hub).
|
| 301 |
+
#
|
| 302 |
+
# For CSV/JSON files, this script will use the column called 'text' or the first column if no column called
|
| 303 |
+
# 'text' is found. You can easily tweak this behavior (see below).
|
| 304 |
+
#
|
| 305 |
+
# In distributed training, the load_dataset function guarantee that only one local process can concurrently
|
| 306 |
+
# download the dataset.
|
| 307 |
+
if data_args.dataset_name is not None:
|
| 308 |
+
# Downloading and loading a dataset from the hub.
|
| 309 |
+
raw_datasets = load_dataset(
|
| 310 |
+
data_args.dataset_name,
|
| 311 |
+
data_args.dataset_config_name,
|
| 312 |
+
cache_dir=model_args.cache_dir,
|
| 313 |
+
token=model_args.token,
|
| 314 |
+
streaming=data_args.streaming,
|
| 315 |
+
trust_remote_code=model_args.trust_remote_code,
|
| 316 |
+
)
|
| 317 |
+
if "validation" not in raw_datasets.keys():
|
| 318 |
+
raw_datasets["validation"] = load_dataset(
|
| 319 |
+
data_args.dataset_name,
|
| 320 |
+
data_args.dataset_config_name,
|
| 321 |
+
split=f"train[:{data_args.validation_split_percentage}%]",
|
| 322 |
+
cache_dir=model_args.cache_dir,
|
| 323 |
+
token=model_args.token,
|
| 324 |
+
streaming=data_args.streaming,
|
| 325 |
+
trust_remote_code=model_args.trust_remote_code,
|
| 326 |
+
)
|
| 327 |
+
raw_datasets["train"] = load_dataset(
|
| 328 |
+
data_args.dataset_name,
|
| 329 |
+
data_args.dataset_config_name,
|
| 330 |
+
split=f"train[{data_args.validation_split_percentage}%:]",
|
| 331 |
+
cache_dir=model_args.cache_dir,
|
| 332 |
+
token=model_args.token,
|
| 333 |
+
streaming=data_args.streaming,
|
| 334 |
+
trust_remote_code=model_args.trust_remote_code,
|
| 335 |
+
)
|
| 336 |
+
else:
|
| 337 |
+
data_files = {}
|
| 338 |
+
dataset_args = {}
|
| 339 |
+
if data_args.train_file is not None:
|
| 340 |
+
data_files["train"] = data_args.train_file
|
| 341 |
+
if data_args.validation_file is not None:
|
| 342 |
+
data_files["validation"] = data_args.validation_file
|
| 343 |
+
extension = (
|
| 344 |
+
data_args.train_file.split(".")[-1]
|
| 345 |
+
if data_args.train_file is not None
|
| 346 |
+
else data_args.validation_file.split(".")[-1]
|
| 347 |
+
)
|
| 348 |
+
if extension == "txt":
|
| 349 |
+
extension = "text"
|
| 350 |
+
dataset_args["keep_linebreaks"] = data_args.keep_linebreaks
|
| 351 |
+
raw_datasets = load_dataset(
|
| 352 |
+
extension,
|
| 353 |
+
data_files=data_files,
|
| 354 |
+
cache_dir=model_args.cache_dir,
|
| 355 |
+
token=model_args.token,
|
| 356 |
+
**dataset_args,
|
| 357 |
+
)
|
| 358 |
+
# If no validation data is there, validation_split_percentage will be used to divide the dataset.
|
| 359 |
+
if "validation" not in raw_datasets.keys():
|
| 360 |
+
raw_datasets["validation"] = load_dataset(
|
| 361 |
+
extension,
|
| 362 |
+
data_files=data_files,
|
| 363 |
+
split=f"train[:{data_args.validation_split_percentage}%]",
|
| 364 |
+
cache_dir=model_args.cache_dir,
|
| 365 |
+
token=model_args.token,
|
| 366 |
+
**dataset_args,
|
| 367 |
+
)
|
| 368 |
+
raw_datasets["train"] = load_dataset(
|
| 369 |
+
extension,
|
| 370 |
+
data_files=data_files,
|
| 371 |
+
split=f"train[{data_args.validation_split_percentage}%:]",
|
| 372 |
+
cache_dir=model_args.cache_dir,
|
| 373 |
+
token=model_args.token,
|
| 374 |
+
**dataset_args,
|
| 375 |
+
)
|
| 376 |
+
|
| 377 |
+
# See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at
|
| 378 |
+
# https://huggingface.co/docs/datasets/loading_datasets.
|
| 379 |
+
|
| 380 |
+
# Load pretrained model and tokenizer
|
| 381 |
+
#
|
| 382 |
+
# Distributed training:
|
| 383 |
+
# The .from_pretrained methods guarantee that only one local process can concurrently
|
| 384 |
+
# download model & vocab.
|
| 385 |
+
|
| 386 |
+
config_kwargs = {
|
| 387 |
+
"cache_dir": model_args.cache_dir,
|
| 388 |
+
"revision": model_args.model_revision,
|
| 389 |
+
"token": model_args.token,
|
| 390 |
+
"trust_remote_code": model_args.trust_remote_code,
|
| 391 |
+
}
|
| 392 |
+
if model_args.config_name:
|
| 393 |
+
config = AutoConfig.from_pretrained(model_args.config_name, **config_kwargs)
|
| 394 |
+
elif model_args.model_name_or_path:
|
| 395 |
+
config = AutoConfig.from_pretrained(model_args.model_name_or_path, **config_kwargs)
|
| 396 |
+
else:
|
| 397 |
+
config = CONFIG_MAPPING[model_args.model_type]()
|
| 398 |
+
logger.warning("You are instantiating a new config instance from scratch.")
|
| 399 |
+
if model_args.config_overrides is not None:
|
| 400 |
+
logger.info(f"Overriding config: {model_args.config_overrides}")
|
| 401 |
+
config.update_from_string(model_args.config_overrides)
|
| 402 |
+
logger.info(f"New config: {config}")
|
| 403 |
+
|
| 404 |
+
tokenizer_kwargs = {
|
| 405 |
+
"cache_dir": model_args.cache_dir,
|
| 406 |
+
"use_fast": model_args.use_fast_tokenizer,
|
| 407 |
+
"revision": model_args.model_revision,
|
| 408 |
+
"token": model_args.token,
|
| 409 |
+
"trust_remote_code": model_args.trust_remote_code,
|
| 410 |
+
}
|
| 411 |
+
if model_args.tokenizer_name:
|
| 412 |
+
tokenizer = AutoTokenizer.from_pretrained(model_args.tokenizer_name, **tokenizer_kwargs)
|
| 413 |
+
elif model_args.model_name_or_path:
|
| 414 |
+
tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **tokenizer_kwargs)
|
| 415 |
+
else:
|
| 416 |
+
raise ValueError(
|
| 417 |
+
"You are instantiating a new tokenizer from scratch. This is not supported by this script. "
|
| 418 |
+
"You can do it from another script, save it, and load it from here, using --tokenizer_name."
|
| 419 |
+
)
|
| 420 |
+
|
| 421 |
+
if model_args.model_name_or_path:
|
| 422 |
+
torch_dtype = (
|
| 423 |
+
model_args.torch_dtype
|
| 424 |
+
if model_args.torch_dtype in ["auto", None]
|
| 425 |
+
else getattr(torch, model_args.torch_dtype)
|
| 426 |
+
)
|
| 427 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 428 |
+
model_args.model_name_or_path,
|
| 429 |
+
from_tf=bool(".ckpt" in model_args.model_name_or_path),
|
| 430 |
+
config=config,
|
| 431 |
+
cache_dir=model_args.cache_dir,
|
| 432 |
+
revision=model_args.model_revision,
|
| 433 |
+
token=model_args.token,
|
| 434 |
+
trust_remote_code=model_args.trust_remote_code,
|
| 435 |
+
torch_dtype=torch_dtype,
|
| 436 |
+
low_cpu_mem_usage=model_args.low_cpu_mem_usage,
|
| 437 |
+
)
|
| 438 |
+
else:
|
| 439 |
+
model = AutoModelForCausalLM.from_config(config, trust_remote_code=model_args.trust_remote_code)
|
| 440 |
+
n_params = sum({p.data_ptr(): p.numel() for p in model.parameters()}.values())
|
| 441 |
+
logger.info(f"Training new model from scratch - Total size={n_params/2**20:.2f}M params")
|
| 442 |
+
|
| 443 |
+
# We resize the embeddings only when necessary to avoid index errors. If you are creating a model from scratch
|
| 444 |
+
# on a small vocab and want a smaller embedding size, remove this test.
|
| 445 |
+
embedding_size = model.get_input_embeddings().weight.shape[0]
|
| 446 |
+
if len(tokenizer) > embedding_size:
|
| 447 |
+
model.resize_token_embeddings(len(tokenizer))
|
| 448 |
+
|
| 449 |
+
# Preprocessing the datasets.
|
| 450 |
+
# First we tokenize all the texts.
|
| 451 |
+
if training_args.do_train:
|
| 452 |
+
column_names = list(raw_datasets["train"].features)
|
| 453 |
+
else:
|
| 454 |
+
column_names = list(raw_datasets["validation"].features)
|
| 455 |
+
text_column_name = "text" if "text" in column_names else column_names[0]
|
| 456 |
+
|
| 457 |
+
# since this will be pickled to avoid _LazyModule error in Hasher force logger loading before tokenize_function
|
| 458 |
+
tok_logger = transformers.utils.logging.get_logger("transformers.tokenization_utils_base")
|
| 459 |
+
|
| 460 |
+
def tokenize_function(examples):
|
| 461 |
+
with CaptureLogger(tok_logger) as cl:
|
| 462 |
+
output = tokenizer(examples[text_column_name])
|
| 463 |
+
# clm input could be much much longer than block_size
|
| 464 |
+
if "Token indices sequence length is longer than the" in cl.out:
|
| 465 |
+
tok_logger.warning(
|
| 466 |
+
"^^^^^^^^^^^^^^^^ Please ignore the warning above - this long input will be chunked into smaller bits"
|
| 467 |
+
" before being passed to the model."
|
| 468 |
+
)
|
| 469 |
+
return output
|
| 470 |
+
|
| 471 |
+
with training_args.main_process_first(desc="dataset map tokenization"):
|
| 472 |
+
if not data_args.streaming:
|
| 473 |
+
tokenized_datasets = raw_datasets.map(
|
| 474 |
+
tokenize_function,
|
| 475 |
+
batched=True,
|
| 476 |
+
num_proc=data_args.preprocessing_num_workers,
|
| 477 |
+
remove_columns=column_names,
|
| 478 |
+
load_from_cache_file=not data_args.overwrite_cache,
|
| 479 |
+
desc="Running tokenizer on dataset",
|
| 480 |
+
)
|
| 481 |
+
else:
|
| 482 |
+
tokenized_datasets = raw_datasets.map(
|
| 483 |
+
tokenize_function,
|
| 484 |
+
batched=True,
|
| 485 |
+
remove_columns=column_names,
|
| 486 |
+
)
|
| 487 |
+
if hasattr(config, "max_position_embeddings"):
|
| 488 |
+
max_pos_embeddings = config.max_position_embeddings
|
| 489 |
+
else:
|
| 490 |
+
# Define a default value if the attribute is missing in the config.
|
| 491 |
+
max_pos_embeddings = 1024
|
| 492 |
+
|
| 493 |
+
if data_args.block_size is None:
|
| 494 |
+
block_size = tokenizer.model_max_length
|
| 495 |
+
if block_size > max_pos_embeddings:
|
| 496 |
+
logger.warning(
|
| 497 |
+
f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). "
|
| 498 |
+
f"Using block_size={min(1024, max_pos_embeddings)} instead. You can change that default value by passing --block_size xxx."
|
| 499 |
+
)
|
| 500 |
+
if max_pos_embeddings > 0:
|
| 501 |
+
block_size = min(1024, max_pos_embeddings)
|
| 502 |
+
else:
|
| 503 |
+
block_size = 1024
|
| 504 |
+
else:
|
| 505 |
+
if data_args.block_size > tokenizer.model_max_length:
|
| 506 |
+
logger.warning(
|
| 507 |
+
f"The block_size passed ({data_args.block_size}) is larger than the maximum length for the model "
|
| 508 |
+
f"({tokenizer.model_max_length}). Using block_size={tokenizer.model_max_length}."
|
| 509 |
+
)
|
| 510 |
+
block_size = min(data_args.block_size, tokenizer.model_max_length)
|
| 511 |
+
|
| 512 |
+
# Main data processing function that will concatenate all texts from our dataset and generate chunks of block_size.
|
| 513 |
+
def group_texts(examples):
|
| 514 |
+
# Concatenate all texts.
|
| 515 |
+
concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
|
| 516 |
+
total_length = len(concatenated_examples[list(examples.keys())[0]])
|
| 517 |
+
# We drop the small remainder, and if the total_length < block_size we exclude this batch and return an empty dict.
|
| 518 |
+
# We could add padding if the model supported it instead of this drop, you can customize this part to your needs.
|
| 519 |
+
total_length = (total_length // block_size) * block_size
|
| 520 |
+
# Split by chunks of max_len.
|
| 521 |
+
result = {
|
| 522 |
+
k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
|
| 523 |
+
for k, t in concatenated_examples.items()
|
| 524 |
+
}
|
| 525 |
+
result["labels"] = result["input_ids"].copy()
|
| 526 |
+
return result
|
| 527 |
+
|
| 528 |
+
# Note that with `batched=True`, this map processes 1,000 texts together, so group_texts throws away a remainder
|
| 529 |
+
# for each of those groups of 1,000 texts. You can adjust that batch_size here but a higher value might be slower
|
| 530 |
+
# to preprocess.
|
| 531 |
+
#
|
| 532 |
+
# To speed up this part, we use multiprocessing. See the documentation of the map method for more information:
|
| 533 |
+
# https://huggingface.co/docs/datasets/process#map
|
| 534 |
+
|
| 535 |
+
with training_args.main_process_first(desc="grouping texts together"):
|
| 536 |
+
if not data_args.streaming:
|
| 537 |
+
lm_datasets = tokenized_datasets.map(
|
| 538 |
+
group_texts,
|
| 539 |
+
batched=True,
|
| 540 |
+
num_proc=data_args.preprocessing_num_workers,
|
| 541 |
+
load_from_cache_file=not data_args.overwrite_cache,
|
| 542 |
+
desc=f"Grouping texts in chunks of {block_size}",
|
| 543 |
+
)
|
| 544 |
+
else:
|
| 545 |
+
lm_datasets = tokenized_datasets.map(
|
| 546 |
+
group_texts,
|
| 547 |
+
batched=True,
|
| 548 |
+
)
|
| 549 |
+
|
| 550 |
+
if training_args.do_train:
|
| 551 |
+
if "train" not in tokenized_datasets:
|
| 552 |
+
raise ValueError("--do_train requires a train dataset")
|
| 553 |
+
train_dataset = lm_datasets["train"]
|
| 554 |
+
if data_args.max_train_samples is not None:
|
| 555 |
+
max_train_samples = min(len(train_dataset), data_args.max_train_samples)
|
| 556 |
+
train_dataset = train_dataset.select(range(max_train_samples))
|
| 557 |
+
|
| 558 |
+
if training_args.do_eval:
|
| 559 |
+
if "validation" not in tokenized_datasets:
|
| 560 |
+
raise ValueError("--do_eval requires a validation dataset")
|
| 561 |
+
eval_dataset = lm_datasets["validation"]
|
| 562 |
+
if data_args.max_eval_samples is not None:
|
| 563 |
+
max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples)
|
| 564 |
+
eval_dataset = eval_dataset.select(range(max_eval_samples))
|
| 565 |
+
|
| 566 |
+
def preprocess_logits_for_metrics(logits, labels):
|
| 567 |
+
if isinstance(logits, tuple):
|
| 568 |
+
# Depending on the model and config, logits may contain extra tensors,
|
| 569 |
+
# like past_key_values, but logits always come first
|
| 570 |
+
logits = logits[0]
|
| 571 |
+
return logits.argmax(dim=-1)
|
| 572 |
+
|
| 573 |
+
metric = evaluate.load("accuracy", cache_dir=model_args.cache_dir)
|
| 574 |
+
|
| 575 |
+
def compute_metrics(eval_preds):
|
| 576 |
+
preds, labels = eval_preds
|
| 577 |
+
# preds have the same shape as the labels, after the argmax(-1) has been calculated
|
| 578 |
+
# by preprocess_logits_for_metrics but we need to shift the labels
|
| 579 |
+
labels = labels[:, 1:].reshape(-1)
|
| 580 |
+
preds = preds[:, :-1].reshape(-1)
|
| 581 |
+
return metric.compute(predictions=preds, references=labels)
|
| 582 |
+
|
| 583 |
+
# Initialize our Trainer
|
| 584 |
+
trainer = Trainer(
|
| 585 |
+
model=model,
|
| 586 |
+
args=training_args,
|
| 587 |
+
train_dataset=train_dataset if training_args.do_train else None,
|
| 588 |
+
eval_dataset=eval_dataset if training_args.do_eval else None,
|
| 589 |
+
tokenizer=tokenizer,
|
| 590 |
+
# Data collator will default to DataCollatorWithPadding, so we change it.
|
| 591 |
+
data_collator=default_data_collator,
|
| 592 |
+
compute_metrics=compute_metrics if training_args.do_eval and not is_torch_xla_available() else None,
|
| 593 |
+
preprocess_logits_for_metrics=preprocess_logits_for_metrics
|
| 594 |
+
if training_args.do_eval and not is_torch_xla_available()
|
| 595 |
+
else None,
|
| 596 |
+
)
|
| 597 |
+
|
| 598 |
+
# Training
|
| 599 |
+
if training_args.do_train:
|
| 600 |
+
checkpoint = None
|
| 601 |
+
if training_args.resume_from_checkpoint is not None:
|
| 602 |
+
checkpoint = training_args.resume_from_checkpoint
|
| 603 |
+
elif last_checkpoint is not None:
|
| 604 |
+
checkpoint = last_checkpoint
|
| 605 |
+
train_result = trainer.train(resume_from_checkpoint=checkpoint)
|
| 606 |
+
trainer.save_model() # Saves the tokenizer too for easy upload
|
| 607 |
+
|
| 608 |
+
metrics = train_result.metrics
|
| 609 |
+
|
| 610 |
+
max_train_samples = (
|
| 611 |
+
data_args.max_train_samples if data_args.max_train_samples is not None else len(train_dataset)
|
| 612 |
+
)
|
| 613 |
+
metrics["train_samples"] = min(max_train_samples, len(train_dataset))
|
| 614 |
+
|
| 615 |
+
trainer.log_metrics("train", metrics)
|
| 616 |
+
trainer.save_metrics("train", metrics)
|
| 617 |
+
trainer.save_state()
|
| 618 |
+
|
| 619 |
+
# Evaluation
|
| 620 |
+
if training_args.do_eval:
|
| 621 |
+
logger.info("*** Evaluate ***")
|
| 622 |
+
|
| 623 |
+
metrics = trainer.evaluate()
|
| 624 |
+
|
| 625 |
+
max_eval_samples = data_args.max_eval_samples if data_args.max_eval_samples is not None else len(eval_dataset)
|
| 626 |
+
metrics["eval_samples"] = min(max_eval_samples, len(eval_dataset))
|
| 627 |
+
try:
|
| 628 |
+
perplexity = math.exp(metrics["eval_loss"])
|
| 629 |
+
except OverflowError:
|
| 630 |
+
perplexity = float("inf")
|
| 631 |
+
metrics["perplexity"] = perplexity
|
| 632 |
+
|
| 633 |
+
trainer.log_metrics("eval", metrics)
|
| 634 |
+
trainer.save_metrics("eval", metrics)
|
| 635 |
+
|
| 636 |
+
kwargs = {"finetuned_from": model_args.model_name_or_path, "tasks": "text-generation"}
|
| 637 |
+
if data_args.dataset_name is not None:
|
| 638 |
+
kwargs["dataset_tags"] = data_args.dataset_name
|
| 639 |
+
if data_args.dataset_config_name is not None:
|
| 640 |
+
kwargs["dataset_args"] = data_args.dataset_config_name
|
| 641 |
+
kwargs["dataset"] = f"{data_args.dataset_name} {data_args.dataset_config_name}"
|
| 642 |
+
else:
|
| 643 |
+
kwargs["dataset"] = data_args.dataset_name
|
| 644 |
+
|
| 645 |
+
if training_args.push_to_hub:
|
| 646 |
+
trainer.push_to_hub(**kwargs)
|
| 647 |
+
else:
|
| 648 |
+
trainer.create_model_card(**kwargs)
|
| 649 |
+
|
| 650 |
+
|
| 651 |
+
def _mp_fn(index):
|
| 652 |
+
# For xla_spawn (TPUs)
|
| 653 |
+
main()
|
| 654 |
+
|
| 655 |
+
|
| 656 |
+
if __name__ == "__main__":
|
| 657 |
+
main()
|
pretrain/gpt2_gene_multi_v2/run_pt_gpt2_formal.sh
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
lr=2e-4
|
| 2 |
+
dna_eng_tokenizer_path=./gpt2_gene_multi_tokenizer
|
| 3 |
+
train_file=train_data/gene_eng_zh_de_es.txt
|
| 4 |
+
data_cache=temp_data_cache_dir
|
| 5 |
+
per_device_train_batch_size=32
|
| 6 |
+
per_device_eval_batch_size=32
|
| 7 |
+
gradient_accumulation_steps=8
|
| 8 |
+
output_dir=gene_eng_zh_de_es
|
| 9 |
+
|
| 10 |
+
deepspeed_config_file=ds_zero2_no_offload.json
|
| 11 |
+
|
| 12 |
+
torchrun --nnodes 1 --nproc_per_node 6 run_clm_formal.py \
|
| 13 |
+
--config_name gene_eng_gpt2_v1 \
|
| 14 |
+
--deepspeed ${deepspeed_config_file} \
|
| 15 |
+
--tokenizer_name ${dna_eng_tokenizer_path} \
|
| 16 |
+
--train_file ${train_file} \
|
| 17 |
+
--cache_dir ${data_cache} \
|
| 18 |
+
--per_device_train_batch_size ${per_device_train_batch_size} \
|
| 19 |
+
--per_device_eval_batch_size ${per_device_eval_batch_size} \
|
| 20 |
+
--do_train \
|
| 21 |
+
--validation_split_percentage 1 \
|
| 22 |
+
--seed $RANDOM \
|
| 23 |
+
--fp16 \
|
| 24 |
+
--num_train_epochs 1 \
|
| 25 |
+
--lr_scheduler_type cosine \
|
| 26 |
+
--learning_rate ${lr} \
|
| 27 |
+
--warmup_ratio 0.05 \
|
| 28 |
+
--weight_decay 0.01 \
|
| 29 |
+
--logging_strategy steps \
|
| 30 |
+
--logging_steps 10 \
|
| 31 |
+
--save_strategy steps \
|
| 32 |
+
--save_total_limit 3 \
|
| 33 |
+
--save_steps 1000 \
|
| 34 |
+
--gradient_accumulation_steps ${gradient_accumulation_steps} \
|
| 35 |
+
--preprocessing_num_workers 128 \
|
| 36 |
+
--block_size 256 \
|
| 37 |
+
--output_dir ${output_dir} \
|
| 38 |
+
--overwrite_output_dir \
|
| 39 |
+
--ddp_timeout 30000 \
|
| 40 |
+
--logging_first_step True \
|
| 41 |
+
--torch_dtype float16 \
|
| 42 |
+
--gradient_checkpointing \
|
| 43 |
+
--ddp_find_unused_parameters False
|