как повысить точность автоэнкодера? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть автоэнкодер, и я проверил точность своей модели с помощью различных решений, таких как изменение количества слоев конвоя и увеличение их, добавление или удаление нормализации партии, изменение функции активации, но точность для всех из них схожа иэто не имеет никакого улучшения, что странно.Я запутался, потому что я думаю, что точность для этих разных решений должна быть разной, но она составляет 0,8156.не могли бы вы помочь мне в чем проблема?Я также тренирую его с 10000 эпохами, но результат одинаков для 50 эпох!мой код неправильный или он не может стать лучше ?! График точности

Я также не уверен, работает ли спад скорости обучения или нет ?!Я тоже поставил свой код здесь:

from keras.layers import Input, Concatenate, GaussianNoise,Dropout,BatchNormalization
from keras.layers import Conv2D
from keras.models import Model
from keras.datasets import mnist,cifar10
from keras.callbacks import TensorBoard
from keras import backend as K
from keras import layers
import matplotlib.pyplot as plt
import tensorflow as tf
import keras as Kr
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import EarlyStopping
import numpy as np
import pylab as pl
import matplotlib.cm as cm
import keract
from matplotlib import pyplot
from keras import optimizers
from keras import regularizers
from tensorflow.python.keras.layers import Lambda;

image = Input((28, 28, 1))
conv1 = Conv2D(16, (3, 3), activation='elu', padding='same', name='convl1e')(image)
conv2 = Conv2D(32, (3, 3), activation='elu', padding='same', name='convl2e')(conv1)
conv3 = Conv2D(16, (3, 3), activation='elu', padding='same', name='convl3e')(conv2)
#conv3 = Conv2D(8, (3, 3), activation='relu', padding='same', name='convl3e', kernel_initializer='Orthogonal',bias_initializer='glorot_uniform')(conv2)
BN=BatchNormalization()(conv3)
#DrO1=Dropout(0.25,name='Dro1')(conv3)
DrO1=Dropout(0.25,name='Dro1')(BN)
encoded =  Conv2D(1, (3, 3), activation='elu', padding='same',name='encoded_I')(DrO1)



#-----------------------decoder------------------------------------------------
#------------------------------------------------------------------------------
deconv1 = Conv2D(16, (3, 3), activation='elu', padding='same', name='convl1d')(encoded)
deconv2 = Conv2D(32, (3, 3), activation='elu', padding='same', name='convl2d')(deconv1)
deconv3 = Conv2D(16, (3, 3), activation='elu',padding='same', name='convl3d')(deconv2)
BNd=BatchNormalization()(deconv3)
DrO2=Dropout(0.25,name='DrO2')(BNd)
#DrO2=Dropout(0.5,name='DrO2')(deconv3)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same', name='decoder_output')(DrO2) 
#model=Model(inputs=[image,wtm],outputs=decoded)

#--------------------------------adding noise----------------------------------
#decoded_noise = GaussianNoise(0.5)(decoded)


watermark_extraction=Model(inputs=image,outputs=decoded)

watermark_extraction.summary()
#----------------------training the model--------------------------------------
#------------------------------------------------------------------------------
#----------------------Data preparation----------------------------------------

(x_train, _), (x_test, _) = mnist.load_data()
x_validation=x_train[1:10000,:,:]
x_train=x_train[10001:60000,:,:]
#(x_train, _), (x_test, _) = cifar10.load_data()
#x_validation=x_train[1:10000,:,:]
#x_train=x_train[10001:60000,:,:]
#
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_validation = x_validation.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_validation = np.reshape(x_validation, (len(x_validation), 28, 28, 1))

#---------------------compile and train the model------------------------------
# is accuracy sensible metric for this model?
learning_rate = 0.1
decay_rate = learning_rate / 50
opt = optimizers.SGD(lr=learning_rate, momentum=0.9, decay=decay_rate, nesterov=False)

watermark_extraction.compile(optimizer=opt, loss=['mse'], metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=20)
#rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_delta=1E-7, verbose=1)
history=watermark_extraction.fit(x_train, x_train,
          epochs=50,
          batch_size=32, 
          validation_data=(x_validation, x_validation),
          callbacks=[TensorBoard(log_dir='E:/output of tensorboard', histogram_freq=0, write_graph=False),es])
watermark_extraction.summary()
#--------------------visuallize the output layers------------------------------
#_, train_acc = watermark_extraction.evaluate(x_train, x_train)
#_, test_acc = watermark_extraction.evaluate([x_test[5000:5001],wt_expand], [x_test[5000:5001],wt_expand])
#print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
## plot loss learning curves
pyplot.subplot(211)
pyplot.title('MSE Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='validation')
pyplot.legend()

pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['acc'], label='train')
pyplot.plot(history.history['val_acc'], label='test')
pyplot.legend()
pyplot.show

1 Ответ

0 голосов
/ 12 февраля 2019

Поскольку вы заявили, что вы новичок, я постараюсь построить снизу вверх и постараться как можно больше связать ваш код с этим объяснением.

Часть 1 Автоэнкодеры состоят из двух частей (кодеры и декодеры).Автоэнкодеры уменьшают количество переменных, необходимых для хранения информации, и декодеры пытаются вернуть эту информацию из сжатой формы.(Обратите внимание, что автоэнкодеры не используются в реальных задачах сжатия данных из-за их неопределенности и их зависимости от данных).

Теперь В вашем коде вы сохраняете padding таким же.

conv1 = Conv2D(16, (3, 3), activation='elu', padding='same', name='convl1e')(image)

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

Часть 2 Теперь перейдем к обучению алгоритма

history=watermark_extraction.fit(x_train, x_train,
          epochs=50,
          batch_size=32, 
          validation_data=(x_validation, x_validation),
          callbacks=[TensorBoard(log_dir='E:/PhD/thesis/deepwatermark/journal code/autoencoder_watermark/11-2-2019/output of tensorboard', histogram_freq=0, write_graph=False),es])

Из этого выражения / утверждения/ строка кода Я пришел к выводу, что вы хотите сгенерировать обратно то же изображение, которое вы поместили в свой код, теперь, поскольку изображение хранится в том же количестве переменных, ваша модель просто должна передавать одно и то же изображение на каждый шаг безизменяя что-либо в изображении, это стимулирует вашу модель оптимизировать каждый параметр фильтра до 1.

часть 3 Теперь наступает самый большой гвоздь в гробу, вы реализовали выпадающий слой, сначала выследует НИКОГДА Реализация выпадения на сверточном уровне. Эта ссылка объясняет, почему, и в ней обсуждаются различные идеи, которые, я думаю, если вы новичок, вы должны проверить. Теперь давайте посмотрим, почему способ использования Dropout действительно плох.Как уже объяснялось, для вашей модели лучше всего подойдут все параметры в фильтрах, которые изучают значение 1. Теперь здесь происходит то, что вы принудительно отключили некоторые из этих фильтров, что не делает ничего, кроме отключения некоторых фильтров, как обсуждалосьв этой статье все, что это делает, это уменьшает интенсивность ваших изображений в следующем слое. (Так как фильтры CNN принимают среднее значение по всем входным каналам)

DrO2=Dropout(0.25,name='DrO2')(BNd)

Part 4 Это простонемного советов, а не то, что будет источником каких-либо проблем BNd=BatchNormalization()(deconv3)

Здесь вы попытались нормализовать данные в пакете, нормализация данных чрезвычайно важна в большинстве случаев, как вы, возможно, знаетене позволяет одному объекту диктовать модель, и каждый объект получает равное право голоса в модели, но в данных изображения каждая точка уже масштабируется от нуля до 255, поэтому использование нормализации для масштабирования от 0 до 1 не добавляет значения, просто добавляетненужные вычисления для модели.

Я бы предложил вам подвстаньте по частям, и если что-то непонятно, прокомментируйте ниже, постарайтесь не делать этого с автоэнкодерами, использующими CNN (у них нет никакого реального приложения в любом случае), а скорее используйте его, чтобы понять различные тонкости ConvNets (CNN), причинаЯ решил написать ответ, подобный этому, объясняя части вашей сети, а не код, потому что код, который вы ищете, это просто поиск в Google, если вы заинтригованы этим ответом и хотите знать, как именно работает CNN, проверьте это https://www.youtube.com/watch?v=ArPaAX_PhIs&list=PLkDaE6sCZn6Gl29AoE31iwdVwSG-KnDzF, Если у вас есть какие-либо сомнения и что-либо в этом ответе или даже в комментариях к этим видео ниже.

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