我想在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()
到目前为止,我已经转动了几乎所有我知道的旋钮:
我尝试的所有东西几乎都给出了奇怪的输出,这些输出的损耗值非常高(取决于学习率),学习过程中的准确性却很低。损耗几乎一直都在增加,但似乎与精度值无关。
对于代码,我按照提供的教程进行操作,但是由于我应该找到最佳的超级参数,所以有些不对劲,但是我什么也找不到。
我很高兴得到一些要点,这些地方弄错了代码或需要以不同的方式预处理数据。
编辑:给出了使用loss='categorical_crossentropy'
的信息,因此至少这一点应该是正确的。
答案 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)
希望这会有所帮助!