web-dev-qa-db-ja.com

pklファイルを解凍する方法は?

MNISTデータセットのpklファイルがあります。これは手書きの数字画像で構成されています。

これらの各数字の画像を見てみたいので、方法がわからない場合を除き、pklファイルを解凍する必要があります。

Pklファイルを解凍/解凍する方法はありますか?

61
ytrewq

一般的に

pklファイルは、実際にはシリアル化されたpickleファイルです。つまり、Pythonの 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を使用してデータをロードすることをお勧めします。あなたが見てきたように、それは非常に簡単です。 ;-)

111
Peque

ハンディワンライナー

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

Pickle化されたオブジェクトの__str__を出力します。

オブジェクトを視覚化する一般的な問題はもちろん未定義であるため、__str__で十分でない場合は、カスタムスクリプトが必要になります。

元の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
osolmaz