sigmoid激活函数仅可在dense层后使用吗?类SE网络Keras实现问询
Keras自定义SE类网络代码错误说明
你的实现存在多处语法和逻辑错误,不可直接运行,具体问题如下:
- 输入层路径错误:Keras输入层的正确调用路径是
keras.layers.Input,你使用的keras.model.Input属于模块路径写错,运行会直接抛出找不到属性的错误。另外不建议用Input作为变量名,容易和类名冲突。 - 卷积层类名拼写错误:Keras的2D卷积类名是首字母全大写的
Conv2D,你写的小写后缀的Conv2d会触发名称未定义错误。 - 维度不匹配逻辑错误:图像场景下的全局平均池化建议明确用
GlobalAveragePooling2D,它的输出是形状为(batch_size, 通道数)的二维张量,而Conv2D要求输入必须是(batch_size, 高, 宽, 通道数)的四维张量,直接在池化结果后接2D卷积层会报维度不匹配的运行错误。如果要保留用1x1卷积实现通道压缩、扩张的逻辑,需要先通过Reshape((1,1,32))等操作把二维张量扩展为四维张量。 - 激活函数调用错误:sigmoid激活所属的模块是
keras.activations(复数形式),且调用时需要把输入张量作为参数传入,不能写空括号。更符合Keras函数式API规范的写法是用层式调用keras.layers.Activation('sigmoid')(x2_)。
以下是修正后的可运行参考代码:
import keras input_tensor = keras.layers.Input((None,None,3)) x1 = keras.layers.Conv2D(filters = 32, kernel_size = (3,3))(input_tensor) x_gp = keras.layers.GlobalAveragePooling2D()(x1) # 扩展维度适配后续Conv2D计算 x_gp_expand = keras.layers.Reshape((1,1,32))(x_gp) x2 = keras.layers.Conv2D(filters = 32, kernel_size = (1,1))(x_gp_expand) x3 = keras.layers.Conv2D(filters = 8, kernel_size = (1,1))(x2) x2_ = keras.layers.Conv2D(filters = 32, kernel_size = (1,1))(x3) x_se = keras.layers.Activation('sigmoid')(x2_)
内容的提问来源于stack exchange,提问作者EJ Song
相关产品推荐
相关产品推荐

