python - CNN 为所有输入数据预测相同的类别
问题描述
我正在尝试在 Keras 中重新创建一个 CNN 来对点云数据进行分类。本文描述了 CNN 。
这是我目前的实现:
inputs = Input(shape=(None, 3))
x = Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
x = BatchNormalization()(x)
x = Conv1D(filters=64, kernel_size=1, activation='relu')(x)
x = BatchNormalization()(x)
y = Conv1D(filters=64, kernel_size=1, activation='relu')(x)
y = BatchNormalization()(y)
y = Conv1D(filters=128, kernel_size=1, activation='relu')(y)
y = BatchNormalization()(y)
y = Conv1D(filters=2048, kernel_size=1, activation='relu')(y)
y = MaxPooling1D(1)(y)
z = keras.layers.concatenate([x, y], axis=2)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Dense(9, activation='softmax')(z)
model = Model(inputs=inputs, outputs=z)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
问题是网络为所有输入数据预测相同的类别。这可能是由于我的网络实现错误、过拟合或训练数据不足造成的。有人可以在我的实施中发现错误吗?
Yousefhussien, M., Kelbe, DJ, Ientilucci, EJ, & Salvaggio, C. (2017)。用于 3D 点云语义标记的全卷积网络。arXiv 预印本 arXiv:1710.01408。
解决方案
网络是固定的,因为它现在提供了预期的预测。谢谢您的帮助!
根据答案,我更改了以下内容:
- 激活的顺序和批量标准化。
- 最后一层从密集层到卷积层。
我还将training=True
参数添加到批量标准化层
正确实现的代码:
inputs = Input(shape=(None, 3))
x = Conv1D(filters=64, kernel_size=1, input_shape=(None, 4))(inputs)
x = BatchNormalization()(x, training=True)
x = Activation('relu')(x)
x = Conv1D(filters=64, kernel_size=1, use_bias=False)(x)
x = BatchNormalization()(x, training=True)
x = Activation('relu')(x)
y = Conv1D(filters=64, kernel_size=1)(x)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = Conv1D(filters=128, kernel_size=1)(y)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = Conv1D(filters=2048, kernel_size=1)(y)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = MaxPooling1D(1)(y)
z = keras.layers.concatenate([x, y], axis=2)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=2, kernel_size=1, activation='softmax')(z)
model = Model(inputs=inputs, outputs=z)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
推荐阅读
- ldap - DN中有特殊字符时,无法正常添加用户到AD
- python - 为什么我在使用 python shell 时不能使用 tkinter 窗口
- sql - 在 Oracle 全局临时表中放置什么
- excel - 根据计数子列值VBA查找重复值
- java - Java:读取具有语法的 .dat 文件的正则表达式 - 40_*_p.dat
- python - 如何在 python sqlite3 中存储极长的整数?
- excel - Insert row with formulas below active cell
- oracle - Oracle: Statements running into each other
- grafana - 在 grafana 中为数据链接使用数据变量
- python - Requests.get Json 格式。对我来说奇怪的输出