Python 神经网络损耗值不变

Python 神经网络损耗值不变,python,machine-learning,keras,neural-network,Python,Machine Learning,Keras,Neural Network,我在深度学习方面是新手,所以我制作了这个模型,为了训练我的数据,我尝试了许多组合,添加层,改变激活函数,改变损失函数,但损失并没有减少。 寻求你们的帮助 我的training_数据包含1000个样本:1000个RAW和20列所有数字,输出:4个数字的列表 这是我的模型: from keras import models from keras.models import Sequential from keras import layers from keras.layers import D

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

我的training_数据包含1000个样本:1000个RAW和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])#,

由于您处于回归设置中,因此不应使用
softmax
作为最后一层的激活函数-此处应使用
linear
激活(如果未定义,则为默认激活)

对于中间层,也不建议使用乙状结肠激活-改用
relu

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

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

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())

最后,您一定要增加您的
批量大小
(首先尝试64或128)。

这是一个分类或回归问题吗?请您解释一下数据集,或者它看起来如何,损失值受dataset@desertnaut这是一个多元回归问题,输出为四个数字,均为正数,求和时应等于one@Damzaky,这里是我的数据集的第一行,它包含20个标签和1000个样本:少于一个:数组([[0.00091693,0.00091528,0.00091285,…,0.00088302,0.00088099,0.00087953],[0.00079937, 0.00079768, 0.00079567, ..., 0.00077222, 0.0007711 , 0.00077031], [0.00057827, 0.00057821, 0.00057825, ..., 0.00057288, 0.0005722 , 0.00057154],…,感谢您的回答,我尝试了您在脚本中所做的更改,损失正在减少,但并不像我预期的那样,您认为添加更多层会有帮助吗?@Moh可能会,因为每层也有更多节点。在这种情况下,没有现成的答案,实验就是一切(一旦你避免了根本性的错误,如答案中指出的错误)。