Керас: Точность не меняется, точность проверки остается 0 - PullRequest
0 голосов
/ 03 июня 2019

Моя модель ML должна предсказать, соответствуют ли строки значений пикселей MNIST и значений звуковой волны MFCC одному и тому же номеру (от 0 до 9). У нас есть логический массив с True и False, который указывает, является ли число одинаковым как в строке MNIST, так и в строке Audio.

Мы создаем CNN для изображений MNIST и RNN для аудиофайлов. Выходные данные этой модели объединяются, и последний активированный слой с 1 узлом добавляется с сигмовидной активацией. Требуемый вывод - Истина, если данные относятся к одному и тому же номеру, и Ложь, если данные не относятся к одному и тому же номеру.

Тем не менее, наша точность обучения постоянно колеблется на уровне около 50%, а точность проверки остается на уровне 0,0000 на протяжении многих эпох. Я не могу найти решение для этого. Мой код выглядит так:

inputCNN = tf.keras.Input(shape=(28, 28, 1))
CNN = tf.keras.layers.Conv2D(32, (3,3), activation='relu')(inputCNN)
CNN = tf.keras.layers.MaxPooling2D(2,2)(CNN)
CNN = tf.keras.layers.Conv2D(64, (3,3), activation='relu')(CNN)
CNN = tf.keras.layers.MaxPooling2D(2,2)(CNN)
CNN = tf.keras.layers.Conv2D(64, (3,3), activation='relu')(CNN)
CNN = tf.keras.layers.Flatten()(CNN)
CNN = tf.keras.layers.Dense(64, activation='relu')(CNN)
CNN = tf.keras.layers.Dense(10, activation='softmax')(CNN)
modelCNN = tf.keras.Model(inputs=inputCNN, outputs=CNN)

inputRNN = tf.keras.Input(shape=(93,13))
RNN = tf.keras.layers.LSTM(128,return_sequences=True)(inputRNN)
RNN = tf.keras.layers.Dropout(0.2)(RNN)
RNN = tf.keras.layers.LSTM(128)(RNN)
RNN = tf.keras.layers.Dropout(0.2)(RNN)
RNN = tf.keras.layers.Dense(64, activation='relu')(RNN)
RNN = tf.keras.layers.Dense(10, activation='softmax')(RNN)
modelRNN = tf.keras.Model(inputs=inputRNN, outputs=RNN)
# print(modelRNN.summary())

""" now combine the layers """
combined = tf.keras.layers.concatenate([modelRNN.output, modelCNN.output])

final_dense = tf.keras.layers.Dense(1, activation='sigmoid')(combined)

final_model = tf.keras.Model(inputs=[modelCNN.input, modelRNN.input], outputs=final_dense)

final_model.compile(optimizer='adam',
                    loss='binary_crossentropy',
                    metrics=['accuracy'])



final_model.fit([MNIST_traincopy, RNN_traincopy], booleanarray, validation_split = 0.1, epochs= 20, batch_size=32)

Модель выглядит так:

Layer (type)                 Output Shape              Param #   
=================================================================
input_50 (InputLayer)        (None, 93, 13)            0         
_________________________________________________________________
lstm_26 (LSTM)               (None, 93, 128)           72704     
_________________________________________________________________
dropout_9 (Dropout)          (None, 93, 128)           0         
_________________________________________________________________
lstm_27 (LSTM)               (None, 128)               131584    
_________________________________________________________________
dropout_10 (Dropout)         (None, 128)               0         
_________________________________________________________________
flatten_29 (Flatten)         (None, 128)               0         
_________________________________________________________________
dense_74 (Dense)             (None, 64)                8256      
_________________________________________________________________
dense_75 (Dense)             (None, 10)                650       
=================================================================
Total params: 213,194
Trainable params: 213,194
Non-trainable params: 0

1 Ответ

0 голосов
/ 04 июня 2019

Здравствуйте, причина, вероятно, в том, что вам не дают оптимизатор для вашей модели, например, потомок Стохастического градиента, затухание скорости обучения, моментум или нетстеров, добавьте эту строку кода до final_model.compile, но перед импортом SGD:

from keras.optimizers import SGD

И постройте свой оптимизатор, попробуйте изменить эти параметры, но сохранить значение lr, например, 0,01 / 0,001, на высоком уровне трудно, что ваша модель хорошо обобщается, маленький Lr хорош, но больше времени для обученияВ любом случае:

opt = SGD(lr=0.05, decay=0.05 / epocas, momentum=0.9, nesterov=True)

А затем добавьте оптимизатор вашей модели и удалите 'adam':

optimizer=opt

вот изменение:

final_model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])

И попробуйтеснова тренировать вашу модель .. С наилучшими пожеланиями

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