Python 我应该怎么做才能获得较低的平均损失?

Python 我应该怎么做才能获得较低的平均损失?,python,machine-learning,keras,deep-learning,neural-network,Python,Machine Learning,Keras,Deep Learning,Neural Network,我是一名液压工程专业的学生,在实习期间正在研究神经网络,所以这对我来说是一件新鲜事。 我创建了我的神经网络,但它给了我很大的损失,我不知道是什么问题。。。您可以看到以下代码: def create_model(): model = Sequential() # Adding the input layer model.add(Dense(26,activation='relu',input_shape=(n_cols,))) # Adding the hidden

我是一名液压工程专业的学生,在实习期间正在研究神经网络,所以这对我来说是一件新鲜事。 我创建了我的神经网络,但它给了我很大的损失,我不知道是什么问题。。。您可以看到以下代码:

def create_model():
    model = Sequential()
    # Adding the input layer
    model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
    # Adding the hidden layer
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    # Adding the output layer
    model.add(Dense(2))
    # Compiling the RNN
    model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
    return model

kf = KFold(n_splits = 5, shuffle = True)
model = create_model()
scores = []
for i in range(5):
    result = next(kf.split(data_input), None)
    input_train = data_input[result[0]]
    input_test = data_input[result[1]]
    output_train = data_output[result[0]]
    output_test = data_output[result[1]]
    # Fitting the RNN to the Training set
    model.fit(input_train, output_train, epochs=5000, batch_size=200 ,verbose=2)
    predictions = model.predict(input_test) 
    scores.append(model.evaluate(input_test, output_test))

print('Scores from each Iteration: ', scores)
print('Average K-Fold Score :' , np.mean(scores))
当我执行代码时,结果如下:

Scores from each Iteration:  [[93.90406122928908, 0.8907562990148529], [89.5892979597845, 0.8907563030218878], [81.26530176050522, 0.9327731132507324], [56.46526102659081, 0.9495798339362905], [54.314151876112994, 0.9579831877676379]]
Average K-Fold Score : 38.0159922589274

有人能帮我吗?我该怎么做才能减少损失

您的问题和代码都存在一些问题

首先,通常我们不能说X值的MSE损失是低还是高。与分类问题的准确度不同,分类问题的准确度在
[0,1]
中有定义,损失没有类似的界限,因此没有通用的方法来说明特定值是低还是高,正如您在这里暗示的那样(它始终取决于特定的问题)

澄清了这一点之后,让我们转到您的代码

首先,从您的
损失class='mean_squared_error'
判断,您似乎处于一个回归设置中,在这个设置中,准确性是毫无意义的;看见您没有分享您在这里试图解决的确切问题,但如果它确实是一个回归问题(即预测某些数值),您应该在模型编译中去掉
metrics=['accurity']
,并可能将最后一层更改为单个单元,即
model.add(稠密(1))

其次,正如您当前的代码所示,您实际上并没有在每个CV折叠中从头开始安装独立的模型(这是CV的精髓);在Keras中,
model.fit
累积工作,即它不会在每次调用模型时“重置”模型,但会从上一次调用继续拟合。这正是为什么如果你看到你的
分数
,很明显,模型在以后的折叠中明显更好(这已经给了改进的提示:添加更多的纪元)。为了像适合正确CV一样适合独立模型,您应该将
create_model()
移动到
for
循环中

第三个,你在这里使用的
np.mean()
同样没有意义,因为你将损失和准确度(即苹果和桔子)一起平均;从54到94之间的5个损失值中,你的“平均值”为38,这一事实应该已经提醒你,你正在尝试一些错误的事情。事实是,如果你像上面所说的那样忽略了精度指标,你就不会有这个问题了

总而言之,您的代码在原则上应该是这样的(但是,我对您试图解决的确切问题一点也不知道,因此一些细节可能会有所不同):


感谢您的帮助,我需要创建一个神经网络,输入26个流体物理参数,输出2个物理参数。是的,这是一个回归问题。那么,我能理解什么是看到高平均值是正常的呢?@sbu help08所以,只需将输出层保留为2个节点,然后实现我建议的其他东西——实验,实验,实验。。。
def create_model():
    model = Sequential()
    # Adding the input layer
    model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
    # Adding the hidden layer
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    # Adding the output layer
    model.add(Dense(1))  # change to 1 unit
    # Compiling the RNN
    model.compile(optimizer='adam', loss='mean_squared_error') # dismiss accuracy
    return model

kf = KFold(n_splits = 5, shuffle = True)
scores = []
for i in range(5):
    result = next(kf.split(data_input), None)
    input_train = data_input[result[0]]
    input_test = data_input[result[1]]
    output_train = data_output[result[0]]
    output_test = data_output[result[1]]
    # Fitting the RNN to the Training set
    model = create_model()  # move create_model here
    model.fit(input_train, output_train, epochs=10000, batch_size=200 ,verbose=2)  # increase the epochs
    predictions = model.predict(input_test) 
    scores.append(model.evaluate(input_test, output_test))

print('Loss from each Iteration: ', scores)
print('Average K-Fold Loss :' , np.mean(scores))