DDingcheol commited on
Commit
7172545
·
1 Parent(s): a775df9

Rename app.py.py to app.py

Browse files
Files changed (2) hide show
  1. app.py +78 -0
  2. app.py.py +0 -211
app.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #허깅페이스에서 돌아갈 수 있도록 바꾸어 보았음
2
+
3
+ import torch
4
+ from transformers import BertTokenizerFast, BertForQuestionAnswering, Trainer, TrainingArguments
5
+ from datasets import load_dataset
6
+ from collections import defaultdict
7
+
8
+ # 데이터 불러오기
9
+ dataset_load = load_dataset('Multimodal-Fatima/OK-VQA_train')
10
+ dataset = dataset_load['train'].select(range(300))
11
+
12
+ # 불필요한 특성 선택
13
+ selected_features = ['image', 'answers', 'question']
14
+ selected_dataset = dataset.map(lambda ex: {feature: ex[feature] for feature in selected_features})
15
+
16
+ # 소프트 인코딩
17
+ answers_to_id = defaultdict(lambda: len(answers_to_id))
18
+ selected_dataset = selected_dataset.map(lambda ex: {
19
+ 'answers': [answers_to_id[ans] for ans in ex['answers']],
20
+ 'question': ex['question'],
21
+ 'image': ex['image']
22
+ })
23
+
24
+ id_to_answers = {v: k for k, v in answers_to_id.items()}
25
+ id_to_labels = {k: ex['answers'] for k, ex in enumerate(selected_dataset)}
26
+
27
+ selected_dataset = selected_dataset.map(lambda ex: {'answers': id_to_labels.get(ex['answers'][0]),
28
+ 'question': ex['question'],
29
+ 'image': ex['image']})
30
+
31
+ flattened_features = []
32
+
33
+ for ex in selected_dataset:
34
+ flattened_example = {
35
+ 'answers': ex['answers'],
36
+ 'question': ex['question'],
37
+ 'image': ex['image'],
38
+ }
39
+ flattened_features.append(flattened_example)
40
+
41
+ # 모델 가져오기
42
+ from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer
43
+
44
+ model_name = 'microsoft/git-base-vqav2'
45
+ model = AutoModelForSequenceClassification.from_pretrained(model_name)
46
+
47
+ # Trainer를 사용하여 모델 학습
48
+ tokenizer = BertTokenizerFast.from_pretrained('bert-base-multilingual-cased')
49
+
50
+ def preprocess_function(examples):
51
+ tokenized_inputs = tokenizer(examples['question'], truncation=True, padding=True)
52
+ return {
53
+ 'input_ids': tokenized_inputs['input_ids'],
54
+ 'attention_mask': tokenized_inputs['attention_mask'],
55
+ 'pixel_values': [(4, 3, 244, 244)] * len(tokenized_inputs['input_ids']),
56
+ 'pixel_mask': [1] * len(tokenized_inputs['input_ids']),
57
+ 'labels': [[label] for label in examples['answers']]
58
+ }
59
+
60
+ dataset = load_dataset("Multimodal-Fatima/OK-VQA_train")['train'].select(range(300))
61
+ ok_vqa_dataset = dataset.map(preprocess_function, batched=True)
62
+ ok_vqa_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'pixel_values', 'pixel_mask', 'labels'])
63
+
64
+ training_args = TrainingArguments(
65
+ output_dir='./results',
66
+ num_train_epochs=20,
67
+ per_device_train_batch_size=4,
68
+ logging_steps=500,
69
+ )
70
+
71
+ trainer = Trainer(
72
+ model=model,
73
+ args=training_args,
74
+ train_dataset=ok_vqa_dataset
75
+ )
76
+
77
+ # 모델 학습
78
+ trainer.train()
app.py.py DELETED
@@ -1,211 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """Untitled35.ipynb
3
-
4
- Automatically generated by Colaboratory.
5
-
6
- Original file is located at
7
- https://colab.research.google.com/drive/1o8BEsLXWGF91Q1MOvzj5ZRaEHgUp-kOM
8
-
9
- # 0. 필요한 모듈 다운로드 및 불러오기
10
- """
11
-
12
- !pip install datasets
13
- !pip install huggingface_hub
14
- !python -c "from huggingface_hub.hf_api import HfFolder; HfFolder.save_token('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')"
15
- !pip install accelerate>=0.20.1
16
- !pip install accelerate -U
17
-
18
- import torch
19
- from transformers import BertTokenizerFast, BertForQuestionAnswering, Trainer, TrainingArguments
20
- from datasets import load_dataset
21
- from collections import defaultdict
22
-
23
- """# 1. 데이터 가져오기"""
24
-
25
- dataset_load = load_dataset('Multimodal-Fatima/OK-VQA_train') # Multimodal-Fatima/OK-VQA_train 불러오기
26
- Dataset = dataset_load['train'].select(range(300)) # 데이터 200~300개 불러오기 -> 제작자는 300개
27
-
28
- """### 1-1. 결과 확인"""
29
-
30
- Dataset
31
-
32
- """# 2. 불필요한 특성 제외"""
33
-
34
- selected_features = ['image', 'answers', 'question']
35
- selected_dataset = Dataset.from_dict({feature: Dataset[feature] for feature in selected_features})
36
-
37
- """### 2-1. 결과 확인"""
38
-
39
- selected_dataset
40
-
41
- """# 3. 소프트 인코딩 (라벨 인코딩)"""
42
-
43
- # 각 답변들을 고유한 ID로 매핑하기 위한 딕셔너리 생성
44
- answers_to_id = defaultdict(lambda: len(answers_to_id))
45
- selected_dataset = selected_dataset.map(lambda ex: {'answers': [answers_to_id[ans] for ans in ex['answers']],
46
- 'question': ex['question'],
47
- 'image': ex['image']})
48
-
49
- # id를 답변들로 매핑하는 딕셔너리 생성
50
- id_to_answers = {v: k for k, v in answers_to_id.items()}
51
-
52
- # labels로의 매핑을 위한 딕셔너리 생성
53
- id_to_labels = {k: ex['answers'] for k, ex in enumerate(selected_dataset)}
54
-
55
- # ID로 매핑된 'answers'를 labels로 변환
56
- selected_dataset = selected_dataset.map(lambda ex: {'answers': id_to_labels.get(ex['answers'][0]),
57
- 'question': ex['question'],
58
- 'image': ex['image']})
59
- # 편평화시키기
60
- flattened_features = []
61
-
62
- # 각 데이터 편평화하여 flattened_features에 추가
63
- for ex in selected_dataset:
64
- flattened_example = {
65
- 'answers': ex['answers'],
66
- 'question': ex['question'],
67
- 'image': ex['image'],
68
- }
69
- flattened_features.append(flattened_example)
70
-
71
- """### 3-1. 결과 확인"""
72
-
73
- selected_dataset
74
-
75
- """# 4. 모델 가져오기"""
76
-
77
- ##모델 가져오기
78
- from huggingface_hub import notebook_login
79
- notebook_login('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')
80
-
81
- # Use a pipeline as a high-level helper
82
- from transformers import pipeline
83
- pipe = pipeline("visual-question-answering", model="microsoft/git-base-vqav2")
84
-
85
- # Load model directly
86
- from transformers import AutoProcessor, AutoModelForCausalLM
87
-
88
- processor = AutoProcessor.from_pretrained("microsoft/git-base-vqav2")
89
- model = AutoModelForCausalLM.from_pretrained("microsoft/git-base-vqav2")
90
- # Push the model to your namespace with the name "my-finetuned-bert".
91
- model.push_to_hub("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")
92
-
93
-
94
-
95
- """# 5. 데이터 전처리"""
96
-
97
- #BERT 토크나이저 불러오기
98
- tokenizer = BertTokenizerFast.from_pretrained('bert-base-multilingual-cased')
99
-
100
- # 데이터셋 불러오기
101
- ok_vqa_dataset = load_dataset("Multimodal-Fatima/OK-VQA_train")
102
-
103
- # 처음 300개의 예제만 선택합니다
104
- ok_vqa_dataset = ok_vqa_dataset['train'].select(range(300))
105
-
106
- # 데이터 전처리 함수 정의
107
- def preprocess_function(examples):
108
- # 질문 토큰화
109
- tokenized_inputs = tokenizer(examples['question'], truncation=True, padding=True)
110
-
111
- # 'pixel_values'와 'pixel_mask'를 300개의 요소로 설정합니다
112
- examples['pixel_values'] = [(4, 3, 244, 244)] * 300 # 실제 픽셀 값으로 대체해야 합니다
113
- examples['pixel_mask'] = [1] * 300 # 실제 픽셀 마스크 값으로 대체해야 합니다
114
-
115
- return {
116
- 'input_ids': tokenized_inputs['input_ids'],
117
- 'attention_mask': tokenized_inputs['attention_mask'],
118
- 'pixel_values': examples['pixel_values'],
119
- 'pixel_mask': examples['pixel_mask'],
120
- 'labels': [[label] for label in examples['answers'][:300]] # 'answers'를 2차원 배열로 한정합니다
121
- }
122
-
123
- # 데이터셋에 전처리를 적용합니다
124
- ok_vqa_dataset = ok_vqa_dataset.map(preprocess_function, batched=True)
125
-
126
- # 'ok_vqa_dataset'의 features를 정리합니다
127
- ok_vqa_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'pixel_values', 'pixel_mask', 'labels'])
128
-
129
-
130
- #ok_vqa_dataset에서 하기가 힘들어서 새로운 new_ok_vqa_dataset으로 정렬
131
- new_ok_vqa_dataset = Dataset.from_dict({
132
- 'input_ids': ok_vqa_dataset['input_ids'],
133
- 'attention_mask': ok_vqa_dataset['attention_mask'],
134
- 'pixel_values': ok_vqa_dataset['pixel_values'],
135
- 'pixel_mask': ok_vqa_dataset['pixel_mask'],
136
- 'labels': ok_vqa_dataset['labels']
137
- })
138
-
139
- """### 5-1. 결과 확인"""
140
-
141
- new_ok_vqa_dataset
142
-
143
- """# 6. 배치 생성 및 모델 초기화"""
144
-
145
- from transformers import BertForSequenceClassification, BertTokenizer
146
-
147
- # 모델 초기화 및 가중치 불러오기
148
- model_name = 'microsoft/git-base-vqav2' # 사용할 모델의 이름
149
- model = BertForSequenceClassification.from_pretrained(model_name)
150
-
151
- # 출력 레이블 수 설정
152
- num_labels = len(id_to_labels) # 레이블의 수는 ID로부터 생성된 labels의 길이에 해당합니다
153
- model.config.num_labels = num_labels # 모델 설정에서 출력 레이블 수를 설정합니다
154
-
155
- # 레이블을 ID로 변환하는 함수
156
- id_to_labels = {}
157
-
158
- for k, ex in enumerate(selected_dataset):
159
- if ex['answers'] is not None and len(ex['answers']) > 0:
160
- id_to_labels[k] = ex['answers'][0]
161
-
162
- label_to_id = {v: k for k, v in id_to_labels.items()}
163
-
164
- # 예측된 ID를 레이블로 변환하는 함수
165
- def id_to_label_fn(pred_id):
166
- return id_to_labels[pred_id]
167
-
168
- # 실제 레이블을 모델 출력 포맷에 맞는 ID로 변환하는 함수
169
- def label_to_id_fn(label):
170
- return label_to_id[label]
171
-
172
- # 예측할 입력 문장
173
- input_text = "Your input text goes here..."
174
-
175
- # 입력 문장을 토크나이징하여 모델에 입력할 형태로 변환
176
- tokenizer = BertTokenizer.from_pretrained(model_name)
177
- encoded_input = tokenizer(input_text, return_tensors='pt')
178
-
179
- # 모델에 입력 데이터를 전달하여 예측 수행
180
- with torch.no_grad():
181
- outputs = model(**encoded_input)
182
-
183
- # 예측 결과에서 가장 높은 확률을 가진 레이블 ID 가져오기
184
- predicted_label_id = torch.argmax(outputs.logits).item()
185
-
186
- # 예측된 레이블 ID를 레이블로 변환하여 출력
187
- predicted_label = id_to_label_fn(predicted_label_id)
188
-
189
- """### 6-1. 결과 확인"""
190
-
191
- print("Predicted Label:", predicted_label)
192
-
193
- """# 7. Finetuning"""
194
-
195
- # TrainingArguments 설정
196
- training_args = TrainingArguments(
197
- output_dir='./results', # 모델 아웃풋 디렉토리
198
- num_train_epochs=20, # 학습 에폭 수
199
- per_device_train_batch_size=4, # 배치 사이즈
200
- logging_steps=500, # 로깅 간격
201
- )
202
-
203
- # Trainer 모델 초기화
204
- trainer = Trainer(
205
- model=model, # 학습 모델
206
- args=training_args, # TrainingArguments
207
- train_dataset=new_ok_vqa_dataset # 학습 데이터셋
208
- )
209
-
210
- """7-1. 결과 확인"""
211
-