在使用Keras(带有TensorFlow后端)调整深层卷积网络时,我想尝试一下MaxPooling2D和之间的混合AveragePooling2D,因为这两种策略似乎都可以改善我的目标的两个不同方面。
我正在考虑这样的事情:
-------
|8 | 1|
x = ---+---
|1 | 6|
-------
average_pooling(x) -> 4
max_pooling(x) -> 8
hybrid_pooling(x, alpha_max=0.0) -> 4
hybrid_pooling(x, alpha_max=0.25) -> 5
hybrid_pooling(x, alpha_max=0.5) -> 6
hybrid_pooling(x, alpha_max=0.75) -> 7
hybrid_pooling(x, alpha_max=1.0) -> 8
Run Code Online (Sandbox Code Playgroud)
或等式:
hybrid_pooling(x, alpha_max) =
alpha_max * max_pooling(x) + (1 - alpha_max) * average_pooling(x)
Run Code Online (Sandbox Code Playgroud)
既然看起来好像没有现成的东西,那么如何以有效的方式实现它呢?
我知道通常的 CNN 由卷积层和池化层组成。池化层使输出更小,这意味着更少的计算,并且它们还以某种方式使其变换不变,因此内核滤波器的特征位置可以在原始图像中稍微移动。
但是当我不使用池化层时会发生什么?原因可能是我想要原始图像中每个像素的特征向量,因此卷积层的输出必须与图像大小相同,只是具有更多通道。这有道理吗?这些特征向量中是否仍然存在有用的信息,或者 CNN 中是否需要池化层?或者是否有一些方法可以通过池化层获取各个像素的特征向量?
machine-learning computer-vision neural-network conv-neural-network max-pooling
我用较小的数据集训练了以下 CNN 模型,因此它确实过拟合:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32, kernel_size=(3,3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer=Adam(), metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
该模型有很多可训练的参数(超过 300 万个,这就是为什么我想知道我是否应该像下面这样使用额外的 MaxPooling 来减少参数的数量?
Conv - BN - Act - MaxPooling - Conv - BN - Act - MaxPooling - Dropout - Flatten
或者有一个额外的 MaxPooling 和 Dropout,如下所示?
Conv - BN - Act - MaxPooling - Dropout - Conv - BN - Act - MaxPooling - Dropout - Flatten
我试图了解 MaxPooling …
我正在尝试执行 ak-max pooling以选择top-k具有 shape 的密集元素(None, 30)。我尝试了一个MaxPooling1D层,但它不起作用,因为 keras 池化层至少需要一个 2d 输入形状。我正在使用以下Lambda图层,但出现以下错误:
layer_1.shape
(None, 30)
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
sorted=True,
name="Top_k_final"))(layer_1)
Run Code Online (Sandbox Code Playgroud)
错误:文件“/usr/local/lib/python3.5/dist-packages/keras/engine/base_layer.py”,第 474 行,调用 output_shape = self.compute_output_shape(input_shape) 文件“/usr/local/lib/ python3.5/dist-packages/keras/layers/core.py", line 652, in compute_output_shape return K.int_shape(x) File "/usr/local/lib/python3.5/dist-packages/keras/backend/ tensorflow_backend.py", line 591, in int_shape return tuple(x.get_shape().as_list()) AttributeError: 'TopKV2' object has no attribute 'get_shape'
我只找到MaxPooling2D并AveragePooling2D与tensorflow后端keras。一直在寻找MinimumPooling2D。这个 github链接建议使用这样的东西来进行最小池化 ( pool2d(-x))
在输入之前使用负号时出现错误。我在 keras 中使用的以下行
MaxPooling2D((3, 3), strides=(2, 2), padding='same')(-inputs)
Run Code Online (Sandbox Code Playgroud) model = Sequential()
K.set_image_dim_ordering('th')
model.add(Convolution2D(30, 5, 5, border_mode= 'valid' , input_shape=(1, 10, 10),activation= 'relu' ))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(15, 3, 3, activation= 'relu' ))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation= 'relu' ))
model.add(Dense(50, activation= 'relu' ))
model.add(Dense(10, activation= 'softmax' ))
# Compile model
model.compile(loss= 'categorical_crossentropy' , optimizer= 'adam' , metrics=[ 'accuracy' ])
Run Code Online (Sandbox Code Playgroud)
set_image_dim_ordering()当我使用from时出现错误keras.backend
这是错误报告:AttributeError: module 'keras.backend' has no attribute 'set_image_dim_ordering'
我的进口声明
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O …Run Code Online (Sandbox Code Playgroud) 我第一次构建用于图像分类的 CNN 模型,我对每种类型(1D CNN、2D CNN、3D CNN)的输入形状以及如何固定滤波器中的滤波器数量感到有点困惑。卷积层。我的数据是 100x100x30,其中 30 是特征。这是我使用函数式 API Keras 编写的 1D CNN 文章:
def create_CNN1D_model(pool_type='max',conv_activation='relu'):
input_layer = (30,1)
conv_layer1 = Conv1D(filters=16, kernel_size=3, activation=conv_activation)(input_layer)
max_pooling_layer1 = MaxPooling1D(pool_size=2)(conv_layer1)
conv_layer2 = Conv1D(filters=32, kernel_size=3, activation=conv_activation)(max_pooling_layer1)
max_pooling_layer2 = MaxPooling1D(pool_size=2)(conv_layer2)
flatten_layer = Flatten()(max_pooling_layer2)
dense_layer = Dense(units=64, activation='relu')(flatten_layer)
output_layer = Dense(units=10, activation='softmax')(dense_layer)
CNN_model = Model(inputs=input_layer, outputs=output_layer)
return CNN_model
CNN1D = create_CNN1D_model()
CNN1D.compile(loss = 'categorical_crossentropy', optimizer = "adam",metrics = ['accuracy'])
Trace = CNN1D.fit(X, y, epochs=50, batch_size=100)
Run Code Online (Sandbox Code Playgroud)
然而,在尝试通过将 Conv1D、Maxpooling1D 更改为 Conv2D 和 Maxpooling2D 来尝试 2D CNN 模型时,我收到以下错误: …
我目前正在使用 Keras(自动编码器)开发 CNN 模型。这种类型的输入是 shape (47,47,3),即具有 3 (RGB) 层的 47x47 图像。
我过去曾与一些 CNN 合作过,但这次我的输入尺寸是素数(47 像素)。我认为这会导致我的实现出现问题,特别是在我的模型中使用MaxPooling2D和使用时UpSampling2D。我注意到在最大池化然后向上采样时会丢失一些维度。
使用model.summary()我可以看到,在将我的(47,47,3)输入通过 aConv2D(24)和 MaxPooling 与(2,2)内核(即 24 个过滤器和一半的形状)后,我得到了(24, 24, 24).
现在,如果我尝试通过带有(2,2)内核的 UpSampling (形状加倍)并再次卷积来反转它,我会得到一个(48,48,3)形状的输出。这比需要的多一行和一列。
对此,我认为“没问题,只需选择一个内核大小,在上采样时为您提供所需的 47 个像素”,但鉴于 47 是一个质数,在我看来,没有内核大小可以做到这一点。
有什么方法可以绕过这个问题而不涉及将我的输入维度更改为非素数?也许我在我的方法中遗漏了一些东西,或者 Keras 有一些我忽略的功能可以在这里提供帮助。
我必须在 CNN 模型中添加一个 k-max 池化层来检测虚假评论。请您告诉我如何使用 keras 实现它。
我搜索了互联网,但没有找到好的资源。
max-pooling ×10
keras ×6
python ×3
python-3.x ×2
tensorflow ×2
autoencoder ×1
dropout ×1
keras-layer ×1
pytorch ×1