张量流NN没有给出任何合理的输出

2024-04-19 21:54:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在isolet数据集上训练一个网络,由6238个样本组成,每个样本有300个特征。你知道吗

这是我目前的代码:

import tensorflow as tf
import sklearn.preprocessing as prep

import numpy as np
import matplotlib.pyplot as plt


def main():
    X, C, Xtst, Ctst = load_isolet()

    #normalize 
    #X = (X - np.mean(X, axis = 1)[:, np.newaxis]) / np.std(X, axis = 1)[:, np.newaxis]
    #Xtst = (Xtst - np.mean(Xtst, axis = 1)[:, np.newaxis]) / np.std(Xtst, axis = 1)[:, np.newaxis]

    scaler = prep.MinMaxScaler(feature_range=(0,1))
    scaledX = scaler.fit_transform(X)
    scaledXtst = scaler.transform(Xtst)

    # Build the tf.keras.Sequential model by stacking layers. Choose an optimizer and loss function for training:
    model = tf.keras.models.Sequential([
      tf.keras.layers.Dense(X.shape[1], activation='relu'),
      tf.keras.layers.Dense(64, activation='relu'),
      tf.keras.layers.Dense(26, activation='softmax')
    ])

    ES_callback = tf.keras.callbacks.EarlyStopping(monitor='loss', min_delta=1e-2, patience=10, verbose=1)
    initial_learning_rate = 0.01
    lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate,decay_steps=100000,decay_rate=0.9999,staircase=True)
    optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)

    model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

    history = model.fit(scaledX, C, epochs=100, callbacks=[ES_callback], batch_size = 32)

    plt.figure(1)
    plt.plot(range(len(history.history['loss'])), history.history['loss']);
    plt.plot(range(len(history.history['accuracy'])), history.history['accuracy']);
    plt.show()

到目前为止,我几乎已经转动了我所知道的每一个旋钮:

  • 不同层数
  • 不同尺寸的层
  • 不同的激活功能
  • 不同的学习率
  • 不同的优化器(我们应该用'adam'和'random gradient'测试)
  • 不同的批量大小
  • 不同的数据准备(特征值范围从-1到1。我试着沿着特征轴进行规范化,批量规范化(z_I=(x_I-mean)/std(x_I)),如上面的代码所示,将值从0缩放到1(因为我猜“relu”激活在负输入值下不会很好地工作)

几乎所有我尝试过的东西都会给出奇怪的输出,损失值极高(取决于学习率),而且在学习过程中精确度很低。几乎所有时间段内,损失都在增加,但似乎与准确度值无关。你知道吗

对于代码,我遵循我得到的教程,但是有些东西是非常离谱的,因为我应该找到最好的超参数,但我不能找到任何好的东西。你知道吗

我很高兴得到一些要点,哪里的代码出错了,或者需要对数据进行不同的预处理。你知道吗

编辑:使用loss='categorical_crossentropy'是给定的,所以至少这个应该是正确的。你知道吗


Tags: 代码importmodellayerstfasnpplt
1条回答
网友
1楼 · 发布于 2024-04-19 21:54:39

首先:

你的收敛问题可能是由于“错误的”损失函数。tf.keras支持各种损失,这取决于输入标签的形状。 尝试不同的可能性,比如 tf.keras.losses.SparseCategoricalCrossentropy如果标签是one-hot向量。
tf.keras.losses.CategoricalCrossentropy如果标签是1,2,3…
或者tf.keras.losses.BinaryCrossentropy如果标签仅为0,1。你知道吗

老实说,tf.keras的这一部分有点棘手,一些类似的设置可能需要调整。你知道吗

第二,这部分:

    scaler = prep.MinMaxScaler(feature_range=(0,1))
    scaledX = scaler.fit_transform(X)
    scaledXtst = scaler.fit_transform(Xtst)

假设Xtst是您的测试集,您希望根据您的训练集对其进行缩放。所以正确的比例应该是

scaledXtst = scaler.transform(Xtst)

希望这有帮助!你知道吗

相关问题 更多 >