【问题标题】:Linear Regression problem, ridiculously high loss线性回归问题,高得离谱
【发布时间】:2019-03-04 19:15:15
【问题描述】:
import pandas as pd
import matplotlib.pyplot as plt

csv = 'C:\\Users\\Alex\\Downloads\\weight-height.csv'

df = pd.read_csv(csv)
df.head

x_train = df['Height'].values
#into centimetres because im english
x_train = x_train * 2.54
y_train = df['Weight'].values
#into kilos because im english
y_train = y_train / 2.2046226218

plt.figure()
plt.scatter(x_train, y_train, c=None)
plt.show()
print(X[:10])
print(y[:10])

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
import numpy as np

X = np.array(x_train).reshape(-1,1)
y = np.array(y_train).reshape(-1,1)

X = X[:5000]
y = y[:5000]

model = Sequential()
model.add(Dense(36, activation='relu'))
model.add(Dense(18))
model.add(Dense(1))

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

history = model.fit(X,y, batch_size=1, epochs=1, validation_split=0.1)

#plt.plot(history.history['acc'])
#plt.plot(history.history['val_acc'])

我的问题几乎是我是一个菜鸟,我正在尝试使用 keras 从头开始​​创建自己的线性回归模型,但我不明白为什么我的损失如此之高。我需要知道它是我正在使用的优化器或损失函数还是数据问题。数据集只是体重和身高的列表。

【问题讨论】:

  • 我建议尝试将一条直线拟合到两个数据点 - 这应该更容易排除故障,特别是如果您事先知道正确答案。
  • 您正在为单个 epoch 进行训练,使用单个样本的批次,这是一个大问题。你应该训练更长时间。

标签: neural-network deep-learning artificial-intelligence linear-regression


【解决方案1】:

我会尝试:

  1. 标准化您的身高和体重,以使两者的最大值为 1。当值约为 1 时,深度学习通常更容易。显然,您需要对测试数据进行相同的除法,然后在最后将答案乘以相同的数量。

  2. 将指标更改为“mse”或“mae”(均方误差或平均绝对误差)。这不会改变你的损失,但会让你感觉更好,因为它是衡量你表现的更有意义的指标。

试试这个:

x_train = df['Height'].values
x_train = x_train * 2.54
x_train = x_train / 175.0

y_train = df['Weight'].values
y_train = y_train / 2.2046226218
y_train = y_train / 80.0

...

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

并测试一些新值

x_test = 187
x_test = np.array(x_test).reshape(-1,1)
x_test = x_test * 2.54
x_test = x_test / 175.0
pred = model.predict(x_test)
pred = pred * 80.0

【讨论】:

  • 非常感谢,那你为什么要把身高除以 175,体重除以 80,但现在其他一切都说得通了,我不能用 sigmoid 曲线代替吗?
  • 对不起,我应该解释一下。我选择了 175 厘米和 80 公斤作为合理的值,它们大致处于人类身高和体重分布的上端。我在测试中选择了187,因为那是我的身高!您可以使用 sigmoid 作为隐藏单元的激活,但您的输出单元需要能够输出大于 1 的值,以防您的测试高度大于任何训练高度。为什么要标准化输入?观看此视频:coursera.org/lecture/deep-neural-network/…
  • 非常感谢,通过教我的人学习这些东西真的很有用,谢谢
猜你喜欢
  • 2021-04-16
  • 2018-11-17
  • 2018-12-14
  • 2019-04-15
  • 2018-01-08
  • 2022-12-29
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多