#python #tensorflow #keras #neural-network #tf.keras
Вопрос:
Я пишу здесь, надеясь решить проблему, которая возникла у меня с нейронной сетью, разработанной на python с использованием keras. Я новичок в мире глубокого обучения, изучаю теорию и пытаюсь реализовать некоторый код.
Цель: разработать сеть, которая позволяет мне распознавать 2 разных слова (команды), которые я произношу [в будущем они будут использоваться для управления небольшим роботом-автомобилем]. На самом деле, я хочу только добиться идентификации «да/нет».
Реализация: я пытаюсь реализовать сеть двоичной классификации. Вот мой код:
- я использовал librosa для преобразования обучающего и тестового набора аудио в матричный ввод с 193 функциями
- чтобы устранить возможность проблемы пакетной нормализации, я масштабировал данные с помощью пакета предварительной обработки (я видел, что это эффективно улучшает и влияет на производительность): я замечаю, что если я не нормализую обучение, тестирование и анализ данных с помощью одной и той же нормализации, это не работает
- Я читал, что keras принимает в качестве входных данных как массив numpy, так и массив numpy, поэтому я преобразую целевой y в numpy
- я приступаю к построению модели, обучению и тестированию (я знаю, что использую методы, которые на самом деле устарели).
- Я использую один звук для выполнения другого текста, потому что в будущем я предполагаю, что сеть будет получать (и оценивать) один звук за раз
import support.myutilities as utilNP
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import StandardScaler
#READ AND BUILD INPUT
X_si = utilNP.np_array_features_dir('DIRECTORY PATH')
X_no = utilNP.np_array_features_dir('DIRECTORY PATH')
X_tot = np.concatenate((X_si, X_no), axis=0)
# Scale the train set
scaler = StandardScaler().fit(X_tot)
X_train = scaler.transform(X_tot)
#0=si 1=no
y=[]
for i in range(len(X_si)):
y.append(0)
for i in range(len(X_no)):
y.append(1)
Y=np.array(y)
#READ AND BUIL TEST TRAINING SET
X_si_test = utilNP.np_array_features_dir('DIRECTORY PATH')
X_no_test = utilNP.np_array_features_dir('DIRECTORY PATH')
X_tot_test = np.concatenate((X_si_test, X_no_test), axis=0)
# Scale the test set
scaler2 = StandardScaler().fit(X_tot_test)
X_test = scaler2.transform(X_tot_test)
y_test=[]
for i in range(len(X_si_test)):
y_test.append(0)
for i in range(len(X_no_test)):
y_test.append(1)
Y_test=np.array(y_test)
###### BUILD MODEL
model = Sequential()
model.add(Dense(100, input_dim=len(X_tot[0]), activation='relu')) #193 features as input
model.add(Dense(50, activation='relu'))
model.add(Dense(1, activation='sigmoid')) #1 output
# compile the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(X_train, Y, epochs=300, verbose=1)
#test
scores = model.evaluate(X_test, Y_test, verbose=0)
print('Accuracy on training data: {}% n Error on training data: {}'.format(scores[1], 1 - scores[1]))
predictions = model.predict(X_test)
for i in range(len(predictions)):
print('=> %d (expected %d)' % (predictions[i], y_test[i]))
#TEST WITH A PRACTICAL NEW SOUND: supposed acquired
file_name = 'PATH AUDIO'
X = utilNP.np_array_features(file_name)
#Normalize according to input data
X_analyze = scaler2.transform(X)
y_analysis=[]
y_analysis.append(1) # i supposed that the audio is the one that return 1
pred_test= model.predict(X_analyze)
scores2 = model.evaluate(X_analyze, np.array(y_analysis), verbose=0)
print('Accuracy on test data: {}% n Error on test data: {}'.format(scores2[1], 1 - scores2[1]))
Проблемы:
- точность достигает 100% в очень немногие эпохи. Реально, что обучающий набор не так велик (всего 300 выборок и 40 для тестирования), но этот результат явно неверен. Кстати, если я использую количество эпох > 100, сеть работает хорошо и хорошо выполняет свою работу (практически результат одного исследования, признан)
- если количество эпох невелико (например, 20), точность все равно достигает 100% после нескольких итераций, но на обучение влияет ошибка в результатах (почему они не распознаются?) и окончательный прогноз неверен. Это ненормально: я ожидал бы, что низкая точность оправдает неправильный ответ, но она остается на уровне 100%
- Я тестирую много решений, переходя от настройки «обучение=Истина/Ложь», и читаю много ответов здесь и в stack exchange, но я ничего не решил.
Что-то не так в моем коде? Заранее спасибо.
Комментарии:
1. Что заставляет вас думать, что 100% — ная точность «явно неверна»?
2. Либо это означает, что ваш код перетренирован, либо все в полном порядке. Это такая простая задача, что сети не потребуется слишком много времени, чтобы изучить ее должным образом. Я не вижу большой проблемы в том, что это происходит
3. Спасибо за ответ. Я думаю, что что-то было не так, потому что с уменьшением эпох точность все еще остается 100%, но тренировочный тест не проходит. Не точность бы шла на тренировку в результате Пример: для эпох = 10 результат: Точность обучающих данных: 1,0% Ошибка в обучающих данных: 0,0 => 0 (ожидаемый 0) … =>> 0 (ожидаемый 0) =>>> 0 (ожидаемый 0) = > > > 0 (ожидаемый 1) … =>>>> 0 (ожидаемый 1), но результат неверен. Я не понимаю, почему там написано 100%, но они принимают неправильное решение.
4. Каково распределение ответов » НЕТ » и » ДА » в вашем наборе данных? Если набор данных не сбалансирован, это может легко привести к переобучению. Еще одна вещь, которую вы можете попробовать, — это уменьшить количество нейронов в каждом слое. Я не знаю, сколько образцов у вас в наборе данных, но может быть так, что ваша модель слишком сложна, а набор данных имеет небольшую дисперсию
5. Набор данных насчитывает 300 выборок и 40 тестов. Да=160, Нет=140, для тестирования 20-20. Я пытаюсь уменьшить нейрон: спасибо