如何解压pkl文件?
Posted
技术标签:
【中文标题】如何解压pkl文件?【英文标题】:How to unpack pkl file? 【发布时间】:2014-09-14 09:07:30 【问题描述】:我有一个来自 MNIST 数据集的 pkl 文件,其中包含手写数字图像。
我想看一下这些数字图像中的每一个,所以我需要解压 pkl 文件,但我不知道如何解压。
有没有办法解压/解压pkl文件?
【问题讨论】:
【参考方案1】:需要使用pickle(和gzip,如果文件被压缩)模块
注意:这些已经在标准 Python 库中。 无需安装任何新东西
【讨论】:
【参考方案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
【讨论】:
【参考方案3】:一般
您的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()
另一种选择是查看原始数据:
http://yann.lecun.com/exdb/mnist/
但这会更难,因为您需要创建一个程序来读取这些文件中的二进制数据。所以我推荐你使用 Python,并使用pickle
加载数据。如您所见,这非常容易。 ;-)
【讨论】:
还有没有办法从我拥有的图像文件中制作一个 pkl 文件? 可能是普通的腌制,对吧?相对于 cPickled?我不确定 MNIST 数据集,但对于一般的pkl
文件,pickle.load
用于解包——尽管我猜它的性能不如cPickle.load
。对于较小一侧的pkl
文件,性能差异并不明显。
另外请记住,默认情况下,open
函数的默认值 mode 设置为 r
(读取),因此以rb
模式打开文件很重要。如果未添加 b
(二进制)模式,则 unpickling 可能会导致 UnicodeDecodeError
。【参考方案4】:
方便的单线
pkl() (
python -c 'import pickle,sys;d=pickle.load(open(sys.argv[1],"rb"));print(d)' "$1"
)
pkl my.pkl
将为腌制对象打印__str__
。
可视化对象的一般问题当然是未定义的,因此如果__str__
不够,您将需要自定义脚本。
【讨论】:
以上是关于如何解压pkl文件?的主要内容,如果未能解决你的问题,请参考以下文章
Linux如何解压zip文件,linux如何解压zip文件到指定文件夹