我想用来训练网络的图像大约是4000px*3000px
和40k
的大小,在250
类中排序。我做了一个CNN,如下图所示:
model = keras.Sequential([
layers.Input((imgHeight, imgWidth, 1)),
layers.Conv2D(16, 3, padding = 'same'), # filters, kernel_size
layers.Conv2D(32, 3, padding = 'same'),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(250),
])
我怎么知道什么layers.Conv2D(*16*, ...)
,一个值我需要?我怎么知道什么layers.Dense(*250*)
,一个值我需要?
因为我不能开始训练过程,我的内存快用完了。
Flatten()
层的输出形状是9600万,所以你的模型的最终致密层有240亿个参数,这就是你内存不足的原因。您可以采取一些步骤来解决此问题:
尝试将图像大小调整为较小的形状,如果4000x3000x1
不是必需的,那么160x160x1将是一个不错的选择。
尝试使用更多的Conv2D
层,然后是MaxPool2D
层,以减少输入的大小,然后在最后,使用Flatten
层,然后是Dense
层。
例如:
model = keras.Sequential([
layers.Input((160, 160, 1)),
layers.Conv2D(32, 3, padding = 'same'),
layers.Conv2D(32, 3, padding = 'same'),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, 3, padding = 'same'),
layers.Conv2D(64, 3, padding = 'same'),
layers.MaxPooling2D((2,2)),
layers.Conv2D(128, 3, padding = 'same'),
layers.Conv2D(128, 3, padding = 'same'),
layers.MaxPooling2D((2,2)),
layers.Conv2D(256, 3, padding = 'same'),
layers.Conv2D(256, 3, padding = 'same'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(512),
layers.Dense(250),
])
如果你正在做分类任务,这种类型的架构将会很好地工作,并且不会耗尽内存。