我正在為 ML 模型運行以下函式。
def get_images(filename):
bin_file = open(filename, 'rb')
buf = bin_file.read() # all the file are put into memory
bin_file.close() # release the measure of operating system
index = 0
magic, num_images, num_rows, num_colums = struct.unpack_from(big_endian four_bytes, buf, index)
index = struct.calcsize(big_endian four_bytes)
images = [] # temp images as tuple
for x in range(num_images):
im = struct.unpack_from(big_endian picture_bytes, buf, index)
index = struct.calcsize(big_endian picture_bytes)
im = list(im)
for i in range(len(im)):
if im[i] > 1:
im[i] = 1
但是,我在該行收到一個錯誤:
im = struct.unpack_from(big_endian picture_bytes, buf, index)
出現錯誤:
error: unpack_from requires a buffer of at least 784 bytes
我注意到這個錯誤只發生在某些迭代中。我無法弄清楚為什么會這樣。該資料集是一個標準的 MNIST 資料集,可在線免費獲得。
我還查看了關于 SO 的類似問題(例如error: unpack_from requires a buffer),但它們似乎無法解決問題。
uj5u.com熱心網友回復:
你沒有在你的 mre 中包含結構格式,所以很難說你為什么會收到錯誤。您使用的是部分/損壞的檔案,或者您的結構格式錯誤。
此答案使用http://yann.lecun.com/exdb/mnist/'t10k-images-idx3-ubyte.gz'上的測驗檔案和檔案格式
打開檔案并將其讀入位元組物件(由于檔案的型別而使用 gzip)。
import gzip,struct
with gzip.open(r'my\path\t10k-images-idx3-ubyte.gz','rb') as f:
data = bytes(f.read())
print(len(data))
檔案格式規范說標題是 16 位元組(四個 32 位整數) - 用切片將其與像素分開,然后將其解包
hdr,pixels = data[:16],data[16:]
magic, num_images, num_rows, num_cols = struct.unpack(">4L",hdr)
# print(len(hdr),len(pixels))
# print(magic, num_images, num_rows, num_cols)
有多種方法可以迭代單個影像。
img_size = num_rows * num_cols
imgfmt = "B"*img_size
for i in range(num_images):
start = i * img_size
end = start img_size
img = pixels[start:end]
img = struct.unpack(imgfmt,img)
# do work on the img
要么...
imgfmt = "B"*img_size
for img in struct.iter_unpack(imgfmt, pixels):
img = [p if p == 0 else 1 for p in img]
itertools grouper recipe可能也可以。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437520.html
