Как я могу рассчитать BER в кератах? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть авто-кодер, и у него есть два выхода, и я хочу вычислить BER между входом и выходом, но у меня есть несколько вопросов.1. для расчета есть ли в Python какая-либо функция для этого?например, в Matlab у нас есть biterr или psnr для сравнения изображений по ошибке или незаметности.у нас есть такие же функции в Matlab?2. можем ли мы использовать эти параметры в качестве функции потерь?например, я использую mse как функцию потерь.Можно ли использовать psnr вместо него?как я могу это сделать?Я прикрепил свой код здесь.

#-----------------------including related inputs-------------------------------



 from keras.layers import Input, Concatenate, GaussianNoise,Dropout
    from keras.layers import Conv2D
    from keras.models import Model
    from keras.datasets import mnist
    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
    import numpy as np
    import pylab as pl
    import matplotlib.cm as cm
    import keract
    from tensorflow.python.keras.layers import Lambda;

    #-----------------building w train---------------------------------------------
    w_expand=np.zeros((49999,28,28),dtype='float32')
wv_expand=np.zeros((9999,28,28),dtype='float32')
wt_random=np.random.randint(2, size=(49999,4,4))
wt_random=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_random=wv_random.astype(np.float32)
w_expand[:,:4,:4]=wt_random
wv_expand[:,:4,:4]=wv_random
x,y,z=w_expand.shape
w_expand=w_expand.reshape((x,y,z,1))
x,y,z=wv_expand.shape
wv_expand=wv_expand.reshape((x,y,z,1))


#-----------------building w test---------------------------------------------
w_test = np.random.randint(2,size=(1,4,4))
w_test=w_test.astype(np.float32)
wt_expand=np.zeros((1,28,28),dtype='float32')
wt_expand[:,0:4,0:4]=w_test
wt_expand=wt_expand.reshape((1,28,28,1))
#wt_expand=np.repeat(wt_expand,10000,0)

#-----------------------encoder------------------------------------------------
#------------------------------------------------------------------------------
wtm=Input((28,28,1))
image = Input((28, 28, 1))
conv1 = Conv2D(64, (3, 3), activation='relu', padding='same', name='convl1e')(image)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same', name='convl2e')(conv1)
conv3 = Conv2D(64, (3, 3), activation='relu', 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')(BN)
encoded =  Conv2D(1, (3, 3), activation='relu', padding='same',name='encoded_I')(DrO1)


#-----------------------adding watermark---------------------------------------

add_const = Kr.layers.Lambda(lambda x: x[0] + x[1])
encoded_merged = add_const([encoded,wtm])


#-----------------------decoder------------------------------------------------
#------------------------------------------------------------------------------

deconv1 = Conv2D(64, (3, 3), activation='elu', padding='same', name='convl1d')(encoded_merged)
deconv2 = Conv2D(64, (3, 3), activation='elu', padding='same', name='convl2d')(deconv1)
deconv3 = Conv2D(64, (3, 3), activation='elu',padding='same', name='convl3d')(deconv2)
BNd=BatchNormalization()(deconv3)

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same', name='decoder_output')(DrO2) 


model=Model(inputs=[image,wtm],outputs=decoded)
#----------------------w extraction------------------------------------
convw1 = Conv2D(64, (3,3), activation='elu', padding='same', name='conl1w')(decoded)
convw2 = Conv2D(64, (3, 3), activation='elu', padding='same', name='convl2w')(convw1)
convw3 = Conv2D(64, (3, 3), activation='elu', padding='same', name='conl3w')(convw2)
BNed=BatchNormalization()(convw3)
DrO3=Dropout(0.25, name='DrO3')(BNed)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W')(DrO3)  
# reconsider activation (is W positive?)
# should be filter=1 to match W
watermark_extraction=Model(inputs=[image,wtm],outputs=[decoded,pred_w])

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_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?
watermark_extraction.compile(optimizer='SGD', loss={'decoder_output':'mse','reconstructed_W':'binary_crossentropy'}, metrics=['mae'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_delta=1E-7, verbose=1)
history=watermark_extraction.fit([x_train,w_expand], [x_train,w_expand],
          epochs=1000,
          batch_size=32, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='E:/tmp/AutewithW200', histogram_freq=0, write_graph=False),rlrp,es])
model.summary()
...