簡體   English   中英

修改神經網絡以一次預測3個示例

[英]Modify Neural Network to Predict on 3 examples at a time

我這里有一個卷積神經網絡,它可以拍攝96x96x3的圖片並輸出1x128的編碼。 (未定義的功能只是一系列的層)

我將如何修改體系結構以采用3x96x96x3輸入並產生3x128輸出(使用相同參數向前傳播3次)?

def faceRecoModel(input_shape):
    """
    Implementation of the Inception model used for FaceNet

    Arguments:
    input_shape -- shape of the images of the dataset

    Returns:
    model -- a Model() instance in Keras
    """

    # Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)

    # Zero-Padding
    X = ZeroPadding2D((3, 3))(X_input)

    # First Block
    X = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(X)
    X = BatchNormalization(axis=1, name='bn1')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D((3, 3), strides=2)(X)

    # Second Block
    X = Conv2D(64, (1, 1), strides=(1, 1), name='conv2')(X)
    X = BatchNormalization(axis=1, epsilon=0.00001, name='bn2')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)

    # Second Block
    X = Conv2D(192, (3, 3), strides=(1, 1), name='conv3')(X)
    X = BatchNormalization(axis=1, epsilon=0.00001, name='bn3')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D(pool_size=3, strides=2)(X)

    # Inception 1: a/b/c
    X = inception_block_1a(X)
    X = inception_block_1b(X)
    X = inception_block_1c(X)

    # Inception 2: a/b
    X = inception_block_2a(X)
    X = inception_block_2b(X)

    # Inception 3: a/b
    X = inception_block_3a(X)
    X = inception_block_3b(X)

    # Top layer
    X = AveragePooling2D(pool_size=(3, 3), strides=(1, 1), data_format='channels_first')(X)
    X = Flatten()(X)
    X = Dense(128, name='dense_layer')(X)

    # L2 normalization
    X = Lambda(lambda x: K.l2_normalize(x, axis=1))(X)

    # Create model instance
    model = Model(inputs=X_input, outputs=X, name='FaceRecoModel')

    return model

編輯:正如op提到的那樣,網絡應一次處理3張圖像,因為數據集的形狀為(m,3,96,96,3),那么一種簡單的方法是以並行方式創建三個標准起始網絡,然后連接從它們每個接收的輸出。

您無需進行任何修改,Keras中輸入的第一維始終是批處理維,因此,您實際上需要輸入形狀為(3, 96, 96, 3) 3,96,96,3)的輸入,您將獲得對應的輸出(3, 128) 無需修改代碼。

如果要輸入形狀(batch_size, 3, 96, 96, 3)的形狀(batch_size, 3, 96, 96, 3)即將3張圖像作為單個輸入樣本進行處理,則需要創建一個新模型,該模型使用訓練有素的模型並將其應用於每個模型3張圖像獨立。 您可以使用TimeDistributed包裝器輕松實現此TimeDistributed

from keras.layers import TimeDistributed

inp = Input(shape=(3, 96, 96, 3))
out = TimeDistributed(the_trained_face_rec_model)(inp)

model = Model(inp, out)

此新模型​​的輸出的形狀為(batch_size, 3, 128) 無需編譯或訓練此新模型,因為它只是先前訓練過的模型的包裝。 因此,您可以使用: predictions = model.predict(my_images)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM