在学习和操纵网络时如何访问网络中的张量值?

时间:2019-03-26 20:50:09

标签: python tensorflow keras tensor

我在不同的帖子中问了这个问题,但是我找不到正确的答案:(我有一个自动编码器,将代码放在这里:

wt_random=np.random.randint(2, size=(49999,4,4))
w_expand=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_expand=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
w_test=w_test.reshape((1,4,4,1))

wtm=Input((4,4,1))
        image = Input((28, 28, 1))
        conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e')(image)
        conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e')(conv1)
        conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e')(conv2)
        BN=BatchNormalization()(conv3)
        encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I')(BN)

       rep=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]))
a_1 = Kr.layers.Lambda(lambda x: x[:, 1, 1, :])(wtm)

a=rep(Kr.layers.Reshape([1,1,1])(a_1))

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


    #-----------------------decoder------------------------------------------------
    #------------------------------------------------------------------------------
    deconv1 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl1d')(encoded_merged)
    deconv2 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl2d')(deconv1)
    deconv3 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl3d')(deconv2)
    deconv4 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl4d')(deconv3)
    BNd=BatchNormalization()(deconv4)
    #DrO2=Dropout(0.25,name='DrO2')(BNd)

    decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output')(BNd) 
    #model=Model(inputs=image,outputs=decoded)

    model=Model(inputs=[image,wtm],outputs=decoded)

    decoded_noise = GaussianNoise(0.5)(decoded)

    #----------------------w extraction------------------------------------
    convw1 = Conv2D(64, (5,5), activation='relu', name='conl1w')(decoded_noise)#24
    convw2 = Conv2D(64, (5,5), activation='relu', name='convl2w')(convw1)#20
    #Avw1=AveragePooling2D(pool_size=(2,2))(convw2)
    convw3 = Conv2D(64, (5,5), activation='relu' ,name='conl3w')(convw2)#16
    convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
    #Avw2=AveragePooling2D(pool_size=(2,2))(convw4)
    convw5 = Conv2D(64, (5,5), activation='relu', name='conl5w')(convw4)#8
    convw6 = Conv2D(64, (5,5), activation='relu', name='conl6w')(convw5)#4
    convw7 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl7w',dilation_rate=(2,2))(convw6)#4
    convw8 = Conv2D(64, (5,5), activation='relu', padding='same',name='conl8w',dilation_rate=(2,2))(convw7)#4
    convw9 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl9w',dilation_rate=(2,2))(convw8)#4
    convw10 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl10w',dilation_rate=(2,2))(convw9)#4
    BNed=BatchNormalization()(convw10)
    pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(BNed)  

    w_extraction=Model(inputs=[image,wtm],outputs=[decoded,pred_w])

    w_extraction.summary()
(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------------------------------
opt=SGD(momentum=0.99)
w_extraction.compile(optimizer='adam', loss={'decoder_output':'mse','reconstructed_W':'binary_crossentropy'}, loss_weights={'decoder_output': 0.2, 'reconstructed_W': 1.0},metrics=['mae'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=40)
#rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=20, min_delta=1E-4, verbose=1)
mc = ModelCheckpoint('best_model_5x5F_dp_gn.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)
history=w_extraction.fit([x_train,w_expand], [x_train,w_expand],
          epochs=1,
          batch_size=64, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='E:concatnatenetwork', histogram_freq=0, write_graph=False),es,mc])

我有一个输入wtm=Input(4,4,1),其张量的形状为(?,4,4,1),我知道第一个索引是批号,其他索引是输入图像的大小及其数量渠道。现在,我需要检测索引(i,j)中输入图像的每个值,然后生成具有该值和新形状(?,28,28,1)的新张量。在其他帖子中建议使用此代码:

rep=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]), name='rep1')
a_1 = Kr.layers.Lambda(lambda x: x[:, 1, 1, :])(wtm)
a=rep(Kr.layers.Reshape([1,1,1])(a_1))

它似乎正常工作,但是当我测试网络并看到具有不同索引的rep的输出时,尽管wtm的随机值分别为0和1,但它显示的张量值为0。代码:

layer_name = 'rep1'
intermediate_layer_model = Model(inputs=watermark_extraction.input,outputs=watermark_extraction.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict([x_test[8000:8001],w_test])
fig = plt.figure(figsize=(20, 20))

rows = 8
columns = 8

first = intermediate_output

for i in range(1, columns*rows +1):
    img = intermediate_output[0,:,:,i-1]
    fig.add_subplot(rows, columns, i)
    plt.imshow(img, interpolation='nearest',cmap='gray')
    plt.axis('off')
plt.show()

请您告诉我问题出在哪里,我该如何解决?我搜索了一个多星期,但找不到答案,我真的需要您的帮助。如果您有任何建议,请告诉我。我以前说过的话有可能吗?

0 个答案:

没有答案