我的回归神经网络停留在一定的精度
My regression neural network stuck at certain accuracy
我正在尝试构建回归神经网络。我的问题是从一开始训练期间的准确度指标保持在值 0.0027。我尝试改变隐藏层和神经元的数量、学习率、优化器、损失函数、隐藏层的激活函数和批量大小。不幸的是,似乎没有任何效果。我什至在没有缩放输出数据(并且没有输出激活函数)的情况下尝试过这个并且准确度甚至不大于零(它是 0.0000e-4 或类似的东西)并且损失实际上在减少但停留在损失= 56。所以我怀疑它与值缩放有关,但我不知道如何解决这个问题。
为了构建回归神经网络,我创建了自己的虚构数据集。它是组(蓝色和粉红色)、年龄、智商和一些不存在的考试结果之间的相关性。
创建数据集后,我使用 TensorFlow 创建了神经网络。这是我的代码:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
def preprocess_dataframe(dataframe):
for index, row in dataframe.iterrows():
if row['group'] == 'blue':
dataframe.at[index, 'group'] = 0
else:
dataframe.at[index, 'group'] = 1
data = dataframe.to_numpy()
data_X = np.delete(data, 3, 1)
data_y = data[:, 3]
data_y = np.asarray(data_y).astype(np.float32)
data_y = data_y / 100
X_train, X_val, X_test = data_X[:7000], data_X[7000:8500], data_X[8500:]
y_train, y_val, y_test = data_y[:7000], data_y[7000:8500], data_y[8500:]
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)
return X_train_scaled, X_val_scaled, X_test_scaled, y_train, y_val, y_test
df = pd.read_csv('data.csv')
X_train, X_val, X_test, y_train, y_val, y_test = preprocess_dataframe(df)
model = keras.models.Sequential([
keras.layers.InputLayer(input_shape=[3]),
keras.layers.Dense(30, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
loss='mse',
optimizer=keras.optimizers.SGD(learning_rate=0.01),
metrics=['accuracy']
)
history = model.fit(
X_train,
y_train,
epochs=1000,
validation_data=(X_val, y_val)
)
model.evaluate(X_test, y_test)
加载的数据框如下所示:
group age iq result
0 blue 77 114.600366 47
1 blue 88 105.094111 52
2 pink 18 143.150909 39
3 blue 76 94.557100 34
4 pink 21 149.144244 40
... ... ... ... ...
9995 blue 68 179.515230 77
9996 blue 28 194.699500 74
9997 pink 20 166.325281 50
9998 blue 49 89.103387 28
9999 pink 36 185.689921 73
你的问题是回归问题,因为目标不是 class,而是分数(结果除以 100),而准确度是适用于 class化的指标。我可以向您提出 3 种解决方案:
- 将问题更改为class化问题。将目标变成二进制文件,可能使用 threhsold
- 更改您正在使用的指标。准确性显然不是最好的衡量标准,因为您试图预测的值不是绝对值 class。作为替代方案,您可以通过向
model.compile
提供 loss='mean_squared_error'
而不是准确性来使用 mean_squared_error。您可以在 this link 中了解有关 class化指标的更多信息
- 更改您的网络以跟踪回归任务问题。回归任务侧重于预测数值,您可以通过将最后一个密集层设置为其他东西来实现这一点,可能
Relu
或者根本不在最后一层使用激活。
**此声明的更新:如果您的值严格介于 0 和 1 之间,使用 sigmoid 作为最终激活层仍然可以,因为该值被压缩在 0 和 1 之间。
我正在尝试构建回归神经网络。我的问题是从一开始训练期间的准确度指标保持在值 0.0027。我尝试改变隐藏层和神经元的数量、学习率、优化器、损失函数、隐藏层的激活函数和批量大小。不幸的是,似乎没有任何效果。我什至在没有缩放输出数据(并且没有输出激活函数)的情况下尝试过这个并且准确度甚至不大于零(它是 0.0000e-4 或类似的东西)并且损失实际上在减少但停留在损失= 56。所以我怀疑它与值缩放有关,但我不知道如何解决这个问题。
为了构建回归神经网络,我创建了自己的虚构数据集。它是组(蓝色和粉红色)、年龄、智商和一些不存在的考试结果之间的相关性。
创建数据集后,我使用 TensorFlow 创建了神经网络。这是我的代码:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
def preprocess_dataframe(dataframe):
for index, row in dataframe.iterrows():
if row['group'] == 'blue':
dataframe.at[index, 'group'] = 0
else:
dataframe.at[index, 'group'] = 1
data = dataframe.to_numpy()
data_X = np.delete(data, 3, 1)
data_y = data[:, 3]
data_y = np.asarray(data_y).astype(np.float32)
data_y = data_y / 100
X_train, X_val, X_test = data_X[:7000], data_X[7000:8500], data_X[8500:]
y_train, y_val, y_test = data_y[:7000], data_y[7000:8500], data_y[8500:]
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)
return X_train_scaled, X_val_scaled, X_test_scaled, y_train, y_val, y_test
df = pd.read_csv('data.csv')
X_train, X_val, X_test, y_train, y_val, y_test = preprocess_dataframe(df)
model = keras.models.Sequential([
keras.layers.InputLayer(input_shape=[3]),
keras.layers.Dense(30, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
loss='mse',
optimizer=keras.optimizers.SGD(learning_rate=0.01),
metrics=['accuracy']
)
history = model.fit(
X_train,
y_train,
epochs=1000,
validation_data=(X_val, y_val)
)
model.evaluate(X_test, y_test)
加载的数据框如下所示:
group age iq result
0 blue 77 114.600366 47
1 blue 88 105.094111 52
2 pink 18 143.150909 39
3 blue 76 94.557100 34
4 pink 21 149.144244 40
... ... ... ... ...
9995 blue 68 179.515230 77
9996 blue 28 194.699500 74
9997 pink 20 166.325281 50
9998 blue 49 89.103387 28
9999 pink 36 185.689921 73
你的问题是回归问题,因为目标不是 class,而是分数(结果除以 100),而准确度是适用于 class化的指标。我可以向您提出 3 种解决方案:
- 将问题更改为class化问题。将目标变成二进制文件,可能使用 threhsold
- 更改您正在使用的指标。准确性显然不是最好的衡量标准,因为您试图预测的值不是绝对值 class。作为替代方案,您可以通过向
model.compile
提供loss='mean_squared_error'
而不是准确性来使用 mean_squared_error。您可以在 this link 中了解有关 class化指标的更多信息
- 更改您的网络以跟踪回归任务问题。回归任务侧重于预测数值,您可以通过将最后一个密集层设置为其他东西来实现这一点,可能
Relu
或者根本不在最后一层使用激活。 **此声明的更新:如果您的值严格介于 0 和 1 之间,使用 sigmoid 作为最终激活层仍然可以,因为该值被压缩在 0 和 1 之间。