Python 神经网络模型不提高精度。缩放问题还是模型问题?

Python 神经网络模型不提高精度。缩放问题还是模型问题?,python,machine-learning,keras,neural-network,scaling,Python,Machine Learning,Keras,Neural Network,Scaling,我试图创建一个简单的神经网络,看看它是如何工作的 第二级运算的形式为(x-x1)*(x-x2)=0,如果重新排列它,它将变成ax^2+bx+c=0,其中A=1,b=-2*x1*x2,c=x1*x2。我想创建一个神经网络,其中输入是(a,b),输出是(x1,x2) 为此,我创建了两个函数来创建数据,并将它们存储在名为input和output的矩阵中 我已经创建了一个具有2x2x2层(包括输入和输出)的神经网络,并对其进行了测试,结果很差,即使在调整之后 我想我遇到的问题是关于数据的,因为神经网络可

我试图创建一个简单的神经网络,看看它是如何工作的

第二级运算的形式为(x-x1)*(x-x2)=0,如果重新排列它,它将变成ax^2+bx+c=0,其中A=1,b=-2*x1*x2,c=x1*x2。我想创建一个神经网络,其中输入是(a,b),输出是(x1,x2)

为此,我创建了两个函数来创建数据,并将它们存储在名为input和output的矩阵中

我已经创建了一个具有2x2x2层(包括输入和输出)的神经网络,并对其进行了测试,结果很差,即使在调整之后

我想我遇到的问题是关于数据的,因为神经网络可以工作并输出结果,但并不好

我不知道问题出在哪里,但我猜这与数据缩放有关。我试图在不缩放数据的情况下引入数据,但我得到了同样糟糕的结果

我的想法是,我提供足够的训练,因此权重和偏差是这样的,如果提供任何输入数据,结果将非常接近期望的输出

这是整个程序的代码

import keras
from keras import backend as K
from keras.models import Sequential
from keras.models import load_model
from keras.layers import Dense, Activation
from keras.layers.core import Dense
from keras.optimizers import SGD
from keras.metrics import categorical_crossentropy
from sklearn.metrics import  confusion_matrix
import itertools

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

from random import randint
from sklearn.preprocessing import MinMaxScaler


import numpy as np

def abc(x1, x2):
    b=-2*x1*x2
    c=x1*x2
    sol=[b,c]
    return sol

a=10
b=10
c=a*b


def Nx2(N, M):
    matrix=[]
    n = N+ 1
    m= M + 1
    for i in range(1,n):
        for j in range(1,m):
            temp=[i,j]
            matrix.append(temp)
    final_matrix = np.array(matrix)
    return final_matrix

output=Nx2(a, b)

# print(output)

input=[]
for i in range(0,c):
    temp2=abc(output[i,0],output[i,1])
    input.append(temp2)
input=np.array(input)

print(input)

train_labels = output
train_samples = input

scaler = MinMaxScaler(feature_range=(0,1))
scaled_train_samples = scaler.fit_transform((train_samples).reshape(-1,1))
scaled_train_samples=scaled_train_samples.reshape(-1,2)

scaler = MinMaxScaler(feature_range=(0,1))
scaled_train_labels = scaler.fit_transform((train_labels).reshape(-1,1))
scaled_train_labels=scaled_train_labels.reshape(-1,2)

print(scaled_train_samples)
print(scaled_train_labels)

model = Sequential([
    Dense(2, input_shape=(2,), activation='sigmoid'),
    Dense(2, activation='sigmoid'),
])

print(model.weights)

model.compile(SGD(lr=0.01), loss='mean_squared_error', metrics=['accuracy'])
model.fit(scaled_train_labels, scaled_train_labels, validation_split=0.2, batch_size=10, epochs=20, shuffle=True, verbose=2)

print(model.summary())
print(model.weights)
这些就是我得到的结果

 Epoch 1/20 
     - 0s - loss: 0.1456 - accuracy: 0.5500 - val_loss: 0.3715 - val_accuracy: 0.0500 Epoch 2/20
     - 0s - loss: 0.1449 - accuracy: 0.5500 - val_loss: 0.3704 - val_accuracy: 0.0500 Epoch 3/20
     - 0s - loss: 0.1443 - accuracy: 0.5500 - val_loss: 0.3692 - val_accuracy: 0.0500 Epoch 4/20
     - 0s - loss: 0.1437 - accuracy: 0.5500 - val_loss: 0.3681 - val_accuracy: 0.0500 Epoch 5/20
     - 0s - loss: 0.1431 - accuracy: 0.5500 - val_loss: 0.3670 - val_accuracy: 0.0500 Epoch 6/20
     - 0s - loss: 0.1425 - accuracy: 0.5500 - val_loss: 0.3658 - val_accuracy: 0.0500 Epoch 7/20
     - 0s - loss: 0.1419 - accuracy: 0.5500 - val_loss: 0.3647 - val_accuracy: 0.0500 Epoch 8/20
     - 0s - loss: 0.1413 - accuracy: 0.5500 - val_loss: 0.3636 - val_accuracy: 0.0500 Epoch 9/20
     - 0s - loss: 0.1407 - accuracy: 0.5500 - val_loss: 0.3625 - val_accuracy: 0.0500 Epoch 10/20
     - 0s - loss: 0.1401 - accuracy: 0.5500 - val_loss: 0.3613 - val_accuracy: 0.0500 Epoch 11/20
     - 0s - loss: 0.1395 - accuracy: 0.5500 - val_loss: 0.3602 - val_accuracy: 0.0500 Epoch 12/20
     - 0s - loss: 0.1389 - accuracy: 0.5500 - val_loss: 0.3591 - val_accuracy: 0.0500 Epoch 13/20
     - 0s - loss: 0.1383 - accuracy: 0.5500 - val_loss: 0.3580 - val_accuracy: 0.0500 Epoch 14/20
     - 0s - loss: 0.1377 - accuracy: 0.5500 - val_loss: 0.3568 - val_accuracy: 0.0500 Epoch 15/20
     - 0s - loss: 0.1372 - accuracy: 0.5500 - val_loss: 0.3557 - val_accuracy: 0.0500 Epoch 16/20
     - 0s - loss: 0.1366 - accuracy: 0.5500 - val_loss: 0.3546 - val_accuracy: 0.0500 Epoch 17/20
     - 0s - loss: 0.1360 - accuracy: 0.5500 - val_loss: 0.3535 - val_accuracy: 0.0500 Epoch 18/20
     - 0s - loss: 0.1354 - accuracy: 0.5500 - val_loss: 0.3524 - val_accuracy: 0.0500 Epoch 19/20
     - 0s - loss: 0.1348 - accuracy: 0.5500 - val_loss: 0.3513 - val_accuracy: 0.0500 Epoch 20/20
     - 0s - loss: 0.1342 - accuracy: 0.5500 - val_loss: 0.3502 - val_accuracy: 0.0500 
有人能给我指出正确的方向吗


谢谢

您的代码有几个问题:

  • 您正在对回归问题使用精度,这是毫无意义的(精度仅适用于分类问题)。您应该只使用损失监测模型的性能,这里是MSE(出于同样的原因,您不需要导入
    混乱矩阵
    分类交叉熵

  • 您错误地将
    sigmoid
    激活用于最后一层;在回归问题中,这应该是
    linear
    (或者留空,因为
    linear
    是默认的Keras激活)

  • 您应该对中间层使用
    relu
    激活,而不是
    sigmoid

  • 您的模型看起来太简单了,而且不清楚为什么您觉得必须只使用2节点层(当然,除了输出层之外,您不应该这样做)

  • 总而言之,这里是一个起点:

    model = Sequential([
        Dense(30, input_shape=(2,), activation='relu'),
        # Dense(10, activation='relu'), # uncomment for experimentation
        Dense(2, activation='linear'),
    ])
    
    model.compile(SGD(lr=0.01), loss='mean_squared_error')
    
    但这里的暗号是实验


    最后但并非最不重要的一点是,您的
    model.fit()
    (您传递了两次标签,而不是样本)-请务必也修复此问题。

    感谢您的帮助。我已经实施了您建议的更改,损失有所减少。之所以我觉得只能使用两个节点层,而只能使用两个层,是因为在我得到一些好的结果后,我需要手工操作。我指的是用excel表格或类似的东西,所有的数字都是可见的,我可以用相反的方式理解正在发生的事情。感谢you@ArmanMojaver我明白了,但是我们通常可以有这种手动再现性,或者说性能——很少两者都有(虽然像这里这样的玩具数据集也可以)。@ArmanMojaver顺便说一句,既然答案解决了你的问题,你介意接受吗?谢谢…您的回答提供了一些改进,但问题尚未解决。我只是没有时间上传我得到的结果。我将暂时不回答这个问题,以防其他人想参与。谢谢。可以说,采纳我的建议本应导致一种全新的局面,现有的局面(如问题所述)现在已经过时。在回答问题之后,从根本上更新问题并不是这样的;相反,我们欢迎你在新的形势下,面对任何新的问题,提出新的问题。现在还不清楚还有什么问题没有解决,毕竟,你确切的问题是“有人能给我指出正确的方向吗?”这一点可以说已经实现了。