공개 데이터 세트 다운로드 및 사용
공개 데이터 세트를 하고 싶다면 평소 텐소플로우에 관한 데이터 세트를 사용한다.
이렇게 되면 내가 다른 작업을 시도하고 싶을 때(예를 들어 도메인 이름 적응)
때로는 데이터가 없어서 괴로울 때도 있다.
그래서 이번에는 비망록을 위해 데이터 집합의 가공에 대해 쓰고 싶습니다.
대상
또한python 3을 사용하여 인코딩합니다.
※ 4단계 이후 이미지 데이터 세트를 사용해 작성할 예정입니다.
※ 필자는 Jupter notebook에서 대화성 검사를 하면서 코드를 썼는데, 너무 지루하게 썼을 수도 있습니다.용서해 주세요.
0. 라이브러리 확인
최근에 여러 가지 데이터 세트가 공개가 됐어요.
scikit-learn의 샘플 데이터 집합
ptorch의 샘플 데이터 세트 (이미지)
pytric의 샘플 데이터 집합 (소리)
ptorch의 샘플 데이터 세트 (텍스트)
tensorflow의 샘플 데이터 집합
만약 여기에 없다면, 나는 구글에 가서 데이터 집합을 다운로드할 수 있는 웹 페이지를 찾으려고 노력할 것이다.
1. 파일 다운로드
터미널 입력을 통해 linux 기계에 다운로드합니다.
(다운로드 단추를 눌러서 다운로드할 수도 있지만, 여기는linux 명령으로 씁니다.)
이후에 없는 케이스 명령 (다음 예에서 hoge 명령이 없는 경우)
터미널에서 다음 내용을 입력하여 찾으십시오.
sudo apt-get install hoge
또는sudo yum install hoge
WEB에서 파일을 가져오는 유명한 명령필자는 항상 wget을 자주 사용한다고 생각해서 이를 계기로 다른 점을 관찰해 보았다.
참조: curl과 Wget의 비교
그렇군요. 지지하는 협의는 많이 다르군요.
그럼 폴더를 지정해서 다운로드하세요.
이 예에서는 파일https://www.hoge.com/dataset.zip을 폴더(/home/datasets)에 저장합니다.
wget -P /home/datasets https://www.hoge.com/dataset.zip
curl -o /home/datasets https://www.hoge.com/dataset.zip
2. 파일 전송
이 단계는 필요 없어도 돼요.
프록시 때문에 컴퓨터 서버에 직접 다운로드할 수 없는 경우
수중에 다운로드하여 서버에 전송하다.
scp 명령을 사용하면 ssh로 전송할 수 있습니다.
scp 명령의 사용 방법을 간단하게 봅시다.
여기 설정은요.
scp ./hoge.zip [email protected]:/home/huga/
만약에.zip이 해제되어 생성된 폴더 hoge를 보낼 때 -r 옵션을 지정합니다.scp -r ./hoge [email protected]:/home/huga/
해동은 다음과 같다.데이터 집합만큼 큰 폴더를 보내는 것보다 압축된 데이터를 보내는 것이 좋다고 생각합니다.
3. 파일 압축 풀기
공개 데이터 집합은 대부분 zip과 tar로 압축되기 때문에 해동된다.
여기에 데이터 집합 (dataset.zip 또는 dataset.tar.gz) 을 동결해제 대상 폴더 (/path/hoge) 로 동결해제합니다.
.zip의 경우 다음과 같습니다.
unzip dataset.zip -d /path/hoge
.tar.gz의 상황은 다음과 같다.tar xvzf dataset.tar.gz -C /path/hoge
찾아보니까 알겠다.unar 이 명령은 여러 가지 압축 파일을 해제할 수 있을 것 같다(ZIP와 TAR, 7z와 LZH 등뿐만 아니라).
unar을 사용하면 다음과 같다.
unar -o path/hoge dataset.zip
4. 데이터 집합을 처리할 수 있는 형식으로 만들기
tensorflow 사용자인 필자는 (Num, H, W, Ch) 모양의 numby 파일이 있다면 매우 기쁠 것이다.
따라서 여기서 목표는 이미지를 (Num, H, W, Ch) 모양으로 만드는 것입니다.
(Num: 데이터 수, H. W: 이미지 크기, Ch: 채널 수)
Channel first 데이터를 원하는 경우 적절한 수준으로 교체하십시오.
나중에 없는 라이브러리(예: hoge)
터미널에 다음을 입력합니다.
pip3 install hoge
Jupter Notebook에 다음을 입력하고 가져옵니다.!pip3 install hoge
※ 이후에는 이미지를 귀일화하지 않지만, 일반적으로 다음과 같이 8비트 이미지를 귀일화합니다.이렇게 하면 픽셀 값이 [0,1] 범위 내에서 사용하기 쉽다.
import numpy as np
images = images.astype(np.float32) / 255 # 255 = 2^8 - 1で8bitの最大値を表す
# code
※ 이후의 목적은 이미지와 라벨의 배열 획득아래pickel에서 저장할 수 있습니다.
import numpy as np
np.savez('dataset.npz', images = images, labels = labels)
"""
# ちなみに読むときは
dataset = np.load('dataset.npz')
images = dataset['images']
labels = dataset['labels']
# のようにします。
"""
4.1 다운로드한 파일.mat 때.
Syn.Digits라는 숫자의 이미지 데이터 세트를 예로 들어 설명합니다.
.mat는 MATLAB에서 사용되는 파일 형식입니다.
MATLAB 사용자라면 즐거울 텐데 파이썬 사용자는요?
여기서 포기해야 하나...
scipy가 쓸 수 있다면 포기할 필요 없어!
일단mat 파일을 읽습니다.
import scipy.io
dictionary = scipy.io.loadmat(filename)
그럼, 안에 있는 걸 바로 확인해 볼게요.print(dictionary)
'X'는 이미지 데이터이고'y'는 라벨 데이터입니다.여기서도 이미지 데이터의 차원을 확인해 봅시다.
print(dictionary['X'].shape)
print(dictionary['y'].shape)
그러나 이미지 데이터가(W,H,Ch,Num)의 형식이기 때문에tensorflow 사용자의 필자에게 처리하기 어렵다.어쨌든, 일단 넘을 맨 앞으로 바꾸자.여기에 턴오버를 사용했습니다.
images = dictionary['X'].T
이렇게 하면 (Num, Ch, W, H)입니다.필자는 Ch가 최후의 차원에 있기를 바라기 때문에 좀 더 공을 들일 것이다.
images = np.swapaxes(images, 1, 3)
이렇게 하면 차원이 바뀐다(Num, H, W, Ch).※ 혹시 모르니까 제가 먼저 적어볼게요. 파이썬 번호는 0으로 시작합니다.
요약(Syn.Digits의 함수 읽기)
함수.
import scipy.io
def load_syndigit(filename):
dictionary = scipy.io.loadmat(filename) # .matファイルの読み込み
images = np.swapaxes(dictionary['X'].T, 1,3) # 画像データの次元を整える
labels = dictionary['y'] # ラベルデータを取得
return images, labels
4.2 다운로드한 데이터 세트가 이미지 파일 + 텍스트 파일인 경우
여기서는 MNIST-M 디지털 이미지 데이터 세트의 예를 들어 설명합니다.
텍스트 파일은python의 표준 함수로 읽습니다.
그림 파일을 읽는 방법은 여러 가지가 있는데, 여기서 필자는 설치 오류가 있는 PIL을 자주 사용한다.
PIL에 대해 설치 방법을 적어 두십시오.
↓ 단말기
pip3 install pillow
↓ Jupyter Notebook에서!pip3 install pillow
먼저 텍스트 파일을 읽고 한 줄만 보세요.f = open(filename) # テキストファイルを開く
data = f.read() # データを取ってくる
f.close # ファイルを閉じるのを忘れない
print(data)
파일 이름 레이블(행 분리)이런 형식의 데이터.
나는 초상화를 보기 위해 앞부분과 뒷부분을 분리하고 싶다.
f = open(filename) # テキストファイルを開く
data = f.read().split('\n') # データを取ってきて1行ずつをリストに入れる
f.close # ファイルを閉じるのを忘れない
sample = data[0] # 1行目だけ取ってくる
filename, label = sample.split() # スペースで行を分割する
이렇게 해서 파일 이름이 나왔어요. 그림을 읽고 싶어요.from PIL import Image
import matplotlib as plt
# % matplotlib inline # jupyter notebookで表示させる用のメモのためコメントアウト
import numpy as np
# pathは画像フォルダのパスです。
img = Image.open(path+filename) # 画像の読み込み
img_array = np.asarray(img) # numpy配列が扱いやすいのでnuppy配列に変換
plt.show(img_array, cmp='gray_r') # 画像の表示
이미지와 레이블을 정렬합니다.여기의 총결은 아래와 같다.
images = np.concatenate([images, np.expand_dims(img, axis = 0)], axis = 0)
labels = np.concatenate([labels, np.expand_dims(label, axis = 0)], axis = 0)
요약(MNIST-m 읽기 함수)
함수.
import numpy as np
from PIL import Image
def load_mnist_m(filename):
image_path, _ = filename.rsplit('_', 1)
# 解凍したらファイル名~_labels.txtの~部分が画像フォルダだったので
# テキストファイル読み込み
f = open(filename)
data = f.read().split('\n')
f.close
# データセットの形にしていく
for i in range (len(data)):
sample = data[i]
if not sample:
break # 最後の行が空白だった
else:
# 画像の読み込み
file, label = sample.split()
filename = image_path + '/' + file
img = Image.open(filename)
img = np.asarray(img)
# labelはstr型よりもint型で扱いたい
label = np.array([int(label)])
# 連結
if i == 0:
imeges = np.expand_dims(img, axis = 0)
labels = np.expand_dims(label, axis = 0)
# (Num, 1)という形が個人的に好みだったので
else:
images = np.concatenate([images, np.expand_dims(img, axis = 0)], axis = 0)
labels = np.concatenate([labels, np.expand_dims(label, axis = 0)], axis = 0)
# (Num, 1)という形が個人的に好みだったので
return images, labels
4.3 다운로드한 데이터 세트가 범주별 폴더에 이미지 데이터가 있는 경우
(이 슬라이드에서는 not MNIST라는 디지털 이미지 데이터 세트의 예를 들어 설명합니다.)
이 경우 폴더 내의 폴더 이름과 파일 이름을 가져와야 합니다.
폴더 (folder) 내용 목록을 가져오는 방법을 먼저 쓰십시오.
import os
file_list = os.listdir(folder)
"""
# ちなみにフォルダの中身があるかを確認するには
os.path.isdir(folder)
# とします。
# また、ファイルサイズを確認するには
file_size = os.stat(folder).st_size
# とします。
"""
다음에 폴더 이름을 확인하는 방법을 쓰십시오.이 예에서 폴더 이름의 문자는 태그 이름에 해당합니다.
이 예에서 폴더 (folder) 이름의 자모를 분류를 나타내는 숫자 (0 ~ 9) 로 변환합니다.
import os
# フォルダ名を取ってくる
label_name = os.path.basename(folder)
# アルファベットと数字を対応させる
alpha2num = {a: i for a, i in zip('ABCDEFGHIJ', range(10))}
label = alpha2num[label_name]
그리고 파일 목록에 포함된 파일 이름을 읽고 이미지 파일을 엽니다.4.2에서 설명한 대로 이미지와 레이블을 각각 하나로 정리하기만 하면 됩니다.
요약
함수.
from PIL import Image
import numpy as np
import os
def load_not_mnist(foldername):
# ラベルを数字に対応させておく
alpha2num = {a: i for a, i in zip('ABCDEFGHIJ', range(10))}
images = None
labels = None
cnt = 0
for root_dir in [foldername]:
folders = [os.path.join(root_dir, d) for d in sorted(os.listdir(root_dir))
if os.path.isdir(os.path.join(root_dir, d)) ]
for folder in folders:
# フォルダの名前を取ってくる
label_name = os.path.basename(folder)
label = np.array([alpha2num[label_name]])
# フォルダ内の画像ファイルの名前のリストを取得
for file in os.listdir(folder):
# サイズが0のファイルはスキップする
if os.stat(os.path.join(folder, file)).st_size != 0:
try:
img = Image.open(os.path.join(folder, file))
img = np.asarray(img)
if cnt == 0:
imeges = np.expand_dims(img, axis = 0)
labels = np.expand_dims(label, axis = 0)
else:
images = np.concatenate([images, np.expand_dims(img, axis = 0)], axis = 0)
labels = np.concatenate([labels, np.expand_dims(label, axis = 0)], axis = 0)
cnt += 1
except:
continue
else:
continue
return images, labels
참고 자료
Reference
이 문제에 관하여(공개 데이터 세트 다운로드 및 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/k_chikuwauchi/articles/62c312b11aff30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)