【问题标题】:Neural network loss value not changing神经网络损失值不变
【发布时间】:2020-03-20 00:01:44
【问题描述】:

我是深度学习的新手,所以我做了这个模型,为了训练我的数据,我尝试了很多组合,添加层,改变激活函数,改变损失函数,但是损失并没有减少。 寻求你们的帮助。

我的 training_data 包含 1000 个样本:1000 个原始数据和 20 列所有数字,输出:4 个数字的列表 这是我的模型:

from keras import models
from keras.models import Sequential


from keras import layers
from keras.layers import Dense
from keras.layers import Flatten , Dropout
from keras.optimizers import SGD
from keras.callbacks import EarlyStopping
from sklearn.preprocessing import StandardScaler
from keras import optimizers

scaler = StandardScaler()
input_shape = x_train[0].shape
x_train_std = scaler.fit_transform(x_train)


model = Sequential()
model.add(layers.Dense(32, activation='sigmoid' , input_shape=input_shape))
model.add(Dropout(0.1))
model.add(layers.Dense(20, activation='sigmoid' ))
model.add(Dropout(0.1))
model.add(layers.Dense(15, activation='sigmoid' ))
model.add(Dropout(0.1))

model.add(layers.Dense(4, activation='softmax'))
#sgd = optimizers.SGD(lr=0.00001, decay=1e-6, momentum=0.85, nesterov=True)
#opt = SGD(lr=0.1, nesterov=True)
sgd = optimizers.SGD(lr=0.01, momentum=0.87, nesterov=True)
model.compile(loss='mean_squared_error',
              optimizer=sgd)
es = EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(x_train_std, y_train , validation_split=0.1, epochs=100, batch_size=1 , callbacks = [es])#,

【问题讨论】:

  • 这是分类问题还是回归问题?
  • 能否请您解释一下数据集,或者它的样子,损失值受数据集的影响很大
  • @desertnaut 这是一个多元回归问题,输出是四个数字,都是正数,总和应该等于一
  • @Damzaky,这里是我的数据集的第一行,它包含 20 个标签和 1000 个样本:少于一个:array([[0.00091693, 0.00091528, 0.00091285, ..., 0.00088302, 0.00088099, 0.00087953 ],[0.00079937,0.00079768,0.00079567,...,0.0007722,0.0007711,0.00077031],[0.00057827,0.00057821,0.00057821,0.00057825,0.00057288,0.0005722,0.0005722,0.00057154],..., span>

标签: python machine-learning keras neural-network


【解决方案1】:

由于您处于回归设置中,您应该使用softmax 作为最后一层的激活函数 - linear 激活(如果未定义,这是默认值)应该在这里使用。

Sigmoid 激活对于中间层也是非常不可取的 - 改用 relu

此外,默认情况下您不应使用 dropout - 开始时不要使用它,只有在它提高了验证性能时才添加它。

总而言之,对于初学者来说,您的模型应该是这样的:

model = Sequential()
model.add(layers.Dense(32, activation='relu' , input_shape=input_shape))
# model.add(Dropout(0.1))
model.add(layers.Dense(20, activation='relu' ))
# model.add(Dropout(0.1))
model.add(layers.Dense(15, activation='relu' ))
# model.add(Dropout(0.1))
model.add(layers.Dense(4)) # default activation='linear'

只有在需要时才可以取消注释丢失层(不一定完全)。

尝试使用 Adam 优化器也是第一种方法的好主意:

model.compile(loss='mean_squared_error',
              optimizer=keras.optimizers.Adam())

最后,你绝对应该增加你的batch_size(尝试64或128作为初学者)。

【讨论】:

  • 感谢您的回答,我尝试了您在脚本中所做的更改,损失正在减少,但没有像我预期的那样,您认为添加更多层会有所帮助吗?
  • @Moh 可以,每层也可以有更多节点。在这种情况下没有现成的答案,实验就是一切(一旦您避免了基本错误,例如答案中指出的错误)。
猜你喜欢
  • 2017-10-19
  • 2019-02-20
  • 1970-01-01
  • 2019-07-08
  • 2018-09-11
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多