Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在学习期间向自动编码器中的解码器添加数据 我想用Keras实现一个自动编码器,这个结构是一个大网络,在自动编码器的输出上进行一些操作,然后我们应该考虑两个损失,我附加了一个显示我提出的结构的图像。链接如下_Python_Tensorflow_Keras_Keras Layer_Tensor - Fatal编程技术网

Python 在学习期间向自动编码器中的解码器添加数据 我想用Keras实现一个自动编码器,这个结构是一个大网络,在自动编码器的输出上进行一些操作,然后我们应该考虑两个损失,我附加了一个显示我提出的结构的图像。链接如下

Python 在学习期间向自动编码器中的解码器添加数据 我想用Keras实现一个自动编码器,这个结构是一个大网络,在自动编码器的输出上进行一些操作,然后我们应该考虑两个损失,我附加了一个显示我提出的结构的图像。链接如下,python,tensorflow,keras,keras-layer,tensor,Python,Tensorflow,Keras,Keras Layer,Tensor,w与输入图像大小相同,在这个自动编码器中,我不使用最大池,因此每个相位的输出与输入图像大小相同。我想将w和潜在空间表示发送到解码器部分,然后在向解码器输出添加噪声后,尝试使用网络的第三部分提取w。所以我需要我的损失函数考虑输入图像和潜在空间表示之间的差异,以及w和w'之间的差异。但我在执行方面有几个问题。我不知道如何将w添加到解码器输出,因为使用了这行“merge_encoded_w=cv2.merge(encoded,w) “产生错误且不起作用。根据我的需要与否,我不确定我的损失函数是否为真?

w与输入图像大小相同,在这个自动编码器中,我不使用最大池,因此每个相位的输出与输入图像大小相同。我想将w和潜在空间表示发送到解码器部分,然后在向解码器输出添加噪声后,尝试使用网络的第三部分提取w。所以我需要我的损失函数考虑输入图像和潜在空间表示之间的差异,以及w和w'之间的差异。但我在执行方面有几个问题。我不知道如何将w添加到解码器输出,因为使用了这行“merge_encoded_w=cv2.merge(encoded,w) “产生错误且不起作用。根据我的需要与否,我不确定我的损失函数是否为真?请帮助我处理此代码。我是一个初学者,找到解决方案对我来说很难。我以前问过这个问题,但没人帮我。请引导我。我的代码如下:

from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, Activation,UpSampling2D,Conv2D, MaxPooling2D, GaussianNoise
from keras.models import Model
from keras.optimizers import SGD
from keras.datasets import mnist
from keras import regularizers
from keras import backend as K
import keras as k
import numpy as np
import matplotlib.pyplot as plt
import cv2
from time import time
from keras.callbacks import TensorBoard
# Embedding phase
##encoder

w=np.random.random((1, 28,28))
input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(8, (5, 5), activation='relu', padding='same')(input_img)
#x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(4, (3, 3), activation='relu', padding='same')(x)
#x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(2, (3, 3), activation='relu', padding='same')(x)
encoded = Conv2D(1, (3, 3), activation='relu', padding='same')(x)
merge_encoded_w=cv2.merge(encoded,w)
#
#decoder

x = Conv2D(2, (5, 5), activation='relu', padding='same')(merge_encoded_w)
#x = UpSampling2D((2, 2))(x)
x = Conv2D(4, (3, 3), activation='relu', padding='same')(x)
#x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu',padding='same')(x)
#x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

#Extraction phase
decodedWithNois=k.layers.GaussianNoise(0.5)(decoded)
x = Conv2D(8, (5, 5), activation='relu', padding='same')(decodedWithNois)
#x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(4, (3, 3), activation='relu', padding='same')(x)
#x = MaxPooling2D((2, 2), padding='same')(x)
final_image_watermark = Conv2D(2, (3, 3), activation='relu', padding='same')(x)


autoencoder = Model([input_img,w], [decoded,final_image_watermark(2)])
encoder=Model(input_img,encoded)
autoencoder.compile(optimizer='adadelta', loss=['mean_squared_error','mean_squared_error'],metrics=['accuracy'])
(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))  # adapt this if using `channels_first` image data format
autoencoder.fit(x_train, x_train,
                epochs=5,
                batch_size=128,
                shuffle=True,
                validation_data=(x_validation, x_validation),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

decoded_imgs = autoencoder.predict(x_test)
encoded_imgs=encoder.predict(x_test)

对于这种大型架构,我建议您从小块开始构建,然后将这些小块放在一起。首先,编码器部分。它接收大小为
(28,28,1)
的图像,并返回形状为
(28,28,1)
的编码图像

形状转变符合理论。
接下来,解码器部分与另一个数组shape
(28,28,2)
进行编码合并,并最终恢复原始图像shape(28,28,1)

然后,模型也尝试恢复W阵列。输入是重建图像加上噪声(形状是
(28,28,1)

有了手头上的所有部件,将部件组合起来构建整个模型并不难。请注意,上面构建的模型可以像层一样使用

def put_together(encoder, decoder, w_predictor):
    image = Input((28, 28, 1))
    w = Input((28, 28, 1))
    encoded = encoder(image)

    encoded_merged = Concatenate(axis=3)([encoded, w])
    decoded = decoder(encoded_merged)

    decoded_noise = GaussianNoise(0.5)(decoded)
    pred_w = w_predictor(decoded_noise)

    return Model(inputs=[image, w], outputs=[decoded, pred_w])

model = put_together(encoder, decoder, w_predictor)
model.summary()

#__________________________________________________________________________________________________
#Layer (type)                    Output Shape         Param #     Connected to                     
#==================================================================================================
#input_4 (InputLayer)            (None, 28, 28, 1)    0                                            
#__________________________________________________________________________________________________
#model_1 (Model)                 (None, 28, 28, 1)    593         input_4[0][0]                    
#__________________________________________________________________________________________________
#input_5 (InputLayer)            (None, 28, 28, 1)    0                                            
#__________________________________________________________________________________________________
#concatenate_1 (Concatenate)     (None, 28, 28, 2)    0           model_1[1][0]                    
#                                                                 input_5[0][0]                    
#__________________________________________________________________________________________________
#model_2 (Model)                 (None, 28, 28, 1)    547         concatenate_1[0][0]              
#__________________________________________________________________________________________________
#gaussian_noise_1 (GaussianNoise (None, 28, 28, 1)    0           model_2[1][0]                    
#__________________________________________________________________________________________________
#model_3 (Model)                 (None, 28, 28, 1)    537         gaussian_noise_1[0][0]           
#==================================================================================================
#Total params: 1,677
#Trainable params: 1,677
#Non-trainable params: 0
#__________________________________________________________________________________________________
下面的代码使用虚拟数据训练模型。当然,只要形状匹配,您就可以使用自己的

import numpy as np

# dummy data
images = np.random.random((1000, 28, 28, 1))
w = np.random.lognormal(size=(1000, 28, 28, 1))

# is accuracy sensible metric for this model?
model.compile(optimizer='adadelta', loss='mse', metrics=['accuracy'])
model.fit([images, w], [images, w], batch_size=64, epochs=5)
编辑下面的内容


我对你放在这里的代码有一些疑问。在make#w#predictor中,您说:“重新考虑激活(w为正?)#应该是filter=1以匹配w”这是什么意思?W是一个包含0和1的数组。如果我要更改此部件的代码,“重新考虑激活”是什么意思

relu
激活返回[0,+inf]中的正数,因此如果
W
采用不同的值集,则可能不是一个好的选择。典型的选择如下

  • W
    可以是正数和负数:“线性”激活
  • W
    in[0,1]:“sigmoid”激活
  • W
    in[-1,1]:“tanh”激活
  • W
    是正数:“relu”激活
在原始代码中,您有:

w=np.random.random((1, 28, 28))
它的值介于0和1之间。所以我建议从“relu”切换到“sigmoid”。但我没有在我的代码示例中进行更改,因为我不确定这是否是有意的

你说过滤器应该是1,这意味着将(3,3)更改为(1,1)?我很抱歉这些问题。但我是一个初学者,我找不到你所说的其中一些。你能帮我并完整地解释一下吗

我在原问题中提到这一行:

final_image_watermark = Conv2D(2, (3, 3), activation='relu', padding='same')(x)
如果我理解正确,这将在所附图像中定义
W'
,该图像应预测
W
,其大小为
(28,28,1)
。然后
Conv2D
的第一个参数应为1。否则,输出形状将变为
(28,28,2)
。我在我的代码示例中做了此更改,因为否则它会发出形状不匹配错误:

pred_w = Conv2D(1, (3, 3), activation='relu', padding='same')(x)

我认为
(3,3)
keras中的部分,
内核大小
也可以。

是您输入的数据还是随机数组?它可以是在学习过程中添加的随机数组。您所说的这两件事之间有什么区别?只是想知道为什么要添加随机数组并恢复它。编程上的区别是keras需要这样做所有数据在第一维度上都有相同的存储。无论如何,我不认为您可以使用
cv2.merge
来合并张量。使用代替。如果w是一个数据馈送到网络,我应该怎么做?我想将w和编码输出作为28X28X2过滤器发送到解码部分。有可能吗?concatenate为我做这件事吗?当我使用concatenate时它会产生这样的错误“层的所有输入都应该是张量”非常感谢您的回复。这有助于我和我学习如何编写代码。但我还有一些其他问题。我认为此损失函数仅使用w来计算精度。这是真的吗?我需要两个损失函数。输入图像和解码器输出之间,以及w和w之间。如何编写此混合损失函数?它同时使用这两个函数。对于多输出模型,keras计算每个模型的损失,并将平均值作为总损失。我对您在这里输入的代码有一些疑问。在make#w#predictor中,您说:“#重新考虑激活(w为正?)#应该是filter=1以匹配w”这意味着什么?w是一个包含0和1的数组。这意味着什么“重新考虑激活”我应该更改此部件的代码吗?您说过过滤器应为1,这意味着将(3,3)更改为(1,1)?对于这些问题,我很抱歉。但我是一个初学者,我找不到你所说的一些问题。你能帮我完整地解释一下吗?@maede我为这个评论添加了答案。你可以这样做,但是如果你对两个输出都使用相同的损失函数,你可以简单地给出
loss='mse'
。然后keras通过e相同的损失函数。
w=np.random.random((1, 28, 28))
final_image_watermark = Conv2D(2, (3, 3), activation='relu', padding='same')(x)
pred_w = Conv2D(1, (3, 3), activation='relu', padding='same')(x)