pkl 파일의 압축을 푸는 방법은 무엇입니까?


83

손으로 쓴 숫자 이미지로 구성된 MNIST 데이터 세트의 pkl 파일이 있습니다.

각 숫자 이미지를 살펴보고 싶기 때문에 pkl 파일의 압축을 풀어야하지만 방법을 찾을 수 없습니다.

pkl 파일의 압축을 풀거나 압축을 푸는 방법이 있습니까?

답변:


160

일반적으로

귀하의 pkl파일은, 사실, 직렬화되어 pickle그 의미 파일 된 파이썬의 사용 덤프했다 pickle모듈을.

데이터의 피클을 해제하려면 다음을 수행 할 수 있습니다.

import pickle


with open('serialized.pkl', 'rb') as f:
    data = pickle.load(f)

MNIST 데이터 세트의 경우

참고 gzip는 파일이 압축 된 경우에만 필요합니다.

import gzip
import pickle


with gzip.open('mnist.pkl.gz', 'rb') as f:
    train_set, valid_set, test_set = pickle.load(f)

각 세트를 더 나눌 수있는 경우 (예 : 트레이닝 세트 용) :

train_x, train_y = train_set

세트의 입력 (숫자) 및 출력 (라벨)이 될 것입니다.

숫자를 표시하려면 :

import matplotlib.cm as cm
import matplotlib.pyplot as plt


plt.imshow(train_x[0].reshape((28, 28)), cmap=cm.Greys_r)
plt.show()

mnist_digit

다른 대안은 원본 데이터를 보는 것입니다.

http://yann.lecun.com/exdb/mnist/

그러나 해당 파일의 바이너리 데이터를 읽는 프로그램을 만들어야하므로 더 어려울 것입니다. 따라서 Python을 사용하고 pickle. 보시다시피 매우 쉽습니다. ;-)


내가 가진 이미지 파일에서 pkl 파일을 만드는 방법도 있습니까?
ytrewq

평범한 절임 일 수도 있겠죠? cPickled와 반대로? MNIST 데이터 세트에 대해 잘 모르겠지만 pkl일반적으로 파일의 pickle.load경우 압축을 푸는데 작동합니다 cPickle.load. 들어 pkl작은 쪽 파일, 성능 차이가 눈에 띄지 않습니다.
dbliss

또한 기본적으로 open함수에는 모드의 기본값이 r(읽기) 로 설정되어 있으므로 rb모드 로 파일을 여는 것이 중요 합니다. 경우 b(이진) 모드가 추가되지 않습니다, unpickling 것은이 발생할 수 있습니다 UnicodeDecodeError.
Tomasz Bartkowiak

7

편리한 원 라이너

pkl() (
  python -c 'import pickle,sys;d=pickle.load(open(sys.argv[1],"rb"));print(d)' "$1"
)
pkl my.pkl

__str__절인 개체에 대해 인쇄 합니다.

개체 시각화의 일반적인 문제는 물론 정의되지 않았으므로 __str__충분하지 않은 경우 사용자 지정 스크립트가 필요합니다.


2

원본 MNIST 파일로 작업하려는 경우 다음은이를 역 직렬화하는 방법입니다.

아직 파일을 다운로드하지 않은 경우 먼저 터미널에서 다음을 실행하여 다운로드하십시오.

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

그런 다음 다음을 저장 deserialize.py하고 실행하십시오.

import numpy as np
import gzip

IMG_DIM = 28

def decode_image_file(fname):
    result = []
    n_bytes_per_img = IMG_DIM*IMG_DIM

    with gzip.open(fname, 'rb') as f:
        bytes_ = f.read()
        data = bytes_[16:]

        if len(data) % n_bytes_per_img != 0:
            raise Exception('Something wrong with the file')

        result = np.frombuffer(data, dtype=np.uint8).reshape(
            len(bytes_)//n_bytes_per_img, n_bytes_per_img)

    return result

def decode_label_file(fname):
    result = []

    with gzip.open(fname, 'rb') as f:
        bytes_ = f.read()
        data = bytes_[8:]

        result = np.frombuffer(data, dtype=np.uint8)

    return result

train_images = decode_image_file('train-images-idx3-ubyte.gz')
train_labels = decode_label_file('train-labels-idx1-ubyte.gz')

test_images = decode_image_file('t10k-images-idx3-ubyte.gz')
test_labels = decode_label_file('t10k-labels-idx1-ubyte.gz')

스크립트는 피클 파일에서와 같이 픽셀 값을 정규화하지 않습니다. 그러기 위해해야 ​​할 일은

train_images = train_images/255
test_images = test_images/255

1

피클 (와 gzip을 파일이 압축 된 경우) 모듈이 필요 사용될

참고 : 이들은 이미 표준 Python 라이브러리에 있습니다. 새로 설치할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.