моя точность модели нейронной сети всегда составляет 50% - PullRequest
0 голосов
/ 16 апреля 2020

После тренировки моей модели точность теста всегда составляет 50%. Что не так в моем коде ниже?

0 ~ 4000 данных нормального сигнала, 4001 ~ 6000 данных аномального сигнала для двоичной классификации. размерность данных (6000, 8000)

data = np.load('data.npy') 
label = []
for i in range(len(data)): ## labeling
    if i < 4000:
        label.append(1)
    else:
        label.append(0)

label = np.array(label)

## each 100 data was extracted for test
test_data =  np.concatenate((data[:100], data[4001:4101]), axis=0)  
test_label = np.concatenate((label[:100], label[4001:4101]), axis=0)
train_data = np.concatenate((data[100:4001], data[4101:]))
train_label = np.concatenate((label[100:4001], label[4101:]))

## data shuffleing
tmp = [[x,y]for x, y in zip(train_data, train_label)]
tmp1 = [[x,y]for x, y in zip(test_data, test_label)]
random.shuffle(tmp)
random.shuffle(tmp1) 
train_data = [n[0] for n in tmp]
train_label = [n[1] for n in tmp]
train_data = np.array(train_data)
train_label = np.array(train_label)
teet_data = [n[0] for n in tmp1]
test_label = [n[1] for n in tmp1]
test_data = np.array(test_data)
test_label = np.array(test_label)

## scaling
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)

train_data -= mean
train_data /= std
test_data -= mean
test_data /= std

model = models.Sequential()
model.add(layers.Dense(128, activation='relu', input_shape=(8000,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='Adam',
             loss='binary_crossentropy',
             metrics=['acc'])

history = model.fit(train_data,
                    train_label,
                    epochs=60,
                    batch_size=128,
                    shuffle=True,
                    validation_split=0.2)

кривая потерь

enter image description here

loss, acc = model.evaluate(test_data, test_label)

200/200 [=== ===========================] - 0 с 140 мкс / шаг

print(acc)

0,5

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

ваша модель слишком слабая / маленькая для такого количества функций. просто на первом уровне вы уничтожаете всю информацию, преобразовывая 8000 функций в 8 !! используйте больше юнитов, намного больше, и позвольте ему чему-то научиться, а не разрушать ваш набор данных. Ваша модель не может прогнозировать лучше, чем случайные прямо сейчас.

0 голосов
/ 22 апреля 2020

Вот мои данные сигнала.

import sounddevice as sd
import numpy as np
from math import pi

fs = 4000

n = np.arange(0, 2, 1/fs)

f = 13000 # x 
f1 = 1310 # x1
f2 = 175  # x 2
f3 = 45 # x3
'''
(8000,)
'''

x = np.sin(2*pi*f*n)
x1 = np.sin(2*pi*f1*n)
x2 = np.sin(2*pi*f2*n)
y = np.random.rand(len(x))
x3 = np.sin(2*pi*f3*n)
y = np.random.rand(len(x))

fault =  y*0.2 + (x1+x2 + x3) + 0.15
normal =  y*0.2 +(x1 + x2) +2

y = np.random.rand(len(x))
normal = normal
normal.shape
fault.shape

(8000) *

normal_data=[]
for i in range (4000):
    y = np.random.rand(len(x))
    normal = 2*y*(x1 + x2)
    normal_data.append(normal)

normal_data = np.array(normal_data)
normal_data.shape

(4000, 8000)

fault_data=[]
for i in range (2000):
    y = np.random.rand(len(x))
    fault = 2*y*(x1 + x2)
    fault_data.append(fault)

fault_data = np.array(fault_data)
fault_data.shape

(2000, 8000)

## Final signal data
data = np.concatenate((normal_data, fault_data))
data.shape

(6000, 8000)

0 голосов
/ 18 апреля 2020

Вполне вероятно, что ваша модель предсказывает только один класс для ваших тестовых данных.

Это может быть вызвано вашим подходом масштабирования функций. Вы должны стандартизировать свои тестовые данные из статистики, извлеченной из тренировочного набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...