神经网络中resize、size、crop_size等含义

构造一个网络首先要保证数据流是通的,即各层的输出形状的是整数,不能是小数。至于构造出来的网络效果好不好,按下不表。只要数据流通畅,你的输入图像是什么形状的都无所谓了。

如果你的图像是边长为 256 的正方形。那么卷积层的输出就满足 [ (256 - kernel_size)/ stride ] + 1 ,这个数值得是整数才行,否则没有物理意义。例如,你算得一个边长为 7.7 的 feature map 是没有物理意义的。 pooling 层同理可得。FC 层的输出形状总是满足整数,其唯一的要求就是整个训练过程中 FC 层的输入得是定长的。

resize
如果你的图像不是正方形。在制作 leveldb / lmdb 数据库时,缩放到统一大小(非正方形),使用非正方形的 kernel_size 来使得卷积层的输出依然是整数。

总之,撇开网络的好坏不谈,其本质上就是在做算术应用题:如何使得各层的输出是整数。

---------------未完待续

### 如何在CPU上复现神经网络模型 为了在CPU上成功复现神经网络模型,需注意几个关键要素。首先,选择合适的硬件环境至关重要。尽管GPU能显著加速训练过程并提高精度[^3],但在资源有限的情况下,使用CPU也是可行的选择。 #### 设置必要的参数配置 确保定义所有必需的参数对于成功的模型复现有重要作用。这些参数应包括但不限于数据目录路径、图像裁剪大小(`crop/image_size`)、批次大小(`batch_size`)、迭代次数(`epoch`)、学习率(`learning_rate`)以及用于存储最终训练成果的位置和文件名等信息[^4]。 ```python import torch from torchvision import datasets, transforms, models from torch.utils.data import DataLoader data_dir = 'path/to/your/dataset' image_size = (224, 224) batch_size = 32 epochs = 10 learning_rate = 0.001 model_save_path = './saved_models/' device = "cpu" transform_train = transforms.Compose([ transforms.Resize(image_size), transforms.ToTensor(), ]) train_dataset = datasets.ImageFolder(root=data_dir+'/train', transform=transform_train) test_dataset = datasets.ImageFolder(root=data_dir+'/val', transform=transform_train) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) ``` #### 构建或加载预训练模型 当考虑构建像ResNet这样的深层架构时,其核心创新在于引入了残差连接来缓解梯度消失问题,并采用了批量标准化技术以加快收敛速度而不依赖于Dropout机制[^1]。如果打算从头开始创建自己的版本,则需要特别关注上述特性;而如果是基于现有的框架实现的话,则可以直接利用已有的库函数简化工作流程。 ```python model = models.resnet50(pretrained=False).to(device=device) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) ``` #### 训练循环设计 考虑到CPU运算效率较低的特点,在编写训练脚本时应当优化内存管理和计算逻辑,尽可能减少不必要的开销。此外,由于缺乏专用图形处理单元的支持,可能还需要调整一些超参设置以便更好地适应当前条件下的性能瓶颈。 ```python for epoch in range(epochs): model.train() running_loss = 0.0 for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs.to(device)) loss = criterion(outputs, labels.to(device)) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss:.4f}') torch.save(model.state_dict(), f"{model_save_path}resnet_cpu.pth") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值