Преобразование объявления модели в Keras (удаление Sequential) в новое без Sequential возвращает другую форму - PullRequest
0 голосов
/ 20 января 2020

Я новичок ie с Python, Tensorflow и Keras.

Я изменил этот код:

def build_base_network(input_shape):

    seq = Sequential()

    nb_filter = [6, 12]
    kernel_size = 3


    #convolutional layer 1
    seq.add(Convolution2D(nb_filter[0], kernel_size, kernel_size, input_shape=input_shape,
                          border_mode='valid', dim_ordering='th'))
    seq.add(Activation('relu'))
    seq.add(MaxPooling2D(pool_size=(2, 2)))  
    seq.add(Dropout(.25))

    #convolutional layer 2
    seq.add(Convolution2D(nb_filter[1], kernel_size, kernel_size, border_mode='valid', dim_ordering='th'))
    seq.add(Activation('relu'))
    seq.add(MaxPooling2D(pool_size=(2, 2), dim_ordering='th')) 
    seq.add(Dropout(.25))

    #flatten 
    seq.add(Flatten())
    seq.add(Dense(128, activation='relu'))
    seq.add(Dropout(0.1))
    seq.add(Dense(50, activation='relu'))
    return seq

Пишу свою собственную версию:

def build_base_network(input_shape):

    inputs = Input(shape = input_shape)

    nb_filter = [6, 12]
    kernel_size = 3
    conv1 = Conv2D(nb_filter[0], (kernel_size, kernel_size), activation='relu', padding="valid", data_format='channels_first')(inputs)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    drop1 = Dropout(.25)(pool1)

    #convolutional layer 2
    conv2 = Conv2D(nb_filter[1], (kernel_size, kernel_size), activation='relu', padding="valid", data_format="channels_first")(drop1)
    pool2 = MaxPooling2D(pool_size=(2, 2), data_format="channels_first")(conv2)
    drop2 = Dropout(.25)(pool2)

    #flatten 
    dense1 = Dense(128, activation='relu')(drop2)
    drop3 = Dropout(0.1)(dense1)
    dense2 = Dense(50, activation='relu')(drop3)

    model = Model(inputs=inputs, outputs=dense2)

    return model

Я называю это следующим кодом:

input_dim = x_train.shape[2:]
img_a = Input(shape=input_dim)
img_b = Input(shape=input_dim)
base_network = build_base_network(input_dim)
feat_vecs_a = base_network(img_a)
feat_vecs_b = base_network(img_b)

Немодифицированный код (первый) возвращает эту форму: (None, 50) Модифицированный код (моя собственная версия) возвращает эту форму: (None, 12, 12, 50)

Я не модифицировал никакой другой фрагмент кода. Функция base_network - единственная, которую я изменил.

Кстати, input_dim - это (1, 56, 46).

Что я делаю не так?

1 Ответ

1 голос
/ 20 января 2020

Вы забыли операцию Flatten:

pool2 = MaxPooling2D(pool_size=(2, 2), data_format="channels_first")(conv2)
drop2 = Dropout(.25)(pool2)

#flatten 
dense1 = Dense(128, activation='relu')(drop2)

должно быть

pool2 = MaxPooling2D(pool_size=(2, 2), data_format="channels_first")(conv2)
drop2 = Dropout(.25)(pool2)

#flatten 
flatten1 = Flatten()(drop2)
dense1 = Dense(128, activation='relu')(flatten1)

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