问题
使用PyTorch获取torchvision数据集报错文件只可读。
代码
def get_dataloader(train=True):
assert isinstance(train, bool) # train 需是bool类型的
# 准备数据集,其中0.1307,0.3081为MNIST数据的均值和标准差,这样操作能够对其进行标准化
# 因为MNIST只有一个通道(黑白图片),所以元组中只有一个值
dataset = torchvision.datasets.MNIST('/data', train=train, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor(), # 转化为tensor
torchvision.transforms.Normalize((0.1307,), (0.3081,)), ])) # 正则化
batch_size = train_batch_size if train else test_batch_size # 准备数据迭代器
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
return dataloader
报错
oserror: [errno 30] read-only file system: '/data'
原因
在Mac OS10.11之后,Apple公司为了提高系统环境安全,引入了一个内核保护措施–SIP(System Integrity Protection,系统完整性保护),又称Rootless mode机制。在SIP机制下,系统默认会锁定/system、/sbin、/usr这三个目录,即使切换到root用户也只能查看,不能进行其他操作。SIP可以有效地防止恶意程序对电脑进行破坏,建议平时保持开启状态。
查看SIP状态
csrutil status
解决
进入恢复页面关闭SIP
Intel mac开机按Command+R进入恢复页面,Apple Silicon mac鼠标在左上方点击关机,电脑关闭后(不要盖下屏幕)长按电源键开机直到看见启动选项窗口,进入启动项选择继续等待读条。进入后会有选择用户,输入密码。
进入到了恢复页面,第一栏 -> 实用工具 ->打开终端
#查看SIP状态
csrutil status
#关闭保护机制
csrutil disable
#重启
reboot
目录变为可读写
重启后打开终端讲根目录变为可读写。
sudo mount -uw /
若不成功终端有以下两种错
- faild with 77
mount_apfs: volume could not be mounted: Operation not permitted
mount: / failed with 77
- faild with 66
mount_apfs: volume could not be mounted: Permission denied
mount: / failed with 66
软件链接根目录
在home目录下创建文件夹
pwd
mkdir -p ./data
synthetic.conf 文件添加内容
# vim打开文件
sudo vim /etc/synthetic.conf
在打开的文件里添加内容 data /Users/xxx/data
⚠️ data与/Users/xxxx/data之间是Tab键,不是空格键,xxx是用户名
vim,i 切换到输入模式,以输入字符。 :wq 保存并退出
完成后再跑代码应该不回有报错了。
开启SIP
再次关机进入恢复模式的终端打开SIP
# 开启保护机制
csrutil enable
# 重启
reboot