Классная идея, это редактировать :)

у манипулировать активациями предыдущего слоя с помощью пользовательского слоя keras. Нижний слой просто умножает число на активацию предыдущего уровня.

class myLayer(Layer):

def __init__(self, **kwargs):
    super(myLayer, self).__init__(**kwargs)

def build(self, input_shape):
    self.output_dim = input_shape[0][1]
    super(myLayer, self).build(input_shape)

def call(self, inputs, **kwargs):
    if not isinstance(inputs, list):
        raise ValueError('This layer should be called on a list of inputs.')

    mainInput = inputs[0]
    nInput = inputs[1]

    changed = tf.multiply(mainInput,nInput)

    forTest  = changed
    forTrain = inputs[0]

    return K.in_train_phase(forTrain, forTest)

def compute_output_shape(self, input_shape):
    print(input_shape)
    return (input_shape[0][0], self.output_dim)

Я создаю модель как

inputTensor = Input((5,))
out = Dense(units, input_shape=(5,),activation='relu')(inputTensor)

n = K.placeholder(shape=(1,))
auxInput = Input(tensor=n)
out = myLayer()([out, auxInput])

out = Dense(units, activation='relu')(out)
out = Dense(3, activation='softmax')(out)
model = Model(inputs=[inputTensor, auxInput], outputs=out)   
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics='acc'])

Я получаю эту ошибку при попытке использовать

model.fit(X_train, Y_train, epochs=epochs, verbose=1)

ошибка

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_3' with dtype float and shape [1]

И когда я пытаюсь дать значение заполнителю, как

model.fit([X_train, np.array([3])], Y_train, epochs=epochs, verbose=1)

Я получил:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 arrays but instead got the following list of 2 arrays:

Как мне инициализировать этот заполнитель? Моя цель - использовать model.evaluate для проверки влияния различных значений модели на вывод. Благодарю.

Ответы на вопрос(2)

Вы можете использоватьInput(shape=(1,)) вместо заполнителя. Кроме того, нет необходимости предоставлятьinput_shape вDense посколькуInput(shape=(5,)) уже справляется с этим.

inputTensor = Input(shape=(5,))
out = Dense(units, activation='relu')(inputTensor)

auxInput = Input(shape=(1,))
out = myLayer()([out, auxInput])

Повторите значениеn при подаче его в модель, например:

n = 3
n_array = np.array([n] * len(X_train))
model.fit([X_train, n_array], Y_train,  epochs=1, verbose=1)
Редактировать:

То, что было описано выше, это просто быстрый взлом. Если вы хотите предоставить несколько параметров слоя, вы можете инициализироватьK.variable в конструкторе__init__().

Например,

class myLayer(Layer):
    def __init__(self, default_scale=3.0, default_shift=1.0, **kwargs):
        self.scale = K.variable(default_scale)
        self.shift = K.variable(default_shift)
        super(myLayer, self).__init__(**kwargs)

    def call(self, inputs, **kwargs):
        return K.in_train_phase(inputs, self.scale * inputs + self.shift)

inputTensor = Input(shape=(5,))
out = Dense(units, activation='relu')(inputTensor)
out = myLayer(name='my_layer')(out)
out = Dense(units, activation='relu')(out)
out = Dense(3, activation='softmax')(out)
model = Model(inputs=inputTensor, outputs=out)

Присвоив имя этому слою, будет легче получить переменные и изменить значение на этапе тестирования. Например. ,K.set_value(model.get_layer('my_layer').scale, 5).

 Daniel Möller15 сент. 2017 г., 16:54
Классная идея, это редактировать :)
 Waleed15 сент. 2017 г., 16:08
Приятно. Я постараюсь использовать этот подход.
 Waleed15 сент. 2017 г., 14:18
Да, это сработало. Но в конце концов мне нужно будет передать больше параметров, чем просто n. Затем я хочу сделать больше функциональности в методе вызова myLayer. Как вы думаете, был бы более эффективный способ, чем умножение списка аргументов на len (X_train)?
 Yu-Yang15 сент. 2017 г., 15:53
@ Waleed Конечно, смотрите мое редактирование для более чистого решения.
Решение Вопроса

n.

Вместо использованияplaceholder, использоватьK.variable:

n = K.variable([someInitialValue])
auxInput = Input(tensor=n)

Затем вы можете установить значениеn вот так в любое время, даже после компиляции модели:

K.set_value(n,[anotherValue])

Это позволяет продолжать тренировку без перекомпиляции модели и без прохожденияn кfit метод.

model.fit(X_train,Y_train,....)

Если вы работаете с таким количеством входов, вы можете сделать это:

n = K.variable([val1,val2,val3,val4]) #tensor definition
K.set_value(n,[new1,new2,new3,new4]) #changing values

И внутри слоев, второй вход, который является тензором дляn будет иметь 4 элемента:

n1 = inputs[1][0]
n2 = inputs[1][1]
....
 Waleed15 сент. 2017 г., 16:02
Великий человек! Большое спасибо. : D

Ваш ответ на вопрос