Как обойти часть нейронной сети в TensorFlow для некоторых (но не всех) функций - PullRequest
1 голос
/ 10 октября 2019

В моей модели TensorFlow у меня есть некоторые данные, которые я передаю в стек CNN, прежде чем он перейдет в несколько полностью связанных слоев. Я реализовал это с моделью Keras 'Sequential. Однако теперь у меня есть некоторые данные, которые не должны поступать в CNN и вместо этого вводиться непосредственно в первый полностью подключенный слой, потому что эти данные содержат некоторые значения и метки, которые являются частью входных данных, но эти данные не должны подвергаться сверткам, как есть. не данные изображения.

Возможно ли такое с tensorflow.keras или я должен сделать это с tensorflow.nn? Насколько я понимаю, последовательные модели Keras состоят в том, что вход идет с одного конца, а с другого - без специальной проводки в середине.

Правильно ли, что для этого мне нужно использовать tensorflow.concat для данных из последнего слоя CNN и данных, которые обойдут CNN перед подачей его в первый полностью подключенный слой?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вот простой пример, в котором операция заключается в суммировании активаций из разных подсетей:

import keras
import numpy as np
import tensorflow as tf
from keras.layers import Input, Dense, Activation

tf.reset_default_graph()

# this represents your cnn model 
def nn_model(input_x):
    feature_maker = Dense(10, activation='relu')(input_x)
    feature_maker = Dense(20, activation='relu')(feature_maker)
    feature_maker = Dense(1, activation='linear')(feature_maker)
    return feature_maker

# a list of input layers, of course the input shapes can be different
input_layers = [Input(shape=(3, )) for _ in range(2)]
coupled_feature = [nn_model(input_x) for input_x in input_layers]

# assume you take the sum of the outputs 
coupled_feature = keras.layers.Add()(coupled_feature)
prediction = Dense(1, activation='relu')(coupled_feature)

model = keras.models.Model(inputs=input_layers, outputs=prediction)
model.compile(loss='mse', optimizer='adam')

# example training set
x_1 = np.linspace(1, 90, 270).reshape(90, 3)
x_2 = np.linspace(1, 90, 270).reshape(90, 3)
y = np.random.rand(90)

inputs_x = [x_1, x_2]

model.fit(inputs_x, y, batch_size=32, epochs=10)

На самом деле вы можете построить модель, чтобы получить больше интуиции

from keras.utils.vis_utils import plot_model

plot_model(model, show_shapes=True)

Модель вышеприведенного кода выглядит следующим образом

model

0 голосов
/ 10 октября 2019

С небольшой модернизацией и функциональным API вы можете:

#create the CNN - it can also be a sequential
cnn_input = Input(image_shape)
cnn_output = Conv2D(...)(cnn_input)
cnn_output = Conv2D(...)(cnn_output)
cnn_output = MaxPooling2D()(cnn_output)
....

cnn_model = Model(cnn_input, cnn_output)

#create the FC model - can also be a sequential
fc_input = Input(fc_input_shape)
fc_output = Dense(...)(fc_input)
fc_output = Dense(...)(fc_output)

fc_model = Model(fc_input, fc_output)

Существует много места для творчества, это только один из способов.

#create the full model
full_input = Input(image_shape)
full_output = cnn_model(full_input)
full_output = fc_model(full_output)

full_model = Model(full_input, full_output)

Вы можете использовать любую из трех моделей любым удобным вам способом. Они разделяют слои и веса, поэтому внутренне они одинаковы.

Сохранение и загрузка полной модели могут быть странными. Я бы, вероятно, сохранил два других отдельно и при загрузке создал бы полную модель снова.

Также обратите внимание, что если вы сохраните две модели, которые используют одни и те же слои, после загрузки они, вероятно, больше не будут использовать эти слои. (Еще одна причина для сохранения / загрузки только fc_model и cnn_model при повторном создании full_model из кода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...