- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为图像创建一个卷积神经网络。我目前有 17 个类别的大约 136 张图像(稍后将添加更多图像)。
每个图像均采用形状为 (330, 330, 3)
的 numpy.array
形式。
我正在使用以下网络代码:
batch_size = 64
nb_classes = 17
nb_epoch = 2
img_rows = 330
img_cols = 330
nb_filters = 16
nb_conv = 3 # convolution kernel size
nb_pool = 2
model = Sequential()
# 1st conv layer:
model.add(Convolution2D(
nb_filters, (nb_conv, nb_conv),
padding="valid",
input_shape=(img_rows, img_cols, 3),
data_format='channels_last', ))
model.add(Activation('relu'))
# 2nd conv layer:
model.add(Convolution2D(nb_filters, (nb_conv, nb_conv), data_format='channels_last'))
model.add(Activation('relu'))
# maxpooling layer:
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
model.add(Dropout(0.25))
# 2 FC layers:
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adadelta')
model.summary()
model.fit(X_train, y_train, batch_size=batch_size, epochs=nb_epoch, verbose=1 )
但是,在启动第一个纪元后不久,它会给出一条消息“使用了 10% 的系统内存”。它变得没有响应,我必须硬重启它。
我可以采取哪些步骤或对代码进行更改来减少内存需求?
最佳答案
通过查看 model.summary()
的输出,您可以找出导致此问题的原因(即哪些层参数过多):
Layer (type) Output Shape Param #
=================================================================
conv2d_189 (Conv2D) (None, 328, 328, 16) 448
_________________________________________________________________
activation_189 (Activation) (None, 328, 328, 16) 0
_________________________________________________________________
conv2d_190 (Conv2D) (None, 326, 326, 16) 2320
_________________________________________________________________
activation_190 (Activation) (None, 326, 326, 16) 0
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 163, 163, 16) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 163, 163, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 425104) 0
_________________________________________________________________
dense_5 (Dense) (None, 128) 54413440
_________________________________________________________________
activation_191 (Activation) (None, 128) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 128) 0
_________________________________________________________________
dense_6 (Dense) (None, 17) 2193
_________________________________________________________________
activation_192 (Activation) (None, 17) 0
=================================================================
Total params: 54,418,401
Trainable params: 54,418,401
Non-trainable params: 0
_________________________________________________________________
如您所见,由于Flatten
层的输出太大,Dense
层的参数太多:425104 * 128 + 128 = 54413440
,即仅一层就有 5400 万个参数(几乎是模型中所有参数的 99%)。那么,如何减少这个数字呢?您需要通过使用 stride 参数(我不推荐)或池化层(最好在每个卷积层之后)来减小卷积层的输出大小。让我们再添加两个池化层和一个转换层(当我们深入时,我什至增加了转换层中的过滤器数量,因为这通常是一件好事):
# 1st conv + pooling layer:
model.add(Convolution2D(
nb_filters, (nb_conv, nb_conv),
padding="valid",
input_shape=(img_rows, img_cols, 3),
data_format='channels_last', ))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# 2nd conv + pooling layer:
model.add(Convolution2D(nb_filters*2, (nb_conv, nb_conv), data_format='channels_last'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# 3rd conv + pooling layer:
model.add(Convolution2D(nb_filters*2, (nb_conv, nb_conv), data_format='channels_last'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# the rest is the same...
模型摘要输出:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_197 (Conv2D) (None, 328, 328, 16) 448
_________________________________________________________________
activation_203 (Activation) (None, 328, 328, 16) 0
_________________________________________________________________
max_pooling2d_16 (MaxPooling (None, 164, 164, 16) 0
_________________________________________________________________
conv2d_198 (Conv2D) (None, 162, 162, 32) 4640
_________________________________________________________________
activation_204 (Activation) (None, 162, 162, 32) 0
_________________________________________________________________
max_pooling2d_17 (MaxPooling (None, 81, 81, 32) 0
_________________________________________________________________
conv2d_199 (Conv2D) (None, 79, 79, 32) 9248
_________________________________________________________________
activation_205 (Activation) (None, 79, 79, 32) 0
_________________________________________________________________
max_pooling2d_18 (MaxPooling (None, 39, 39, 32) 0
_________________________________________________________________
dropout_9 (Dropout) (None, 39, 39, 32) 0
_________________________________________________________________
flatten_4 (Flatten) (None, 48672) 0
_________________________________________________________________
dense_11 (Dense) (None, 128) 6230144
_________________________________________________________________
activation_206 (Activation) (None, 128) 0
_________________________________________________________________
dropout_10 (Dropout) (None, 128) 0
_________________________________________________________________
dense_12 (Dense) (None, 17) 2193
_________________________________________________________________
activation_207 (Activation) (None, 17) 0
=================================================================
Total params: 6,246,673
Trainable params: 6,246,673
Non-trainable params: 0
_________________________________________________________________
正如您所看到的,现在它的参数数量少于 650 万个,几乎是之前模型参数数量的九分之一。您甚至可以添加另一个池化层以进一步减少参数数量。但是,请记住,随着您的模型变得更深(即具有越来越多的层),您可能需要处理诸如 vanishing gradient 之类的问题。和 overfitting .
关于python - 减少卷积神经网络的内存需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463538/
您能否提供有关网站社交网络(例如 Facebook)类型(功能性、非功能性和用户要求)要求的示例? 提前谢谢 最佳答案 以下是 Facebook 应具备的要求的一些示例。然而,值得一提的是:对于每种类
我需要在另一个 Java 项目的 liferay 模块项目中使用一些类。我正在使用 gradle,当我部署应用程序时,即使 gradle 编译了我的 jar 文件,我也会收到 Unresolved 需
我最近发现了类似于button.setText(“Hello World”);的代码行如果您按如下方式分配按钮,则 onCreate() 方法中将抛出 nullPointerException: B
我有一些基于成本的供应链管理代码,其中供应尝试满足需求,但这仅在供应大于需求时才有效。有什么方法可以优化它以两种方式工作(即当 supply > demand 和 supply = model.dem
好吧,我快想多了。有没有一种方法可以组合接口(interface)和属性,使实现类中的特性属性满足接口(interface)契约? 在我的应用程序中,我想显示一个事件列表,它是系统中事件的集合,例如新
我想创建一个模型,在每个步骤中预测每个产品在多周内的 future 需求(预测每个产品明年的每周需求) 我有一些小尺寸(大约 100-200 条记录)的 csv。 这里有关 CSV 列的信息:- 第一
我有一个包含我所有依赖项的 requirements.txt 文件,但它没有被正确处理: pip install -r requirements.txt 后,我得到以下 pip freeze: arg
我对 Java EE 应用程序的性能测量(CPU 和磁盘 I/O 需求)很感兴趣。 对于CPU 我已经想出了如何测量每个方法调用的CPU 需求。通过在每个方法的开始和结束时调用 java.lang.m
如何获取从 yaml 文件创建的管道的需求? yaml 文件包含需求: ... jobs: - job: my_job displayName: My Job pool: name:
我的目标: 构建一个 AngularJS 服务 (MapService),它初始化 (MapService.initMap()) 第 3 方控件 (Esri ArcGIS Map) 并返回对我的 ma
我在我的一个项目中使用了 redis,并且有一个带有 redis = Redis.new 的初始化器并使用了 redis gem。问题是,如果 Redis 没有运行,我将无法执行简单的数据库迁移之类的
如果我们有三个模块名称 A、B 和 C,那么模块 A 需要 B 和 B 需要 C:这个调用会产生什么效果? var A = proxyquire('A', {'C': mockedModule}) 模
我正在为 Liferay 7 开发一些功能。我知道仍处于 beta 版本,但我在 OSGi 包依赖项方面遇到了一些麻烦。当我尝试部署服务项目时,部署时发生错误 Unresolved requireme
我有一个 list 文件 partials.js,其中包含: //= require_tree ./partials 然后 ./partials/ 中的每个咖啡文件都包含以下内容: $ -> #
在 brew 中有没有一种方法或特殊命令可以将安装的包卡住到 requirements.txt 文件中,就像在 python 中使用 pip 一样?然后从该文件快速重新安装它们? 最佳答案 使用Hom
我正在尝试在 g1 GKE 实例(g1 实例有 1 个 vCPU,或 1000 毫核)中运行一个小型应用程序,并且在调度 pod 时遇到 CPU 请求限制问题。有 4 个 pod,每个都是应用程序的不
我们计划为我们的 C++ 代码建立柯南存储库。我们只想向开发人员公开依赖项列表 (lib/version@user/channel),而不是我们放在 conanfile.py 中的逻辑检查。这个包装器
我正在尝试研究 Varnish 。 我的问题是。我确实有一个主要请求/响应,我想使用 Varnish 缓存它。 html结构内部有ESI标签。我想要很多。一个标签具有较长的 ttl,其他标签则具有 t
我有一个在运行时或编译/链接时连接接口(interface)的问题或最佳方法。对于我的嵌入式项目,设备驱动程序和 I/O 具有需要绑定(bind)(即粘合)到其相应接口(interface)依赖项的接
我有一个我创建的协议(protocol)(在 Swift 4.2 中),它的要求之一是一个与协议(protocol)本身类型相同的属性。 例如,我有一个这样定义的协议(protocol): proto
我是一名优秀的程序员,十分优秀!