Tensorflow NN没有给出任何合理的输出

时间:2019-12-23 11:02:38

标签: python tensorflow keras

我想在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”和“随机梯度不错”
  • 不同批次大小
  • 不同的数据准备(特征范围从-1到1值。我尝试沿特征轴进行归一化,批量归一化(z_i =(x_i-平均值)/ std(x_i)),如上面的代码所示,值从0到1(因为我猜想'relu'激活不适用于负输入值)

我尝试的所有东西几乎都给出了奇怪的输出,这些输出的损耗值非常高(取决于学习率),学习过程中的准确性却很低。损耗几乎一直都在增加,但似乎与精度值无关。

对于代码,我按照提供的教程进行操作,但是由于我应该找到最佳的超级参数,所以有些不对劲,但是我什么也找不到。

我很高兴得到一些要点,这些地方弄错了代码或需要以不同的方式预处理数据。

编辑:给出了使用loss='categorical_crossentropy'的信息,因此至少这一点应该是正确的。

1 个答案:

答案 0 :(得分:1)

首先:

您的收敛问题可能是由于“不正确”的损失函数引起的。 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)

希望这会有所帮助!