Модель нейронной сети не повышает точность. Проблема масштабирования или проблема модели? - PullRequest
2 голосов
/ 24 марта 2020

Я пытаюсь создать простую нейронную сеть, чтобы посмотреть, как она работает.

Эквивалент второй степени имеет вид (x-x1) * (x-x2) = 0, и если вы его переставите, он станет ax ^ 2 + bx + c = 0, где a = 1 , b = -2 * x1 * x2, c = x1 * x2. Я хочу создать нейронную сеть, где входы (а, б), а выходы (х1, х2).

Для этого я создал 2 функции, которые создают данные и сохраняют их в матрицах с именем 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 

Может ли кто-нибудь указать мне на право Направление?

Спасибо

1 Ответ

2 голосов
/ 24 марта 2020

Есть несколько проблем с вашим кодом:

  1. Вы используете точность для задачи регрессия , которая не имеет смысла (точность применима только к классификация проблем). Вы должны контролировать производительность вашей модели только с потерей, здесь MSE (по той же причине, вам не нужно импортировать confusion_matrix или categorical_crossentropy).

  2. Вы по ошибке используйте sigmoid активацию для вашего последнего слоя; в регрессионных задачах это должно быть linear (или оставить пустым, поскольку linear является активацией Keras по умолчанию).

  3. Вы должны использовать активацию relu для промежуточных слоев не sigmoid.

  4. Ваша модель выглядит слишком простой, и неясно, почему вы вынуждены просто использовать двухузловые слои (вы должны не , за исключением, конечно, для вывод один).

В общем, вот отправная точка:

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() (вы пропускаете два ярлыка вместо образцов) - обязательно исправьте это тоже.

...