FashionMNIST_CNN with pytorch (accuracy: 97.58%/90.1%)

本文通过PyTorch实现了一个简单的CNN网络,用于FashionMNIST数据集的分类任务,并详细记录了从模型训练到测试的过程及结果。最终模型在本地测试集上的准确率达到97.58%,而在Kaggle平台上提供的数据集上则为90.1%。

FashionMNIST_CNN with pytorch (accuracy: 97.58%/90.1%)

接上篇
手工简单复现经典CNN网络测试(LeNet5、AlexNet、VGG16、GoogLeNet、ResNe)
想进行各种CCN经典网络的效果对比,因为个人电脑配置原因失败,不得以科学上网,注册了kaggle进行训练,整体训练分两部分:

1 创建CNN网络训练(网络简单,大概后台运行了5h);

2 使用后台运行产生的模型,进行测试集预测

结果如下:

#1 ----------- first/第一步:kaggle后台训练模型 -------------------------

import torch
import torch.nn as nn
from torch.utils.data import Dataset,DataLoader,TensorDataset
from torch.nn import CrossEntropyLoss
from torch.optim import SGD,Adam

# from torchsummary import summary

from torchvision.datasets import ImageFolder,FashionMNIST
import  torchvision.transforms as transforms


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import joblib

# 读入数据
train_data = pd.read_csv('/kaggle/input/fashionmnist/fashion-mnist_train.csv')
train_y = torch.tensor(train_data['label'])
train_x = torch.tensor(train_data.iloc[:,1:].values.reshape(60000,1,28,28))/255

# 创建批量数据加载器
dataset = TensorDataset(train_x,train_y)
batch_size= 5000 # 批次大小
dataloader = DataLoader(dataset=dataset,batch_size=batch_size,shuffle=True)

# 创建模型
class Net(nn.Module):
    
    def __init__(self)
<think>我们遇到的问题是:在容器内复制特定文件时出现'Nosuchfileordirectory'错误,具体路径是`/pytorch/data/MNIST/raw/train-images-idx3-ubyte`。根据之前的信息,我们知道用户尝试在容器内部操作,但是文件不存在。需要逐步排查原因。可能的原因:1.源文件路径错误:容器内指定的路径`/pytorch/data/MNIST/raw/train-images-idx3-ubyte`不存在。2.容器启动时未挂载数据集:宿主机上的数据集没有挂载到容器内的指定路径。3.路径大小写问题:MNIST的大小写是否正确?有时是全部大写,有时是小写。4.数据集未下载:在容器内或挂载的目录中,该文件确实不存在。解决步骤:步骤1:确认容器内源文件是否存在我们可以通过进入容器并检查该路径是否存在来验证:```bashdockerexec-it<容器名或ID>bash-c"ls-l/pytorch/data/MNIST/raw/train-images-idx3-ubyte"```如果文件不存在,则:-检查挂载:确认启动容器时是否挂载了宿主机上包含MNIST数据集的目录到容器内的`/pytorch/data`?-检查宿主机上的数据集是否存在:根据之前引用[2],用户将数据集下载到了`/home/test/mnist/MNIST_data`,如果挂载的源目录不存在,容器内也不会有。步骤2:检查容器挂载情况使用命令查看容器的挂载详情:```bashdockerinspect<容器名或ID>|grepMounts-A10```查看是否有类似这样的挂载:"Source":"/home/test/mnist/MNIST_data","Destination":"/pytorch/data/MNIST/raw",注意:实际挂载点可能不同。根据引用[2],用户可能将宿主机目录`/home/test/mnist`挂载到了容器内的某个目录(但未必是`/pytorch/data`)。需要确认挂载点。步骤3:重新挂载(如果未挂载或挂载错误)如果发现容器启动时没有正确挂载,需要重新创建容器并挂载。例如,将宿主机的`/home/test/mnist/MNIST_data`挂载到容器内的`/pytorch/data/MNIST/raw`:```bashdockerrun...-v/home/test/mnist/MNIST_data:/pytorch/data/MNIST/raw...```但是注意:如果容器内PyTorch代码期望的MNIST路径是`/pytorch/data/MNIST/raw`,那么挂载到该路径会覆盖容器内该目录原有的内容(如果有)。一般下载数据集后直接挂载即可。步骤4:确认宿主机数据集存在并完整在宿主机上检查文件是否存在:```bashls-l/home/test/mnist/MNIST_data/train-images-idx3-ubyte```如果不存在,需要重新下载(根据引用[2]):```bashcd/home/test/mnist/MNIST_datawgethttp://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gzwgethttp://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gzwgethttp://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gzwgethttp://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz#然后解压(注意:下载的是.gz压缩包,需要解压)gzip-dtrain-images-idx3-ubyte.gz#同理解压其他文件```步骤5:如果挂载正确且文件存在,再尝试容器内复制另外,如果是因为容器内的路径大小写不一致(例如应该是`mnist`而不是`MNIST`),则需要调整路径。示例:假设容器内实际路径是`/pytorch/data/mnist/raw`(小写),那么复制命令应改为:```bashcp/pytorch/data/mnist/raw/train-images-idx3-ubyte/data/models/mnist_data/MNIST/raw/```总结:先确认源文件在容器内的存在性,再检查宿主机数据集和挂载情况。如果以上步骤无法解决,可能是其他原因。以下是可能的问题和解决方法:扩展问题排查:1.容器内路径是符号链接:有时容器内的路径可能是符号链接,实际路径不同。可以用`ls-l`查看是否是链接。2.文件权限问题:即使文件存在,但权限不足也会导致无法访问。使用`ls-l`查看权限,必要时修改权限(在宿主机上修改,因为挂载的文件权限由宿主机决定)。根据引用[2],注意宿主机目录的权限:```bashsudochmod-Ra+rw/home/test/mnist```最终,确保容器内执行复制的命令时,源文件可读。下面我们按照步骤给出具体命令:###🔧解决容器内复制文件报错"Nosuchfileordirectory"####步骤1:验证源文件在容器内是否存在```bashdockerexec<容器名或ID>ls-l/pytorch/data/MNIST/raw/train-images-idx3-ubyte```-如果存在,则会显示文件详细信息;否则报错。####步骤2:如果不存在,检查宿主机上的数据集在宿主机上检查:```bashls-l/home/test/mnist/MNIST_data/train-images-idx3-ubyte```-如果宿主机上不存在,则重新下载和解压(确保使用绝对路径):```bash#确保目录存在mkdir-p/home/test/mnist/MNIST_datacd/home/test/mnist/MNIST_data#下载(如果之前下载的是.gz,需要解压)wget-nchttp://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gzgzip-dtrain-images-idx3-ubyte.gz#下载其他文件(如果需要)wget-nchttp://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gzgzip-dtrain-labels-idx1-ubyte.gzwget-nchttp://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gzgzip-dt10k-images-idx3-ubyte.gzwget-nchttp://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gzgzip-dt10k-labels-idx1-ubyte.gz```####步骤3:检查容器挂载点查看容器的挂载信息:```bashdockerinspect<容器名或ID>|grep-A5Mounts```-确认宿主机目录`/home/test/mnist/MNIST_data`是否挂载到容器内的`/pytorch/data/MNIST/raw`(或类似路径)。####步骤4:如果没有挂载,则需要重新创建容器并正确挂载停止并删除现有容器(如果允许):```bashdockerstop<容器名或ID>dockerrm<容器名或ID>```然后重新运行容器,并添加挂载参数:```bashdockerrun-itd...-v/home/test/mnist/MNIST_data:/pytorch/data/MNIST/raw...<镜像名>```####步骤5:再次尝试在容器内复制文件进入容器:```bashdockerexec-it<容器名或ID>/bin/bash```然后执行复制命令(确保目标目录已存在):```bashmkdir-p/data/models/mnist_data/MNIST/rawcp/pytorch/data/MNIST/raw/train-images-idx3-ubyte/data/models/mnist_data/MNIST/raw/```###⚠️注意-如果使用`dockercp`命令从宿主机直接复制文件到容器,可以避免进入容器操作,但前提是容器正在运行:```bashdockercp/home/test/mnist/MNIST_data/train-images-idx3-ubyte<容器名或ID>:/data/models/mnist_data/MNIST/raw/```这样可以跳过挂载步骤,但不会持久化(如果容器被删除,文件还是会丢失)。因此,对于需要持久化的数据,推荐使用挂载卷。###相关引用说明-关于宿主机的数据集路径和权限设置,参考引用[2]。-关于Docker的包源添加(可能之前安装Docker时使用),参考引用[1]。§§相关问题§§1.如何检查Docker容器的挂载卷是否正确?2.Docker容器内文件权限与宿主机不一致怎么办?3.如何解压MNIST.gz文件?4.使用`dockercp`命令时出现权限错误如何解决?</think> ### 解决容器内复制文件时 "No such file or directory" 错误 要解决 `docker container cp file No such file or directory /pytorch/data/MNIST/raw/train-images-idx3-ubyte` 错误,请按以下步骤排查和修复: --- ### 🔍 原因分析与解决步骤 1. **验证源文件是否存在** ```bash # 进入容器检查文件是否存在 docker exec -it <容器名或ID> ls -l /pytorch/data/MNIST/raw/ # 检查宿主机的数据集位置(根据引用[2]) ls -l /home/test/mnist/MNIST_data/ ``` - 如果文件不存在,需重新下载数据集(参考引用[2]): ```bash cd /home/test/mnist/MNIST_data wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz gzip -d train-images-idx3-ubyte.gz # 解压文件 ``` 2. **检查挂载配置** - 确认容器启动时是否正确挂载数据集目录: ```bash docker inspect <容器名或ID> | grep Mounts -A 5 ``` - 正确的挂载命令应包含: ```bash docker run -v /home/test/mnist/MNIST_data:/pytorch/data/MNIST/raw ... ``` - **关键点**:宿主机路径`/home/test/mnist/MNIST_data`必须与容器路径`/pytorch/data/MNIST/raw`对应 3. **修复目录权限** ```bash # 在宿主机上执行(根据引用[2]) sudo chmod -R a+rw /home/test/mnist ``` 4. **使用直接复制命令** ```bash # 宿主机 → 容器 docker cp /home/test/mnist/MNIST_data/train-images-idx3-ubyte <容器ID>:/data/models/mnist_data/MNIST/raw/ # 容器内复制(需先进入容器) docker exec -it <容器ID> bash cp /pytorch/data/MNIST/raw/train-images-idx3-ubyte /data/models/mnist_data/MNIST/raw/ ``` 5. **路径大小写检查** - Linux 路径区分大小写,确认是`MNIST`而不是`mnist` - 使用 Tab 键自动补全路径验证: ```bash docker exec -it <容器ID> ls /pytorch/data/MNIST/raw/train-<按Tab键> ``` --- ### ⚠️ 错误预防建议 1. **持久化数据的最佳实践**: ```bash # 启动容器时使用命名卷 docker run -v mnist_data:/pytorch/data ... ``` 2. **Dockerfile 集成数据集**: ```dockerfile FROM pytorch/pytorch:latest RUN mkdir -p /pytorch/data/MNIST/raw COPY train-images-idx3-ubyte /pytorch/data/MNIST/raw/ ``` 3. **路径验证脚本**: ```bash # 容器启动后立即验证路径 docker exec <容器ID> sh -c '[ -f /pytorch/data/MNIST/raw/train-images-idx3-ubyte ] && echo "存在" || echo "缺失"' ``` --- ### 根本原因总结 | 可能原因 | 发生概率 | 解决方案 | |----------|----------|----------| | 路径拼写错误 | ★★★★★ | 使用`ls`命令验证路径 | | 挂载配置错误 | ★★★★☆ | 检查`docker inspect`的挂载点 | | 文件未解压 | ★★★☆☆ | 执行`gzip -d`解压.gz文件 | | 权限不足 | ★★☆☆☆ | 执行`chmod -R a+rw`[^2] | | 容器路径不存在 | ★★☆☆☆ | 在Dockerfile中添加`mkdir -p` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值