Spaces:
Paused
์ ์ฒ๋ฆฌ[[preprocess]]
[[open-in-colab]]
๋ชจ๋ธ์ ํ๋ จํ๋ ค๋ฉด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ชจ๋ธ์ ๋ง๋ ์ ๋ ฅ ํ์์ผ๋ก ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ํ ์คํธ, ์ด๋ฏธ์ง ๋๋ ์ค๋์ค์ธ์ง ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ํ ์ ๋ฐฐ์น๋ก ๋ณํํ๊ณ ์กฐ๋ฆฝํ ํ์๊ฐ ์์ต๋๋ค. ๐ค Transformers๋ ๋ชจ๋ธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ๋ฐ ๋์์ด ๋๋ ์ผ๋ จ์ ์ ์ฒ๋ฆฌ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ ๋ค์ ๋ด์ฉ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค:
- ํ ์คํธ๋ Tokenizer๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ ์ํ์ค๋ก ๋ณํํ๊ณ ํ ํฐ์ ์ซ์ ํํ์ ๋ง๋ ํ ํ ์๋ก ์กฐ๋ฆฝํฉ๋๋ค.
- ์์ฑ ๋ฐ ์ค๋์ค๋ Feature extractor๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋์ค ํํ์์ ์ํ์ค ํน์ฑ์ ํ์ ํ์ฌ ํ ์๋ก ๋ณํํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ ๋ ฅ์ ImageProcessor์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํ ์๋ก ๋ณํํฉ๋๋ค.
- ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ์ Processor์ ์ฌ์ฉํ์ฌ ํ ํฌ๋์ด์ ์ ํน์ฑ ์ถ์ถ๊ธฐ ๋๋ ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
AutoProcessor
๋ ์ธ์ ๋ ์๋ํ์ฌ ํ ํฌ๋์ด์ , ์ด๋ฏธ์ง ํ๋ก์ธ์, ํน์ฑ ์ถ์ถ๊ธฐ ๋๋ ํ๋ก์ธ์ ๋ฑ ์ฌ์ฉ ์ค์ธ ๋ชจ๋ธ์ ๋ง๋ ํด๋์ค๋ฅผ ์๋์ผ๋ก ์ ํํฉ๋๋ค.
์์ํ๊ธฐ ์ ์ ๐ค Datasets๋ฅผ ์ค์นํ์ฌ ์คํ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค:
pip install datasets
์์ฐ์ด์ฒ๋ฆฌ[[natural-language-processing]]
ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋๊ตฌ๋ tokenizer์ ๋๋ค. ํ ํฌ๋์ด์ ๋ ์ผ๋ จ์ ๊ท์น์ ๋ฐ๋ผ ํ ์คํธ๋ฅผ ํ ํฐ์ผ๋ก ๋๋๋๋ค. ํ ํฐ์ ์ซ์๋ก ๋ณํ๋๊ณ ํ ์๋ ๋ชจ๋ธ ์ ๋ ฅ์ด ๋ฉ๋๋ค. ๋ชจ๋ธ์ ํ์ํ ์ถ๊ฐ ์ ๋ ฅ์ ํ ํฌ๋์ด์ ์ ์ํด ์ถ๊ฐ๋ฉ๋๋ค.
์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ ๊ณํ์ด๋ผ๋ฉด ๋ชจ๋ธ๊ณผ ํจ๊ป ์ฌ์ ํ๋ จ๋ ํ ํฌ๋์ด์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธ๊ฐ ์ฌ์ ํ๋ จ ๋ง๋ญ์น์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ถํ ๋๊ณ ์ฌ์ ํ๋ จ ์ค์ ๋์ผํ ํด๋น ํ ํฐ-์ธ๋ฑ์ค ์(์ผ๋ฐ์ ์ผ๋ก vocab์ด๋ผ๊ณ ํจ)์ ์ฌ์ฉํฉ๋๋ค.
์์ํ๋ ค๋ฉด [AutoTokenizer.from_pretrained
] ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ํ๋ จ๋ ํ ํฌ๋์ด์ ๋ฅผ ๋ถ๋ฌ์ค์ธ์. ๋ชจ๋ธ๊ณผ ํจ๊ป ์ฌ์ ํ๋ จ๋ vocab์ ๋ค์ด๋ก๋ํฉ๋๋ค:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
๊ทธ ๋ค์์ผ๋ก ํ ์คํธ๋ฅผ ํ ํฌ๋์ด์ ์ ๋ฃ์ด์ฃผ์ธ์:
>>> encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
>>> print(encoded_input)
{'input_ids': [101, 2079, 2025, 19960, 10362, 1999, 1996, 3821, 1997, 16657, 1010, 2005, 2027, 2024, 11259, 1998, 4248, 2000, 4963, 1012, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
ํ ํฌ๋์ด์ ๋ ์ธ ๊ฐ์ง ์ค์ํ ํญ๋ชฉ์ ํฌํจํ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค:
- input_ids๋ ๋ฌธ์ฅ์ ๊ฐ ํ ํฐ์ ํด๋นํ๋ ์ธ๋ฑ์ค์ ๋๋ค.
- attention_mask๋ ํ ํฐ์ ์ฒ๋ฆฌํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.
- token_type_ids๋ ๋ ๊ฐ ์ด์์ ์ํ์ค๊ฐ ์์ ๋ ํ ํฐ์ด ์ํ ์ํ์ค๋ฅผ ์๋ณํฉ๋๋ค.
input_ids
๋ฅผ ๋์ฝ๋ฉํ์ฌ ์
๋ ฅ์ ๋ฐํํฉ๋๋ค:
>>> tokenizer.decode(encoded_input["input_ids"])
'[CLS] Do not meddle in the affairs of wizards, for they are subtle and quick to anger. [SEP]'
ํ ํฌ๋์ด์ ๊ฐ ๋ ๊ฐ์ ํน์ํ ํ ํฐ(๋ถ๋ฅ ํ ํฐ CLS
์ ๋ถํ ํ ํฐ SEP
)์ ๋ฌธ์ฅ์ ์ถ๊ฐํ์ต๋๋ค.
๋ชจ๋ ๋ชจ๋ธ์ ํน์ํ ํ ํฐ์ด ํ์ํ ๊ฒ์ ์๋์ง๋ง, ํ์ํ๋ค๋ฉด ํ ํฌ๋์ด์ ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
์ ์ฒ๋ฆฌํ ๋ฌธ์ฅ์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ฆฌ์คํธ๋ก ํ ํฌ๋์ด์ ์ ์ ๋ฌํฉ๋๋ค:
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_inputs = tokenizer(batch_sentences)
>>> print(encoded_inputs)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102],
[101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
[101, 1327, 1164, 5450, 23434, 136, 102]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1]]}
ํจ๋ฉ[[pad]]
๋ชจ๋ธ ์ ๋ ฅ์ธ ํ ์๋ ๋ชจ์์ด ๊ท ์ผํด์ผ ํ์ง๋ง, ๋ฌธ์ฅ์ ๊ธธ์ด๊ฐ ํญ์ ๊ฐ์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ํจ๋ฉ์ ์งง์ ๋ฌธ์ฅ์ ํน์ํ ํจ๋ฉ ํ ํฐ์ ์ถ๊ฐํ์ฌ ํ ์๋ฅผ ์ง์ฌ๊ฐํ ๋ชจ์์ด ๋๋๋ก ํ๋ ์ ๋ต์ ๋๋ค.
padding
๋งค๊ฐ๋ณ์๋ฅผ True
๋ก ์ค์ ํ์ฌ ๋ฐฐ์น ๋ด์ ์งง์ ์ํ์ค๋ฅผ ๊ฐ์ฅ ๊ธด ์ํ์ค์ ๋ง์ถฐ ํจ๋ฉํฉ๋๋ค.
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_input = tokenizer(batch_sentences, padding=True)
>>> print(encoded_input)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
[101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
[101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}
๊ธธ์ด๊ฐ ์งง์ ์ฒซ ๋ฌธ์ฅ๊ณผ ์ธ ๋ฒ์งธ ๋ฌธ์ฅ์ด ์ด์ 0
์ผ๋ก ์ฑ์์ก์ต๋๋ค.
์๋ผ๋ด๊ธฐ[[truncation]]
ํํธ, ๋๋ก๋ ์ํ์ค๊ฐ ๋ชจ๋ธ์์ ์ฒ๋ฆฌํ๊ธฐ์ ๋๋ฌด ๊ธธ ์๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ์ํ์ค๋ฅผ ๋ ์งง๊ฒ ์ค์ผ ํ์๊ฐ ์์ต๋๋ค.
๋ชจ๋ธ์์ ํ์ฉํ๋ ์ต๋ ๊ธธ์ด๋ก ์ํ์ค๋ฅผ ์๋ฅด๋ ค๋ฉด truncation
๋งค๊ฐ๋ณ์๋ฅผ True
๋ก ์ค์ ํ์ธ์:
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True)
>>> print(encoded_input)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
[101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
[101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}
๋ค์ํ ํจ๋ฉ๊ณผ ์๋ผ๋ด๊ธฐ ์ธ์์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด ํจ๋ฉ๊ณผ ์๋ผ๋ด๊ธฐ ๊ฐ๋ ๊ฐ์ด๋๋ฅผ ํ์ธํด๋ณด์ธ์.
ํ ์ ๋ง๋ค๊ธฐ[[build-tensors]]
๋ง์ง๋ง์ผ๋ก, ํ ํฌ๋์ด์ ๊ฐ ๋ชจ๋ธ์ ๊ณต๊ธ๋๋ ์ค์ ํ ์๋ฅผ ๋ฐํํ๋๋ก ํฉ๋๋ค.
return_tensors
๋งค๊ฐ๋ณ์๋ฅผ PyTorch์ ๊ฒฝ์ฐ pt
, TensorFlow์ ๊ฒฝ์ฐ tf
๋ก ์ค์ ํ์ธ์:
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt")
>>> print(encoded_input)
{'input_ids': tensor([[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
[101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
[101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]]),
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]])}
```py
>>> batch_sentences = [
... "But what about second breakfast?",
... "Don't think he knows about second breakfast, Pip.",
... "What about elevensies?",
... ]
>>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="tf")
>>> print(encoded_input)
{'input_ids': ,
'token_type_ids': ,
'attention_mask': }
```
์ค๋์ค[[audio]]
์ค๋์ค ์์ ์ ๋ชจ๋ธ์ ๋ง๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ํน์ฑ ์ถ์ถ๊ธฐ๊ฐ ํ์ํฉ๋๋ค. ํน์ฑ ์ถ์ถ๊ธฐ๋ ์์ ์ค๋์ค ๋ฐ์ดํฐ์์ ํน์ฑ๋ฅผ ์ถ์ถํ๊ณ ์ด๋ฅผ ํ ์๋ก ๋ณํํ๋ ๊ฒ์ด ๋ชฉ์ ์ ๋๋ค.
์ค๋์ค ๋ฐ์ดํฐ ์ธํธ์ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด๊ธฐ ์ํด MInDS-14 ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์ค์ธ์. (๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๐ค ๋ฐ์ดํฐ ์ธํธ ํํ ๋ฆฌ์ผ์์ ์์ธํ ์ค๋ช ํ๊ณ ์์ต๋๋ค.)
>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
audio
์ด์ ์ฒซ ๋ฒ์งธ ์์์ ์ ๊ทผํ์ฌ ์
๋ ฅ์ ์ดํด๋ณด์ธ์. audio
์ด์ ํธ์ถํ๋ฉด ์ค๋์ค ํ์ผ์ ์๋์ผ๋ก ๊ฐ์ ธ์ค๊ณ ๋ฆฌ์ํ๋งํฉ๋๋ค.
>>> dataset[0]["audio"]
{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
0. , 0. ], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'sampling_rate': 8000}
์ด๋ ๊ฒ ํ๋ฉด ์ธ ๊ฐ์ง ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค:
array
๋ 1D ๋ฐฐ์ด๋ก ๊ฐ์ ธ์์ (ํ์ํ ๊ฒฝ์ฐ) ๋ฆฌ์ํ๋ง๋ ์์ฑ ์ ํธ์ ๋๋ค.path
๋ ์ค๋์ค ํ์ผ์ ์์น๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.sampling_rate
๋ ์์ฑ ์ ํธ์์ ์ด๋น ์ธก์ ๋๋ ๋ฐ์ดํฐ ํฌ์ธํธ ์๋ฅผ ๋ํ๋ ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ Wav2Vec2 ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ธ ์นด๋๋ฅผ ๋ณด๋ฉด Wav2Vec2๊ฐ 16kHz ์ํ๋ง๋ ์์ฑ ์ค๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ ํ๋ จ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ชจ๋ธ์ ์ฌ์ ํ๋ จํ๋ ๋ฐ ์ฌ์ฉ๋ ๋ฐ์ดํฐ ์ธํธ์ ์ํ๋ง ๋ ์ดํธ์ ์ค๋์ค ๋ฐ์ดํฐ์ ์ํ๋ง ๋ ์ดํธ๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ์ ์ํ๋ง ๋ ์ดํธ๊ฐ ๋ค๋ฅด๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์ํ๋งํด์ผ ํฉ๋๋ค.
- ๐ค Datasets์ [
~datasets.Dataset.cast_column
] ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ง ๋ ์ดํธ๋ฅผ 16kHz๋ก ์ ์ํ๋งํ์ธ์:
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
- ์ค๋์ค ํ์ผ์ ๋ฆฌ์ํ๋งํ๊ธฐ ์ํด
audio
์ด์ ๋ค์ ํธ์ถํฉ๋๋ค:
>>> dataset[0]["audio"]
{'array': array([ 2.3443763e-05, 2.1729663e-04, 2.2145823e-04, ...,
3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'sampling_rate': 16000}
๋ค์์ผ๋ก, ์
๋ ฅ์ ์ ๊ทํํ๊ณ ํจ๋ฉํ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ๊ฐ์ ธ์ค์ธ์. ํ
์คํธ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๋ ์งง์ ์ํ์ค์ ๋ํด 0
์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ค๋์ค ๋ฐ์ดํฐ์๋ ๊ฐ์ ๊ฐ๋
์ด ์ ์ฉ๋ฉ๋๋ค.
ํน์ฑ ์ถ์ถ๊ธฐ๋ ๋ฐฐ์ด์ 0
(๋ฌต์์ผ๋ก ํด์)์ ์ถ๊ฐํฉ๋๋ค.
[AutoFeatureExtractor.from_pretrained
]๋ฅผ ์ฌ์ฉํ์ฌ ํน์ฑ ์ถ์ถ๊ธฐ๋ฅผ ๊ฐ์ ธ์ค์ธ์:
>>> from transformers import AutoFeatureExtractor
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")
์ค๋์ค array
๋ฅผ ํน์ฑ ์ถ์ถ๊ธฐ์ ์ ๋ฌํ์ธ์. ๋ํ, ๋ฐ์ํ ์ ์๋ ์กฐ์ฉํ ์ค๋ฅ(silent errors)๋ฅผ ๋ ์ ๋๋ฒ๊น
ํ ์ ์๋๋ก ํน์ฑ ์ถ์ถ๊ธฐ์ sampling_rate
์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
>>> audio_input = [dataset[0]["audio"]["array"]]
>>> feature_extractor(audio_input, sampling_rate=16000)
{'input_values': [array([ 3.8106556e-04, 2.7506407e-03, 2.8015103e-03, ...,
5.6335266e-04, 4.6588284e-06, -1.7142107e-04], dtype=float32)]}
ํ ํฌ๋์ด์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฐ์น ๋ด์์ ๊ฐ๋ณ์ ์ธ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํจ๋ฉ ๋๋ ์๋ผ๋ด๊ธฐ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ ๊ฐ์ ์ค๋์ค ์ํ์ ์ํ์ค ๊ธธ์ด๋ฅผ ํ์ธํด๋ณด์ธ์:
>>> dataset[0]["audio"]["array"].shape
(173398,)
>>> dataset[1]["audio"]["array"].shape
(106496,)
์ค๋์ค ์ํ์ ๊ธธ์ด๊ฐ ๋์ผํ๋๋ก ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋ง๋์ธ์. ์ต๋ ์ํ ๊ธธ์ด๋ฅผ ์ง์ ํ๋ฉด ํน์ฑ ์ถ์ถ๊ธฐ๊ฐ ํด๋น ๊ธธ์ด์ ๋ง์ถฐ ์ํ์ค๋ฅผ ํจ๋ฉํ๊ฑฐ๋ ์๋ผ๋ ๋๋ค:
>>> def preprocess_function(examples):
... audio_arrays = [x["array"] for x in examples["audio"]]
... inputs = feature_extractor(
... audio_arrays,
... sampling_rate=16000,
... padding=True,
... max_length=100000,
... truncation=True,
... )
... return inputs
preprocess_function
์ ๋ฐ์ดํฐ ์ธํธ์ ์ฒ์ ์์ ๋ช ๊ฐ์ ์ ์ฉํด๋ณด์ธ์:
>>> processed_dataset = preprocess_function(dataset[:5])
์ด์ ์ํ ๊ธธ์ด๊ฐ ๋ชจ๋ ๊ฐ๊ณ ์ง์ ๋ ์ต๋ ๊ธธ์ด์ ๋ง๊ฒ ๋์์ต๋๋ค. ๋๋์ด ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ชจ๋ธ์ ์ ๋ฌํ ์ ์์ต๋๋ค!
>>> processed_dataset["input_values"][0].shape
(100000,)
>>> processed_dataset["input_values"][1].shape
(100000,)
์ปดํจํฐ ๋น์ [[computer-vision]]
์ปดํจํฐ ๋น์ ์์ ์ ๊ฒฝ์ฐ, ๋ชจ๋ธ์ ๋ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ์ด๋ฏธ์ง ํ๋ก์ธ์๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ชจ๋ธ์ด ์์ํ๋ ์ ๋ ฅ์ผ๋ก ๋ณํํ๋ ์ฌ๋ฌ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ฌํ ๋จ๊ณ์๋ ํฌ๊ธฐ ์กฐ์ , ์ ๊ทํ, ์์ ์ฑ๋ ๋ณด์ , ์ด๋ฏธ์ง์ ํ ์ ๋ณํ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง ์ฆ๊ฐ ๊ธฐ๋ฒ์ ๋ช ๊ฐ์ง ์ ์ฉํ ๋ค์ ํ ์๋ ์์ต๋๋ค. ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ ๋ฐ ์ด๋ฏธ์ง ์ฆ๊ฐ์ ๋ชจ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ง๋ง, ์๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
- ์ด๋ฏธ์ง ์ฆ๊ฐ์ ๊ณผ์ ํฉ(over-fitting)์ ๋ฐฉ์งํ๊ณ ๋ชจ๋ธ์ ๊ฒฌ๊ณ ํจ(resiliency)์ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ ๋ฐฉ์์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ ํฉ๋๋ค. ๋ฐ๊ธฐ์ ์์ ์กฐ์ , ์๋ฅด๊ธฐ, ํ์ , ํฌ๊ธฐ ์กฐ์ , ํ๋/์ถ์ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฆ๊ฐ์ผ๋ก ์ด๋ฏธ์ง์ ์๋ฏธ๊ฐ ๋ฐ๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง๊ฐ ๋ชจ๋ธ์ด ์์ํ๋ ์ ๋ ฅ ํ์๊ณผ ์ผ์นํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ปดํจํฐ ๋น์ ๋ชจ๋ธ์ ๋ฏธ์ธ ์กฐ์ ํ ๋ ์ด๋ฏธ์ง๋ ๋ชจ๋ธ์ด ์ด๊ธฐ์ ํ๋ จ๋ ๋์ ์ ํํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
์ด๋ฏธ์ง ์ฆ๊ฐ์๋ ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฌด์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ์๋ ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐ๋ ImageProcessor
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
food101 ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์์ ์ปดํจํฐ ๋น์ ๋ฐ์ดํฐ ์ธํธ์์ ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ณด์ธ์. ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ๐ค ๋ฐ์ดํฐ ์ธํธ ํํ ๋ฆฌ์ผ์ ์ฐธ๊ณ ํ์ธ์.
๋ฐ์ดํฐ ์ธํธ๊ฐ ์๋นํ ํฌ๊ธฐ ๋๋ฌธ์ ๐ค Datasets์ split
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ จ ์ธํธ์์ ์์ ์ํ๋ง ๊ฐ์ ธ์ค์ธ์!
>>> from datasets import load_dataset
>>> dataset = load_dataset("food101", split="train[:100]")
๋ค์์ผ๋ก, ๐ค Datasets์ image
๋ก ์ด๋ฏธ์ง๋ฅผ ํ์ธํด๋ณด์ธ์:
>>> dataset[0]["image"]
[AutoImageProcessor.from_pretrained
]๋ก ์ด๋ฏธ์ง ํ๋ก์ธ์๋ฅผ ๊ฐ์ ธ์ค์ธ์:
>>> from transformers import AutoImageProcessor
>>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
๋จผ์ ์ด๋ฏธ์ง ์ฆ๊ฐ ๋จ๊ณ๋ฅผ ์ถ๊ฐํด ๋ด
์๋ค. ์๋ฌด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ง๋ง, ์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ torchvision์ transforms
๋ชจ๋์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ๋ฐ์ดํฐ ์ฆ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ถ๋ค๋ฉด, Albumentations ๋๋ Kornia notebooks์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋ฐฐ์ธ ์ ์์ต๋๋ค.
Compose
๋กRandomResizedCrop
์ColorJitter
๋ฑ ๋ณํ์ ๋ช ๊ฐ์ง ์ฐ๊ฒฐํ์ธ์. ์ฐธ๊ณ ๋ก ํฌ๊ธฐ ์กฐ์ ์ ํ์ํ ์ด๋ฏธ์ง์ ํฌ๊ธฐ ์๊ตฌ์ฌํญ์image_processor
์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ผ๋ถ ๋ชจ๋ธ์ ์ ํํ ๋์ด์ ๋๋น๋ฅผ ์๊ตฌํ์ง๋ง, ์ ์ผ ์งง์ ๋ณ์ ๊ธธ์ด(shortest_edge
)๋ง ์ ์๋ ๋ชจ๋ธ๋ ์์ต๋๋ค.
>>> from torchvision.transforms import RandomResizedCrop, ColorJitter, Compose
>>> size = (
... image_processor.size["shortest_edge"]
... if "shortest_edge" in image_processor.size
... else (image_processor.size["height"], image_processor.size["width"])
... )
>>> _transforms = Compose([RandomResizedCrop(size), ColorJitter(brightness=0.5, hue=0.5)])
- ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก
pixel_values
๋ฅผ ๋ฐ์ต๋๋ค.ImageProcessor
๋ ์ด๋ฏธ์ง ์ ๊ทํ ๋ฐ ์ ์ ํ ํ ์ ์์ฑ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐฐ์น ์ด๋ฏธ์ง์ ๋ํ ์ด๋ฏธ์ง ์ฆ๊ฐ ๋ฐ ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๋ฅผ ๊ฒฐํฉํ๊ณpixel_values
๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค:
>>> def transforms(examples):
... images = [_transforms(img.convert("RGB")) for img in examples["image"]]
... examples["pixel_values"] = image_processor(images, do_resize=False, return_tensors="pt")["pixel_values"]
... return examples
์์ ์์์๋ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ค์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ ๋๋ฌธ์ do_resize=False
๋ก ์ค์ ํ๊ณ , ํด๋น image_processor
์์ size
์์ฑ์ ํ์ฉํ์ต๋๋ค.
์ด๋ฏธ์ง ์ฆ๊ฐ ์ค์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ง ์์ ๊ฒฝ์ฐ ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์๋ตํ์ธ์.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ImageProcessor
๊ฐ ํฌ๊ธฐ ์กฐ์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฆ๊ฐ ๋ณํ ๊ณผ์ ์์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ทํํ๋ ค๋ฉด image_processor.image_mean
๋ฐ image_processor.image_std
๊ฐ์ ์ฌ์ฉํ์ธ์.
- ๐ค Datasets์
set_transform
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ณํ์ ์ ์ฉํฉ๋๋ค:
>>> dataset.set_transform(transforms)
- ์ด์ ์ด๋ฏธ์ง์ ์ ๊ทผํ๋ฉด ์ด๋ฏธ์ง ํ๋ก์ธ์๊ฐ
pixel_values
๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋๋์ด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ชจ๋ธ์ ์ ๋ฌํ ์ ์์ต๋๋ค!
>>> dataset[0].keys()
๋ค์์ ๋ณํ์ด ์ ์ฉ๋ ํ์ ์ด๋ฏธ์ง์ ๋๋ค. ์ด๋ฏธ์ง๊ฐ ๋ฌด์์๋ก ์๋ ค๋๊ฐ๊ณ ์์ ์์ฑ์ด ๋ค๋ฆ ๋๋ค.
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> img = dataset[0]["pixel_values"]
>>> plt.imshow(img.permute(1, 2, 0))
ImageProcessor
๋ ๊ฐ์ฒด ๊ฐ์ง, ์๋งจํฑ ์ธ๊ทธ๋ฉํ
์ด์
(semantic segmentation), ์ธ์คํด์ค ์ธ๊ทธ๋ฉํ
์ด์
(instance segmentation), ํ๋ํฑ ์ธ๊ทธ๋ฉํ
์ด์
(panoptic segmentation)๊ณผ ๊ฐ์ ์์
์ ๋ํ ํ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ชจ๋ธ์ ์์ ์ถ๋ ฅ์ ๊ฒฝ๊ณ ์์๋ ์ธ๊ทธ๋ฉํ
์ด์
๋งต๊ณผ ๊ฐ์ ์๋ฏธ ์๋ ์์ธก์ผ๋ก ๋ณํํด์ค๋๋ค.
ํจ๋ฉ[[pad]]
์๋ฅผ ๋ค์ด, DETR์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ธ์ด ํ๋ จํ ๋ ํฌ๊ธฐ ์กฐ์ ์ฆ๊ฐ์ ์ ์ฉํฉ๋๋ค.
์ด๋ก ์ธํด ๋ฐฐ์น ๋ด ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
[DetrImageProcessor
]์ [DetrImageProcessor.pad
]๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ ์ ์ collate_fn
์ ์ ์ํด์ ๋ฐฐ์น ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
>>> def collate_fn(batch):
... pixel_values = [item["pixel_values"] for item in batch]
... encoding = image_processor.pad(pixel_values, return_tensors="pt")
... labels = [item["labels"] for item in batch]
... batch = {}
... batch["pixel_values"] = encoding["pixel_values"]
... batch["pixel_mask"] = encoding["pixel_mask"]
... batch["labels"] = labels
... return batch
๋ฉํฐ๋ชจ๋ฌ[[multimodal]]
๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ์ด ํ์ํ ์์ ์ ๊ฒฝ์ฐ, ๋ชจ๋ธ์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํ ํ๋ก์ธ์๊ฐ ํ์ํฉ๋๋ค. ํ๋ก์ธ์๋ ํ ํฌ๋์ด์ ์ ํน์ฑ ์ถ์ถ๊ธฐ์ ๊ฐ์ ๋ ๊ฐ์ง ์ฒ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
LJ Speech ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์์ ์๋ ์์ฑ ์ธ์(ASR)์ ์ํ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ์ธ์. (๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๐ค ๋ฐ์ดํฐ ์ธํธ ํํ ๋ฆฌ์ผ์์ ๋ณผ ์ ์์ต๋๋ค.)
>>> from datasets import load_dataset
>>> lj_speech = load_dataset("lj_speech", split="train")
์๋ ์์ฑ ์ธ์(ASR)์์๋ audio
์ text
์๋ง ์ง์คํ๋ฉด ๋๋ฏ๋ก, ๋ค๋ฅธ ์ด๋ค์ ์ ๊ฑฐํ ์ ์์ต๋๋ค:
>>> lj_speech = lj_speech.map(remove_columns=["file", "id", "normalized_text"])
์ด์ audio
์ text
์ด์ ์ดํด๋ณด์ธ์:
>>> lj_speech[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
7.3242188e-04, 2.1362305e-04, 6.1035156e-05], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
'sampling_rate': 22050}
>>> lj_speech[0]["text"]
'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'
๊ธฐ์กด์ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ ์ธํธ์ ์๋ก์ด ์ค๋์ค ๋ฐ์ดํฐ ์ธํธ์ ์ํ๋ง ๋ ์ดํธ๋ฅผ ์ผ์น์ํค๊ธฐ ์ํด ์ค๋์ค ๋ฐ์ดํฐ ์ธํธ์ ์ํ๋ง ๋ ์ดํธ๋ฅผ ๋ฆฌ์ํ๋งํด์ผ ํฉ๋๋ค!
>>> lj_speech = lj_speech.cast_column("audio", Audio(sampling_rate=16_000))
[AutoProcessor.from_pretrained
]๋ก ํ๋ก์ธ์๋ฅผ ๊ฐ์ ธ์ค์ธ์:
>>> from transformers import AutoProcessor
>>> processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h")
array
์ ๋ค์ด ์๋ ์ค๋์ค ๋ฐ์ดํฐ๋ฅผinput_values
๋ก ๋ณํํ๊ณtext
๋ฅผ ํ ํฐํํ์ฌlabels
๋ก ๋ณํํ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค. ๋ชจ๋ธ์ ์ ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
>>> def prepare_dataset(example):
... audio = example["audio"]
... example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
... return example
- ์ํ์
prepare_dataset
ํจ์์ ์ ์ฉํ์ธ์:
>>> prepare_dataset(lj_speech[0])
์ด์ ํ๋ก์ธ์๊ฐ input_values
์ labels
๋ฅผ ์ถ๊ฐํ๊ณ , ์ํ๋ง ๋ ์ดํธ๋ ์ฌ๋ฐ๋ฅด๊ฒ 16kHz๋ก ๋ค์ด์ํ๋งํ์ต๋๋ค.
๋๋์ด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ชจ๋ธ์ ์ ๋ฌํ ์ ์์ต๋๋ค!