【问题标题】:Regression model output looks inconsistent回归模型输出看起来不一致
【发布时间】:2021-06-06 21:30:42
【问题描述】:

关于我的项目的一些背景信息:我打算研究有关子弹的各种参数以及它们如何影响弹丸的弹道系数(即子弹性能)。我有不同的参数,比如重量、口径、截面密度等。但我觉得我做错了;我只是在阅读教程并应用我认为对我的项目有用且相关的内容。

我的回归模型的输出看起来有点不对劲;经过训练的模型在我的程序的整个model.fit() 部分持续输出0.0201 作为MSE。

另外,model.predict(X) 似乎有 100% 的准确度,然而,这似乎不对;我从描述 Keras 模型的教程中借用了一些代码,以在显示预期输出的同时显示模型输出。

这是构建模型并对其进行训练的程序

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.utils import shuffle
import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard

from pandas.plotting import scatter_matrix

import time

name = 'Bullet Database Analysis v2-{}'.format(int(time.time()))

tensorboard = TensorBoard(log_dir='logs/{}'.format(name))

physical_devices = tf.config.list_physical_devices('GPU') 
tf.config.experimental.set_memory_growth(physical_devices[0], True)

df = pd.read_csv('Bullet Optimization\ShootForum Bullet DB_2.csv')

from sklearn.model_selection import train_test_split
from sklearn import preprocessing
dataset = df.values
X = dataset[:,0:12]
X = np.asarray(X).astype(np.float32)

y = dataset[:,13]
y = np.asarray(y).astype(np.float32)

X_train, X_val_and_test, y_train, y_val_and_test = train_test_split(X, y, test_size=0.3, shuffle=True)
X_val, X_test, y_val, y_test = train_test_split(X_val_and_test, y_val_and_test, test_size=0.5)

from keras.models import Sequential
from keras.layers import Dense, BatchNormalization

model = Sequential(
    [
        #2430 is the shape of X_train
        #BatchNormalization(axis=-1, momentum = 0.1),
        Dense(2430, activation='relu'),
        Dense(32, activation='relu'),
        Dense(1),
    ]
)

model.compile(loss='mse', metrics=['mse'])

history = model.fit(X_train, y_train, 
                    batch_size=64, 
                    epochs=20, 
                    validation_data=(X_val, y_val),
                    #callbacks = [tensorboard]
                    )
# plt.plot(history.history['loss'],'r')
# plt.plot(history.history['val_loss'],'m')

plt.plot(history.history['mse'],'b')
plt.show()

model.summary()

model.save("Bullet Optimization\Bullet Database Analysis.h5")

这是我的代码,通过 h5 加载我之前训练的模型

import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras.models import load_model
import pandas as pd

df = pd.read_csv('Bullet Optimization\ShootForum Bullet DB_2.csv')

model = load_model('Bullet Optimization\Bullet Database Analysis.h5')

dataset = df.values
X = dataset[:,0:12]
y = dataset[:,13]

model.fit(X,y, epochs=10)

#predictions = np.argmax(model.predict(X), axis=-1)
predictions = model.predict(X)
# summarize the first 5 cases
for i in range(5):
    print('%s => %d (expected %d)' % (X[i].tolist(), predictions[i], y[i]))

这是输出

Epoch 1/10
2021-03-09 10:38:06.372303: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2021-03-09 10:38:07.747241: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
109/109 [==============================] - 2s 4ms/step - loss: 0.0201 - mse: 0.0201
Epoch 2/10
109/109 [==============================] - 1s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 3/10
109/109 [==============================] - 0s 4ms/step - loss: 0.0201 - mse: 0.0201
Epoch 4/10
109/109 [==============================] - 0s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 5/10
109/109 [==============================] - 1s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 6/10
109/109 [==============================] - 1s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 7/10
109/109 [==============================] - 1s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 8/10
109/109 [==============================] - 0s 4ms/step - loss: 0.0201 - mse: 0.0201
Epoch 9/10
109/109 [==============================] - 1s 5ms/step - loss: 0.0201 - mse: 0.0201
Epoch 10/10
109/109 [==============================] - 0s 4ms/step - loss: 0.0201 - mse: 0.0201
[0.314, 7.9756, 100.0, 100.0, 31.4, 0.00314, 318.4713376, 6.480041472000001, 0.51, 12.95400001, 4.067556004, 0.145] => 0 (expected 0)
[0.358, 9.0932, 148.0, 148.0, 52.983999999999995, 0.002418919, 413.4078212, 9.590461379, 0.635, 16.12900002, 5.774182006, 0.165] => 0 (expected 0)
[0.313, 7.9502, 83.0, 83.0, 25.979, 0.003771084, 265.1757188, 5.378434422000001, 0.504, 12.80160001, 4.006900804, 0.121] => 0 (expected 0)
[0.251, 6.3754, 50.0, 50.0, 12.55, 0.00502, 199.20318730000002, 3.2400207360000004, 0.4, 10.16000001, 2.5501600030000002, 0.113] => 0 (expected 0)
[0.251, 6.3754, 50.0, 50.0, 12.55, 0.00502, 199.20318730000002, 3.2400207360000004, 0.41, 10.41400001, 2.613914003, 0.113] => 0 (expected 0)

这是我的训练数据集的link。在我的代码中,我使用 train_test_split 创建了测试和训练数据集。

最后,Tensorboard 中有没有一种方法可以可视化模型与数据集的拟合?我真的觉得虽然我的模型正在训练,但即使 MSE 误差减少了,它也没有进行任何显着的拟合。

【问题讨论】:

  • 请展示model.fit产生的训练数据
  • 对不起,我不太清楚你的意思,但我打电话给model.fit(...).history,这是输出:'loss': [0.020089702680706978, 0.020084749907255173, 0.02007758617401123, 0.0200809258967638, 0.020072614774107933, 0.0200900100171566, 0.020088041201233864, 0.02009417489171028, 0.020077534019947052, 0.02009080909192562], 'mse': [0.020089702680706978, 0.020084749907255173, 0.02007758617401123, 0.0200809258967638, 0.020072614774107933, 0.0200900100171566, 0.020088041201233864, 0.02009417489171028, 0.020077534019947052, 0.02009080909192562]}
  • 这能回答你的问题吗? NaN loss when training regression network
  • 谢谢,但不是真的;当我的输出曾经是 NaN 时,它确实对我有帮助,但是,现在我的问题是实际使用经过训练的模型。

标签: python pandas tensorflow keras regression


【解决方案1】:

因为您的数据集中有 nan 值。分手前可以df.isna().sum()查看。这些可能会对您的网络产生负面影响。在这里,我只是简单地删除了它们 (df.dropna(inplace = True, axis = 0)),但您可以使用一些插补技术来替换它们。

另外 2430 个神经元对于这个数据来说可能是多余的,从更少的神经元开始。

model = tf.keras.models.Sequential(
    [
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(1),
    ]
)

这是最后一个纪元:

Epoch 20/20
27/27 [==============================] - 0s 8ms/step - loss: 8.2077e-04 - mse: 8.2077e-04 - 
                                         val_loss: 8.5023e-04 - val_mse: 8.5023e-04

在进行回归时,直接计算准确度不是一个有效的选项。您可以使用model.evaluate(X_test, y_test),或者当您通过model.predict 获得预测时,您可以使用其他回归指标来计算您的预测有多接近。

【讨论】:

  • 我帮了自己一个忙,发布了我所有的代码;谢谢你修好它!但是,我想知道Dense() 函数的第一个参数是做什么的,其中那个数字是单位数。我认为我应该使用 2430,因为数据集大小大约是那个大小。另外,我发布了错误的数据集; drive.google.com/file/d/1Usv4aIhb03HJcPdtSX_iypqMnk4XRznO/… 这是修剪掉 NaN 的地方
  • 我还想补充一点,训练期间似乎没有问题,但是当我将模型作为 h5 文件加载到单独的程序中时,我在测试回归时遇到了问题.这是训练时的输出Epoch 16/20 31/31 [==============================] - 0s 7ms/step - loss: 0.0282 - mse: 0.0282 - val_loss: 0.0244 - val_mse: 0.0244
  • 1) 单元数是该层中的神经元数。 2)您需要扩展该数据集,因为您可以看到一些值与其他值相比非常高。像 0.003265.17 一样,当您通过 load_model() 加载时,您不需要再次拟合或编译它。只需简单地获取预测,因为该模型已经包含学习的权重等。
  • 抱歉,我该如何准确地扩展我的数据集?我从事机器学习已经有一段时间了,但现在是我了解这些小统计技术的时候了
  • 看看:sklearn.preprocessing.StandardScaler。如果它解决了您的问题,也请考虑接受答案。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2022-01-17
  • 2019-04-08
  • 2012-01-11
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多