Добавление постоянного значения в промежуточные слои cnn - PullRequest
0 голосов
/ 23 января 2019

Я хочу добавить постоянную матрицу к выходному слою промежуточного слоя в cnn во время обучения, а затем отправить его на следующий уровень. Я поместил свой код здесь и использую функции Add, но это приводит к ошибке. что я должен делать? использование Add - это верное решение или нет?

from keras.layers import Input, Concatenate, GaussianNoise
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

w_main = np.random.randint(2,size=(1,4,4,1))
w_main=w_main.astype(np.float32)
w_expand=np.zeros((1,28,28,1),dtype='float32')
w_expand[:,0:4,0:4]=w_main
w_expand.reshape(1,28,28,1)
#-----------------------encoder------------------------------------------------
#------------------------------------------------------------------------------

image = Input((28, 28, 1))
conv1 = Conv2D(8, (5, 5), activation='relu', padding='same')(image)
conv2 = Conv2D(4, (3, 3), activation='relu', padding='same')(conv1)
conv3 = Conv2D(2, (3, 3), activation='relu', padding='same')(conv2)
encoded =  Conv2D(1, (3, 3), activation='relu', padding='same')(conv3)

encoder=Model(inputs=image, outputs=encoded)
encoder.summary()
#-----------------------adding w---------------------------------------
encoded_merged=Kr.layers.Add(encoded,w_expand)

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

#encoded_merged = Input((28, 28, 2))
x = Conv2D(2, (5, 5), activation='relu', padding='same')(encoded_merged)
x = Conv2D(4, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu',padding='same')(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same', name='decoder_output')(x) 

decoder=Model(inputs=encoded_merged, outputs=decoded)
decoder.summary()

Произошла ошибка:

TypeError: init () принимает 1 позиционный аргумент, но 3 задано Я спешу. пожалуйста, помогите мне с этим.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вам нужно будет обернуть вашу константу в слой, который будет возвращать тензор, в настоящее время у вас есть массив numpy, который не может быть добавлен в тензор:

add_const = Kr.layers.Lambda(lambda x: x + Kr.backend.constant(w_expand))

И используйте его со слоем, который выхочу добавить его к:

encoded_merged = add_const(encoded)
0 голосов
/ 23 января 2019

Вы используете слой неправильно, это правильный путь:

encoded_merged=Kr.layers.Add()([encoded,w_expand])
...