DenseNet占用内存过高(batch-size只能设置为1)解决方案

博主在使用DenseNet时遇到内存问题,仅能设置batch-size为1。通过编译memory-efficient Caffe在Ubuntu系统上解决了这一问题。编译过程包括下载源码、删除特定文件、执行cmake和make命令。随后,博主将数据集导入到DenseNet训练脚本中,调整solver和prototxt文件,并创建train.sh启动训练,此时batch-size可设置为8和2。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情况说明

前一阵自己使用caffe跑了跑DenseNet网络,显卡11G显存,只有当TRAIN和TEST的batch-size设置成1才可以跑通,这样的话是在线学习,最终的结果并没有想象中的那么好。然后查了一些资料,并不断进行尝试,最终得到了解决方案-------->使用memory-efficient的caffe(Ubuntu系统)跑DenseNet

说明:博主用的是八开服务器,用的WinSCP可以像windows一样看到硬盘中的文件,如果只用ubuntu系统的话可以用 ls 指令查看文件。

具体实施

一、编译memory-efficient的caffe

源码:memory-efficient的caffe

大部分参考 使用内存精简版caffe运行densenet 并进行修改以及详细说明。
1 运行 git clone --recursive https://github.com/Tongcheng/caffe.git命令。
在自己的环境下运行上边的指令,会提示如下的信息。
在这里插入图片描述
2 运行cd /h

import numpy as np from PIL import Image import tensorflow as tf from keras.layers import Input, Lambda from keras.models import Model from keras.callbacks import EarlyStopping, ModelCheckpoint, LearningRateScheduler import densenet import importlib import os # 确保使用正确的Keras后端 from tensorflow.keras import backend as K def ctc_lambda_func(args): y_pred, labels, input_length, label_length = args return K.ctc_batch_cost(labels, y_pred, input_length, label_length) def get_model(img_h, nclass): input = Input(shape=(img_h, None, 1), name='the_input') y_pred = densenet.dense_cnn(input, nclass) labels = Input(name='the_labels', shape=[None], dtype='float32') input_length = Input(name='input_length', shape=[1], dtype='int64') label_length = Input(name='label_length', shape=[1], dtype='int64') # 使用Lambda层计算CTC损失 loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc_loss')([y_pred, labels, input_length, label_length]) # 创建模型 model = Model(inputs=[input, labels, input_length, label_length], outputs=loss_out) # 编译模型时,损失函数直接返回预测值,因为损失已经由Lambda计算 model.compile(optimizer='adam', loss={'ctc_loss': lambda y_true, y_pred: tf.reduce_mean(y_pred)}) return model class random_uniform_num(): def __init__(self, total): self.total = total self.range = [i for i in range(total)] np.random.shuffle(self.range) self.index = 0 def get(self, batchsize): r_n = [] if self.index + batchsize > self.total: r_n_1 = self.range[self.index:self.total] np.random.shuffle(self.range) self.index = (self.index + batchsize) - self.total r_n_2 = self.range[:self.index] r_n.extend(r_n_1) r_n.extend(r_n_2) else: r_n = self.range[self.index:self.index + batchsize] self.index = self.index + batchsize return r_n def path_check(image_path): if not os.path.exist
03-25
### 如何在机器学习框架中设置 `batch_size` 参数 #### TensorFlow 中的 `batch_size` 设置 在 TensorFlow 的 Keras API 中,可以通过 `model.fit()` 方法中的参数来指定批量大小 (`batch_size`)。此参数控制每次迭代期间传递给模型的数据样本数量[^1]。 ```python import tensorflow as tf # 定义简单的神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型时设置 batch_size 和 epochs history = model.fit(x_train, y_train, batch_size=32, # 这里设置了批处理大小为 32 epochs=10, validation_data=(x_val, y_val)) ``` #### PyTorch 中的 `batch_size` 设置 在 PyTorch 中,通常通过 `DataLoader` 类来定义数据加载器,并在此类初始化过程中设定 `batch_size` 参数。该参数决定了每个批次包含多少个样本[^2]。 ```python from torch.utils.data import DataLoader, TensorDataset import torch # 创建 Dataset 对象 dataset = TensorDataset(torch.tensor(X), torch.tensor(y)) # 使用 DataLoader 加载数据集并设置 batch_size dataloader = DataLoader(dataset, batch_size=64, shuffle=True) # 遍历 dataloader 并训练模型 for data in dataloader: inputs, labels = data outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() ``` #### Scikit-learn 中的相关概念 虽然 Scikit-learn 不像深度学习框架那样显式提供 `batch_size` 参数,但在某些基于梯度下降优化的估计器(如 SGDClassifier 或 MLPClassifier)中,间接涉及类似的机制。这些估计器允许调整每步使用的子样本来模拟 mini-batch 行为[^1]。 ```python from sklearn.neural_network import MLPClassifier # 初始化多层感知机分类器 clf = MLPClassifier(hidden_layer_sizes=(100,), max_iter=500, alpha=1e-4, solver='sgd', verbose=10, tol=1e-4, random_state=1, learning_rate_init=.1, batch_size=64) # 显式设置 batch_size # 拟合模型 clf.fit(X_train, y_train) ``` 以上代码片段展示了不同框架下如何配置 `batch_size` 参数的方法。值得注意的是,在实际应用中应考虑实验结果表明的最佳实践:过小可能导致不稳定收敛;过大则可能降低泛化能力以及增加内存消耗[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值