这个 SGD 损失图有什么问题?

问题描述

我一直在尝试训练音频分类模型。当我使用具有 learning_rate=0.01、momentum=0.0 和 nesterov=False 的 SGD 时,我得到以下损失和准确度图:

enter image description here

我不知道是什么导致了大约 750 纪元损失立即减少。我尝试了不同的学习率、动量值及其组合、不同的批次大小、初始层权重等,以获得更合适的图,但没有运气。因此,如果您对导致这种情况的原因有任何了解,请告诉我。

我用于本次培训的代码如下:

# MFCCs Model
x = tf.keras.layers.Dense(units=512,activation="sigmoid")(mfcc_inputs)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(units=256,activation="sigmoid")(x)
x = tf.keras.layers.Dropout(0.5)(x)


# Spectrograms Model
y = tf.keras.layers.Conv2D(32,kernel_size=(3,3),strides=(2,2))(spec_inputs)
y = tf.keras.layers.AveragePooling2D(pool_size=(2,2),2))(y)
y = tf.keras.layers.BatchNormalization()(y)
y = tf.keras.layers.Activation("sigmoid")(y)

y = tf.keras.layers.Conv2D(64,strides=(1,1),padding="same")(y)
y = tf.keras.layers.AveragePooling2D(pool_size=(2,2))(y)
y = tf.keras.layers.BatchNormalization()(y)
y = tf.keras.layers.Activation("sigmoid")(y)

y = tf.keras.layers.Flatten()(y)
y = tf.keras.layers.Dense(units=256,activation="sigmoid")(y)
y = tf.keras.layers.Dropout(0.5)(y)


# Chroma Model
t = tf.keras.layers.Dense(units=512,activation="sigmoid")(chroma_inputs)
t = tf.keras.layers.Dropout(0.5)(t)
t = tf.keras.layers.Dense(units=256,activation="sigmoid")(t)
t = tf.keras.layers.Dropout(0.5)(t)


# Merge Models
concated = tf.keras.layers.concatenate([x,y,t])


# Dense and Output Layers
z = tf.keras.layers.Dense(64,activation="sigmoid")(concated)
z = tf.keras.layers.Dropout(0.5)(z)
z = tf.keras.layers.Dense(64,activation="sigmoid")(z)
z = tf.keras.layers.Dropout(0.5)(z)
z = tf.keras.layers.Dense(1,activation="sigmoid")(z)


mdl = tf.keras.Model(inputs=[mfcc_inputs,spec_inputs,chroma_inputs],outputs=z)
mdl.compile(optimizer=SGD(),loss="binary_crossentropy",metrics=["accuracy"])
mdl.fit([M_train,X_train,C_train],y_train,batch_size=8,epochs=1000,validation_data=([M_val,X_val,C_val],y_val),callbacks=[tensorboard_cb])

解决方法

我自己也不太确定,但正如 Frightera 所说,隐藏层中的 sigmoid 激活会导致麻烦,因为它对权重初始化更敏感,如果权重设置不完美,它会导致梯度非常大小的。也许模型最终会处理小的 sigmoid 梯度,损失最终会在 750 纪元左右减少,但这只是我的假设。如果 ReLU 不起作用,请尝试使用 LeakyReLU,因为它没有 ReLU 的死神经元效应。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...