运行StackGAN仓库代码遇pickle协议错误,求解决方案
get_data Function Let's break down this error and walk through all the possible fixes, depending on your situation:
What's causing this error?
This error pops up because the pickle file you're trying to load was saved using Python 3.x's pickle protocol version 3, but your current Python environment doesn't support this protocol. Most commonly, this happens if you're trying to load a file saved in Python 3 with a Python 2 interpreter, or an extremely old Python 3 version (pre-3.0, though those are rare now).
Solution 1: Regenerate the pickle file (if you have access to the saving code)
If you can modify the code that created the pickle file, the easiest fix is to explicitly set a compatible protocol when saving:
# When saving the images, add the protocol parameter pickle.dump(images, output_file, protocol=2)
- Protocol 2 is compatible with both Python 2 and 3, making it a safe choice for cross-version use.
- If you only ever plan to use the file in Python 3 environments, you can use higher protocols (like 4 or 5) for better performance, but these won't work in Python 2.
Solution 2: Fix the loading code (if you can't regenerate the file)
If you're stuck with the existing pickle file, here are two ways to handle it:
Option A: Upgrade your Python version
If you're running Python 2.x or a very old Python 3 release, simply upgrading to Python 3.0+ (ideally 3.6 or newer) will let you load the file without any code changes—since Python 3 natively supports protocol 3.
Option B: Load with compatibility encoding (for Python 2 environments)
If you absolutely can't upgrade to Python 3, you can load the file with an encoding parameter to handle the bytes/string mismatch between Python 2 and 3:
def get_data(self, pickle_path, aug_flag=True): with open(pickle_path + self.image_filename, 'rb') as f: # Add encoding='latin1' to handle Python3-saved bytes data in Python2 images = pickle.load(f, encoding='latin1') images = np.array(images) print('images: ', images.shape) # 后续处理逻辑
⚠️ Note: This trick works best for numpy arrays or basic data types. If your pickle file contains custom class instances, you might run into additional compatibility issues—so upgrading Python is still the better long-term fix here.
Pro Tips to Avoid This Issue in the Future
- Always specify the
protocolparameter when saving pickle files to avoid relying on version-specific defaults. - Try to keep your save/load environments in sync—using the same Python version for both will eliminate most pickle compatibility headaches.
内容的提问来源于stack exchange,提问作者Monty _s Flying Circus

