Neural network 具有两个分支收敛到一个零梯度且输出恒定的模型

Neural network 具有两个分支收敛到一个零梯度且输出恒定的模型,neural-network,branch,Neural Network,Branch,我正在建立一个神经网络,它接受两种不同的输入;图片和一组数字特征 图片应该经过一些CNN结构,然后变平,而特征应该经过一些密集的层,然后我想把它们连接成一个向量,继续几个密集的层 在分享代码之前,我想说的是,我的组合_网络能够获取我的两个输入,并将它们通过两个分支,输出一个值。问题是,组合网络的梯度完全为零,即使在编译网络之后,输出也是1。但是,当我分别检查两个分支中每个分支的渐变时(没有将它们插入组合模型),渐变不是零 显然,我如何创建组合网络存在一些问题,我希望能得到一些输入 有线电视新闻网

我正在建立一个神经网络,它接受两种不同的输入;图片和一组数字特征

图片应该经过一些CNN结构,然后变平,而特征应该经过一些密集的层,然后我想把它们连接成一个向量,继续几个密集的层

在分享代码之前,我想说的是,我的组合_网络能够获取我的两个输入,并将它们通过两个分支,输出一个值。问题是,组合网络的梯度完全为零,即使在编译网络之后,输出也是1。但是,当我分别检查两个分支中每个分支的渐变时(没有将它们插入组合模型),渐变不是零

显然,我如何创建组合网络存在一些问题,我希望能得到一些输入

有线电视新闻网


#输入为[224224]
model=tf.keras.Sequential()
#添加模型层
model.add(tf.keras.layers.Conv2D(128,内核大小=4,padding='same',activation='relu',输入形状=[输入形状0,输入形状1,1]))
模型添加(tf.keras.layers.Dropout(0.5))
add(tf.keras.layers.MaxPool2D(池大小=(2,2),padding='same'))
add(tf.keras.layers.Conv2D(64,内核大小=4,padding='same',activation='relu'))
模型添加(tf.keras.layers.Dropout(0.5))
add(tf.keras.layers.MaxPool2D(池大小=(2,2),padding='same'))
add(tf.keras.layers.Conv2D(32,内核大小=4,padding='same',activation='relu'))
模型添加(tf.keras.layers.Dropout(0.5))
add(tf.keras.layers.Conv2D(16,内核大小=2,padding='same',activation='relu'))
模型添加(tf.keras.layers.Dropout(0.5))
model.add(layers.flatte())
model.summary()
密集网络

feat_model=tf.keras.Sequential()
feat_model.add(tf.keras.layers.Dense(16,activation=tf.nn.relu,input_shape=(inputs_shape_0,))
feat_模型添加(tf.keras.layers.Dropout(0.5))
feat_model.add(tf.keras.layers.density(8,activation=tf.nn.relu))
feat_模型添加(tf.keras.layers.Dropout(0.5))
feat_model.add(tf.keras.layers.density(4,activation=tf.nn.relu))
feat_模型添加(tf.keras.layers.Dropout(0.5))
model.summary()
组合网络

def create_组合(型号1、型号2):
#合并两个分支的输出
combined=tf.keras.layers.concatenate([model_1.output,model_2.output])
#应用FC层,然后在上应用回归预测
#综合产出
z_0=tf.keras.layers.density(24,activation=“relu”)(组合)
z_1=tf.keras.layers.density(12,activation=“relu”)(z_0)
z_2=tf.keras.layers.density(1,activation=“softmax”)(z_1)
#我们的模型将接受两个分支和
#然后输出一个值
组合_模型=tf.keras.model(输入=[model_1.input,model_2.input],输出=z_2)
组合模型编译(loss='binary'u交叉熵',优化器='adam')
收益组合模型
我还将我的两个输入网络更改为函数式API,它仍然是一样的。非常感谢您的帮助

  • 对于使用图像数据的网络,您应该使用
    SpatialDropout2D
    而不是常规的
    下拉列表
  • 您没有使用批标准化
    。通常情况下,您使用它们的方式如下:

    密集->批量标准化->激活->退出

  • 此外,还应在图像数据上添加批处理规范化

  • 如果在上述操作之后您仍然存在问题,我会尝试将
    relu
    更改为
    elu
    泄漏relu


  • 嘿,非常感谢你的回答!我确实将辍学改为空间辍学,并添加了一些批量标准化层,但同样,在CNN和进入组合网络的密集网络中,梯度很好。当我看组合网络的梯度时,它们都为零,所以这与组合网络的代码有关。我把那里的雷卢斯换成了埃卢斯,但还是一样。我可能会尝试其他一些激活功能,但我认为这可能是更技术的东西。好的,问题是在最后的softmax激活功能-非常奇怪!我以为乙状结肠应该比梯度差得多,不管怎样,现在没事了@Keren如果你想使用softmax,你应该有两个密度。如果你有一个密度,它应该是sigmoid,当我把softmax改为sigmoid时,梯度在一个历元后归零,而不是在一束之后。我尝试过很多不同的方法,但总是一无所获。。还是要弄清楚。@Keren你为什么对梯度这么感兴趣?你的召回精度不好?我能看看梯度计算吗?