tf.keras.utils.get_file函数导致脚本无限冻结问题求助
问题描述
使用TensorFlow 2.16.1和Python 3.12.4开发时,调用tf.keras.utils.get_file完成文件下载(或文件已存在)后,脚本无限冻结,无任何输出也不终止,后续代码(如print("test"))完全不执行。
相关代码如下:
import matplotlib.pyplot as plt import os import re import shutil import string import tensorflow as tf from tensorflow.keras import layers # type: ignore from tensorflow.keras import losses # type: ignore url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz" dataset = tf.keras.utils.get_file("aclImdb_v1", url, untar=True, cache_dir='.', cache_subdir='') print("test") dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb') os.listdir(dataset_dir) train_dir = os.path.join(dataset_dir, 'train') os.listdir(train_dir) sample_file = os.path.join(train_dir, 'pos/1181_9.txt') with open(sample_file) as f: print(f.read())
可能的原因与解决办法
版本兼容性问题:TensorFlow 2.16.x对Python 3.12的支持存在部分bug,涉及文件IO和后台线程处理。
解决:降级Python到3.11版本,或升级TensorFlow到2.17及以上版本(后续版本修复了部分Python 3.12兼容问题)。后台解压线程阻塞:
untar=True时,get_file会启动后台线程处理解压,部分环境下线程未正常结束导致主线程挂起。
解决:手动下载并解压文件,替换原get_file调用:# 替换原get_file代码块 import shutil archive_path = "./aclImdb_v1.tar.gz" # 手动下载到当前目录的文件路径 shutil.unpack_archive(archive_path, extract_dir=".") dataset_dir = "./aclImdb"缓存目录权限不足:当前目录(
cache_dir='.')读写权限不足,导致get_file处理缓存时陷入死锁。
解决:更换缓存目录到有权限的路径,比如用户主目录:dataset = tf.keras.utils.get_file("aclImdb_v1", url, untar=True, cache_dir=os.path.expanduser("~/.keras"), cache_subdir='datasets')文件校验阻塞:即使文件已存在,
get_file可能尝试校验文件哈希,若网络环境有代理或校验过程卡住,会导致冻结。
解决:跳过哈希校验,添加md5_hash=None参数:dataset = tf.keras.utils.get_file("aclImdb_v1", url, untar=True, cache_dir='.', cache_subdir='', md5_hash=None)
内容的提问来源于stack exchange,提问作者Dr4gon Craft
相关产品推荐
相关产品推荐

