keras 如何帮助我的TensorFlow网络过拟合大型数据集?

fzwojiic  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(122)

我之所以要特别地过度适应,是因为我正在遵循弗朗索瓦·肖莱的“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个时代的网络,他们仍然不会过度适应。
我可以做些什么来使我的网络更好地适应数据?我对机器学习还很陌生,到现在才做了一年,所以我确信我错过了一些东西。我真的很感谢任何帮助,并很乐意提供图表中显示的日志。

0yycz8jy

0yycz8jy1#

经过更多的培训,我想我已经得到了答案。基本上,网络没有足够的容量,需要更多的层。我之前尝试了更多的层,但因为我没有将其与验证数据进行比较,所以过拟合不明显!
证据就在布丁里:

所以感谢@Aryagm的评论,因为这让我解决了这个问题。正如你所看到的,验证数据(灰色和蓝色)明显过拟合,而训练数据(绿色和橙子)没有显示出这一点。
如果说有什么不同的话,那就是为什么一个单独的验证集如此重要,而我一开始就没有使用它,真是个傻瓜!

相关问题