我之所以要特别地过度适应,是因为我正在遵循弗朗索瓦·肖莱的“Python深度学习”步骤来设计一个网络。这很重要,因为这是我学位的最后一个项目。
在这个阶段,我需要创建一个足够大的网络来过度拟合我的数据,以便确定一个最大容量,也就是我将要优化的网络大小的上限。
然而,正如标题所示,我正在努力让我的人际网络过度适应,也许我的方法很天真,但让我来解释一下我的模型:
我正在使用this dataset来训练一个对恒星进行分类的模型。一颗恒星必须按两个类进行分类(分为两个类):光谱类(100类)和光度类(10类)。例如,我们的太阳是“G2 V”,它的光谱类是“G2”,它的光度类是“V”。
为此,我建立了一个双头网络,它需要这样的输入数据:DataFrame containing input data
然后它分裂成两个平行的网络。
# Create our input layer:
input = keras.Input(shape=(3), name='observation_data')
# Build our spectral class
s_class_branch = layers.Dense(100000, activation='relu', name = 's_class_branch_dense_1')(input)
s_class_branch = layers.Dense(500, activation='relu', name = 's_class_branch_dense_2')(s_class_branch)
# Spectral class prediction
s_class_prediction = layers.Dense(100,
activation='softmax',
name='s_class_prediction')(s_class_branch)
# Build our luminosity class
l_class_branch = layers.Dense(100000, activation='relu', name = 'l_class_branch_dense_1')(input)
l_class_branch = layers.Dense(500, activation='relu', name = 'l_class_branch_dense_2')(l_class_branch)
# Luminosity class prediction
l_class_prediction = layers.Dense(10,
activation='softmax',
name='l_class_prediction')(l_class_branch)
# Now we instantiate our model using the layer setup above
scaled_model = Model(input, [s_class_prediction, l_class_prediction])
optimizer = keras.optimizers.RMSprop(learning_rate=0.004)
scaled_model.compile(optimizer=optimizer,
loss={'s_class_prediction':'categorical_crossentropy',
'l_class_prediction':'categorical_crossentropy'},
metrics=['accuracy'])
logdir = os.path.join("logs", "2raw100k")
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
scaled_model.fit(
input_data,{
's_class_prediction':spectral_targets,
'l_class_prediction':luminosity_targets
},
epochs=20,
batch_size=1000,
validation_split=0.0,
callbacks=[tensorboard_callback])
在上面的代码中,你可以看到我尝试了一个在两个分支中都有两个隐藏层的模型,一个层的形状为100 000,然后进入另一个层的形状为500,然后进入输出层。训练目标是one-hot编码的,所以每个类都有一个节点。
我已经尝试了一个到四个隐藏层的大范围的大小,从500到100 000的形状,只是因为我用完了内存而停止。我只使用了密集层,除了尝试一个归一化层没有影响。
Graph of losses
他们都会愉快地训练,慢慢降低损失,但他们似乎从来没有过度适应。我已经运行了100个时代的网络,他们仍然不会过度适应。
我可以做些什么来使我的网络更好地适应数据?我对机器学习还很陌生,到现在才做了一年,所以我确信我错过了一些东西。我真的很感谢任何帮助,并很乐意提供图表中显示的日志。
1条答案
按热度按时间0yycz8jy1#
经过更多的培训,我想我已经得到了答案。基本上,网络没有足够的容量,需要更多的层。我之前尝试了更多的层,但因为我没有将其与验证数据进行比较,所以过拟合不明显!
证据就在布丁里:
所以感谢@Aryagm的评论,因为这让我解决了这个问题。正如你所看到的,验证数据(灰色和蓝色)明显过拟合,而训练数据(绿色和橙子)没有显示出这一点。
如果说有什么不同的话,那就是为什么一个单独的验证集如此重要,而我一开始就没有使用它,真是个傻瓜!