Как добавить 2 модельных пути вместе в тенсорфов керас? - PullRequest
0 голосов
/ 04 марта 2020

Я использую код для создания собственного Re sNet и использую код на этой странице Github в качестве ввода. Однако это написано в tenorflow, и я работаю с tenorflow.keras. Большую часть кода я смог преобразовать, однако я застрял при добавлении двух путей вместе в сверточном слое.

Это код тензорного потока

X = Add()([X, X_shortcut])

Это функция Я создаю в tenorflow.keras

def Convolutional_Block(model, f, filters, stage, block, s = 2):

  F1, F2, F3 = filters

  model_shortcut = model

  #### MAIN PATH ####
  # First component
  model.add(Conv2D(F1, (1,1), strides = (s,s))) # kernel_initializer = glorot_uniform(seed = 0)
  model.add(BatchNormalization(axis = 3))
  model.add(Activation("relu"))

  # Second component
  model.add(Conv2D(F2, kernel_size=(f,f), strides = (1,1), padding = "same")) #, kernel_initializer = glorot_uniform(seed = 0)
  model.add(BatchNormalization(axis = 3))
  model.add(Activation("relu"))

  # Thrid component
  model.add(Conv2D(F3, kernel_size=(1,1), strides = (1,1), padding = "valid"))#, kernel_initializer = glorot_uniform(seed = 0)
  model.add(BatchNormalization(axis = 3))

  #### SHORTCUT PATH ####
  model_shortcut.add(Conv2D(filters = F3, kernel_size = (1, 1), strides = (s,s), padding = 'valid')) #, kernel_initializer = glorot_uniform(seed=0)
  model_shortcut.add(BatchNormalization(axis = 3))

ЗДЕСЬ Я ХОЧУ СОКРАСИТЬ (?) МОДЕЛИ

  model.add(Model(model_shortcut))
  model.add(Activation('relu'))

  return model

Как мне это сделать? Я вижу в этом добавление слоев моей модели ярлыков в мою новую модель, чтобы мой код имел смысл, но, похоже, он не работает.

1 Ответ

0 голосов
/ 01 апреля 2020

В тензорных керах для объединения двух моделей необходимо следовать Функциональному API. Пожалуйста, обратитесь образец кода ниже

import tensorflow as tf

# Image
input_1 = tf.keras.layers.Input(shape=(28, 28, 1))
conv2d_1 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), strides = (2,2),
                                  activation=tf.keras.activations.relu)(input_1)
bn_1 = tf.keras.layers.BatchNormalization(axis=1)(conv2d_1)

# Second conv layer :
conv2d_2 = tf.keras.layers.Conv2D(64, kernel_size=(1,1), strides = (1,1),
                                  activation=tf.keras.activations.relu, padding = "Same")(bn_1)
bn_2 = tf.keras.layers.BatchNormalization(axis=3)(conv2d_2)

# Third conv layer :
conv2d_3 = tf.keras.layers.Conv2D(128, kernel_size=(1,1),strides = (1,1),
                                  activation=tf.keras.activations.relu, padding = "Valid")(bn_2)
bn_3 = tf.keras.layers.BatchNormalization(axis=3)(conv2d_3)

# The other input
input_shortcut = tf.keras.layers.Input(shape=(28,28,1))
conv2d_2_1 = tf.keras.layers.Conv2D(128,kernel_size=(1,1),strides = (2,2), activation=tf.keras.activations.relu, padding = "Valid")(input_shortcut)
bn_2_1 = tf.keras.layers.BatchNormalization(axis=3)(conv2d_2_1)

# Concatenate
concat = tf.keras.layers.Concatenate()([bn_3, bn_2_1])

n_classes = 4
# output layer
output = tf.keras.layers.Dense(units=n_classes,
                               activation=tf.keras.activations.softmax)(concat)

full_model = tf.keras.Model(inputs=[input_1, input_shortcut], outputs=[output])

print(full_model.summary())
...