kaggle运行项目注意事项
-
- [✅ 解决方案:每次运行前自动准备环境](#✅ 解决方案:每次运行前自动准备环境)
-
- [1. 定义一个准备函数(运行一次即可)](#1. 定义一个准备函数(运行一次即可))
- [2. 运行其他 `ch03` 文件(如 `neuralnet_mnist.py`)](#2. 运行其他
ch03文件(如neuralnet_mnist.py)) - [3. (可选)避免每次复制,直接使用 `/kaggle/input` 中的文件但修改下载缓存](#3. (可选)避免每次复制,直接使用
/kaggle/input中的文件但修改下载缓存)
- [📌 注意事项](#📌 注意事项)
- [🧪 验证](#🧪 验证)
在 Kaggle Notebook 中,/kaggle/working 是临时工作目录 ,每次内核重启 或新会话启动 时,该目录都会被重置为空(仅保留当前 Notebook 产生的输出文件)。您之前复制到 /kaggle/working 下的 deep_learning_base_python-main 文件夹,在您重启内核 或关闭并重新打开 Notebook 后就会消失。
从您提供的输出(os.getcwd() 显示为 /kaggle/working,但 ls 列表中没有该文件夹)来看,当前会话是全新启动的,之前复制的文件已经被清空。
✅ 解决方案:每次运行前自动准备环境
您可以将复制项目 + 修改 URL 的步骤封装成一个可重复执行的代码块,在运行任何 ch03 下的文件之前先执行它。
1. 定义一个准备函数(运行一次即可)
新建一个单元格,粘贴以下代码(它会检查目标目录是否存在,若不存在则复制并修改 URL):
python
import os, shutil
def prepare_env():
src = "/kaggle/input/datasets/hyndla/deep-learning-base-python/deep_learning_base_python-main"
dst = "/kaggle/working/deep_learning_base_python-main"
# 如果目标已存在,则跳过复制(但若之前的会话已清空,这里会重新复制)
if not os.path.exists(dst):
print("正在复制项目到工作目录...")
shutil.copytree(src, dst)
# 修改 mnist.py 中的 URL
mnist_py = os.path.join(dst, "dataset/mnist.py")
with open(mnist_py, "r") as f:
content = f.read()
content = content.replace("http://yann.lecun.com/exdb/mnist/",
"https://ossci-datasets.s3.amazonaws.com/mnist/")
with open(mnist_py, "w") as f:
f.write(content)
print("✅ 环境准备完成")
else:
print("✅ 环境已存在,无需重复复制")
# 执行准备
prepare_env()
每次内核重启后,运行此单元格,它会自动完成复制和修复。
2. 运行其他 ch03 文件(如 neuralnet_mnist.py)
在准备环境后,切换工作目录到 ch03,然后使用 %run 或 !python 执行目标文件。推荐使用 %run(因为 !python 会启动新进程,但 %run 在当前内核中运行,便于显示图形)。
python
import os
os.chdir("/kaggle/working/deep_learning_base_python-main/ch03")
# 运行 neuralnet_mnist.py(示例)
%run neuralnet_mnist.py
如果该文件内部也使用了 PIL.Image.show(),您可能仍然需要将显示方式改为 matplotlib。您可以直接在 Notebook 单元格中复制文件内容并替换显示部分 ,或像我之前那样,用 matplotlib 函数覆盖原 img_show。
3. (可选)避免每次复制,直接使用 /kaggle/input 中的文件但修改下载缓存
另一种思路:不复制整个项目,而是单独复制 dataset/mnist.py 到可写位置并修改其 dataset_dir 变量 ,但 mnist_show.py 在 ch03 中,它导入的是 ../dataset/mnist,因此若不复制整个项目,需要调整导入路径。复制整个项目更为稳妥,且仅需几秒钟。
📌 注意事项
- 每次内核重启后,必须重新执行准备代码 ,否则
/kaggle/working下没有项目文件。 - 如果您的 Notebook 已经运行了准备代码,但之后又切换了工作目录,只需再次
os.chdir到ch03即可运行其他文件,无需重复复制(因为目标已存在)。 - 所有下载的 MNIST 数据会缓存在
/kaggle/working/deep_learning_base_python-main/dataset/下,只要该目录不被删除,后续运行会直接读取缓存,无需重新下载。
🧪 验证
执行准备代码后,运行以下命令确认文件存在:
python
import os
print(os.listdir("/kaggle/working/deep_learning_base_python-main/ch03"))
您会看到 mnist_show.py、neuralnet_mnist.py 等文件列表。
现在您可以自由运行该章的任何脚本了。如果还有问题,请随时告知。