У меня есть авто-кодер, и мне нужно использовать одно значение тензора с формой (4,4,1) и создать новый тензор с формой (28,28,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.repeat(x,28))
a=rep(Kr.layers.Lambda(lambda x:x[1,1])(wtm))
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()
, но он выдает эту ошибку, я думаю, что он повторяет только wtm (1,1) вдоль одной оси, но я не знаю, как я могу решить эту ошибку.не могли бы вы сказать мне, что мне делать?у нас есть что-то вроде заполнения керас?Я видел это в tenorflow, но я не знаю, возможно ли использовать его в керасе?Я ценю любую помощь .:
Трассировка (последний вызов был последним):
Файл "", строка 78, в encoded_merged = add_const ([кодированный, a])
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py", строка 457, в вызов output = self.call (входные данные, ** kwargs)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ Layers \ core.py", строка 687, в функции возврата вызова self.function (входные данные, ** аргументы)
Файл "", строка 77, в add_const = Kr.layers.Lambda (лямбда-x: x [0] + x [1])
Файл "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ ops \ math_ops.py ", строка 866, в двоичном_опереписывающем файле возвращает func (x, y, name = name)
File"D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ ops \ gen_math_ops.py ", строка 301, в добавлении" Добавить ", x = x, y = y, name = name)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ framework \ op_def_library.py", строка 787, в_apply_op_helper op_def = op_def)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ util \ deprecation.py", строка 488, в функции new_func вернуть функцию (*args, ** kwargs)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ framework \ ops.py", строка 3274, в create_op op_def = op_def)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ framework \ ops.py", строка 1792, в init control_input_ops)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ framework \ ops.py", строка 1631, в _create_c_op поднять ValueError (str (e))
ValueError: Размеры должны быть равны, но равны 28 и 4 для 'lambda_28 / add' (op: 'Add') с входными формами: [?, 28,28,1], [4,28,1].