Я пытаюсь примерно реализовать следующую архитектуру в Keras (предпочтительно) или Tensorflow.
___________ _________ _________ ________ ______
| Conv | | Max | | Dense | | | | |
Input0--> | Layer 1 | --> | Pool 1 | --> | Layer | -->| | | |
|_________| |________| |________| | Sum | | Out |
| Layer |-->|_____|
Input1 ----------- Converted to trainable weights-->| |
|_______| |_______|
Короче говоря, это в значительной степени модель с двумя входами, объединенными в один выход с использованием слоя Add ([input0, input1]). Хитрость в том, что один из входных данных должен рассматриваться как переменная = обучаемый вес.
Слой Keras Add () не позволяет этого, и он принимает input0 и input1 в качестве необучаемых переменных:
input0 = Input((28,28,1))
x = Conv2D(32, kernel_size=(3, 3), activation='relu',input_shape=input_shape)(mod1)
x = Conv2D(64, (3, 3), activation='relu')(input0)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
input1 = Input((128,))
x = Add()([x, input1])
x = Dense(num_classes, activation='softmax')(x)
model = Model(inputs = [mod1,TPM], outputs = x)
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Я могу реализовать график в тензорном потоке, который добавляет заполнитель X с весом b и запоминает значение для b относительно целевого Y.
train_X = numpy.asarray([1.0, 2.0])
train_Y = numpy.asarray([0.0, 2.5])
n_samples = train_X.shape[0]
# tf Graph Input
X = tf.placeholder("float")
Y = tf.placeholder("float")
# Set model weights
b = tf.Variable([0.0, 0.0], name="bias")
# Construct a linear model
pred = tf.add(X, b)
loss = tf.reduce_mean(tf.square(pred - train_Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(loss)
train = optimizer.apply_gradients(grads_and_vars)
#init = tf.initialize_all_variables()
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for step in range(epochs):
sess.run(train, feed_dict={X: train_X, Y: train_Y})
Это работает точно, как я хочу. Простое оптимизируемое добавление ввода и весов. Но я не могу включить это в модель Keras. Я пропускаю шаг, как объединить обе идеи.
Как я могу включить слой, который суммирует только один обучаемый тензор в необучаемый тензор?