我设计了一个由 softmax 函数预测的具有大量输出的神经网络模型。但是,我想在不修改其他层的架构的情况下将所有输出分类为 5 个输出。该模型在第一种情况下表现良好,但是当我减少输出数量时,它会失去准确性并得到不好的泛化。我的问题是:即使只有 5 个输出,有没有一种方法可以让我的模型表现良好?例如:在输出层之前添加dropout层,使用其他激活函数等。
如何让神经网络更好地泛化?
数据挖掘
Python
神经网络
火炬
2022-02-10 15:33:04
2个回答
我相信如果我们更新最后的 Softmax 单元并相应地更新最后一层的权重,它应该会起作用。
我已经用 MNIST 数字尝试过这个并且似乎有效
#Let's assume "model" is the trained model on 10 outputs
saved_model = model.save('/content/model.h5')
model_reload = keras.models.load_model('/content/model.h5')
#Create model_2 with 5 output
from keras.models import Sequential
model_2 = tf.keras.Sequential()
for layer in model_reload.layers[:-1]: # go through until last layer
model_2.add(layer)
model_2.add(keras.layers.Dense(5, activation='softmax'))
#Get the last layer weight, this is where you have to take care while slicing the weight matrix depending on which 5 Class you are retaining
#We are taking digits (0, 2, 4, 6, 8)
wb=[]
for layer in model_reload.layers:
if 'Dense' in str(layer):
if layer.units==10:
w=layer.get_weights()[0][:,::2] ##Note this slicing weight
b=layer.get_weights()[1][::2] ##Note this slicing of bias
wb.append(w)
wb.append(b)
model_2.layers[-1].set_weights(wb)
##Test
dataset_new = dataset_new[(dataset_new.label % 2 = 0)] #Only even digits
x = dataset_new.iloc[:,1:]
y = dataset_new.iloc[:,0]
###Normalize the data
x = x/255
y_pred = model_2.predict_classes(x)
y_pred = y_pred * 2 #Model will predict 0-4(This multiply is too map it to 0,2,4,6,8
from sklearn.metrics import accuracy_score
accuracy_score(y,y_pred)
0.9514600845439969,优于基准精度
您可以在此笔记本中查看相同内容
首先确保您的数据集在从 0 到 4 的 5 个不同类别中正确标记,仅此而已。然后在每层之间添加 dropout 层,概率为 0.1,并逐渐增加到 0.5,直到找到一个好的 val 分数。在您的优化器中添加权重衰减项,其值约为 0.1。在线查找适合您的数据类型的正则化器。