• 0

كيف يمكن ان تستبدل او تضيف طبقة في keras

انا احاول ان اقوم بعمل تبديل لطبقة  Con2D باخري ممثالة لكن بدون bias. كذلك احاول اضافة  BatchNormalization قبل اول طبقة activation.

def keras_simple_model():
    from keras.models import Model
    from keras.layers import Input, Dense,  GlobalAveragePooling2D
    from keras.layers import Conv2D, MaxPooling2D, Activation

    inputs1 = Input((28, 28, 1))
    x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv1')(inputs1)
    x = Activation('relu')(x)
    x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv2')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='pool1')(x)

    x = Conv2D(8, (3, 3), activation=None, padding='same', name='conv3')(x)
    x = Activation('relu')(x)
    x = Conv2D(8, (3, 3), activation=None, padding='same', name='conv4')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='pool2')(x)

    x = GlobalAveragePooling2D()(x)
    x = Dense(10, activation=None)(x)
    x = Activation('softmax')(x)

    model = Model(inputs=inputs1, outputs=x)
    return model


if __name__ == '__main__':
    model = keras_simple_model()
    print(model.summary())

كيف استطيع ان اقوم بهذا؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

الكود التالي يوضح كيف تضيف طبقة او تعدل طبقة والتي يطابق اسمها اسم معين regular expression:

import re
from keras.models import Model

def insert_layer_nonseq(model, layer_regex, insert_layer_factory,
                        insert_layer_name=None, position='after'):

    # توضيح الرسم الخاص بالنموذج
    network_dict = {'input_layers_of': {}, 'new_output_tensor_of': {}}

    # تعيينالدخل لكل طبقة
    for layer in model.layers:
        for node in layer._outbound_nodes:
            layer_name = node.outbound_layer.name
            if layer_name not in network_dict['input_layers_of']:
                network_dict['input_layers_of'].update(
                        {layer_name: [layer.name]})
            else:
                network_dict['input_layers_of'][layer_name].append(layer.name)

    # تعيين الخرج لكل دخل
    network_dict['new_output_tensor_of'].update(
            {model.layers[0].name: model.input})

    # نمر على كل الطقات بعد تعيين الدخل
    model_outputs = []
    for layer in model.layers[1:]:

        # نوضح ال tensor 
        layer_input = [network_dict['new_output_tensor_of'][layer_aux] 
                for layer_aux in network_dict['input_layers_of'][layer.name]]
        if len(layer_input) == 1:
            layer_input = layer_input[0]

        # نقوم باضافة طبقة اذا وافق اسمها اسم معين
        if re.match(layer_regex, layer.name):
            if position == 'replace':
                x = layer_input
            elif position == 'after':
                x = layer(layer_input)
            elif position == 'before':
                pass
            else:
                raise ValueError('position must be: before, after or replace')

            new_layer = insert_layer_factory()
            if insert_layer_name:
                new_layer.name = insert_layer_name
            else:
                new_layer.name = '{}_{}'.format(layer.name, 
                                                new_layer.name)
            x = new_layer(x)
            print('New layer: {} Old layer: {} Type: {}'.format(new_layer.name,
                                                            layer.name, position))
            if position == 'before':
                x = layer(x)
        else:
            x = layer(layer_input)

 
        network_dict['new_output_tensor_of'].update({layer.name: x})

        # نقوم بحفظ الخرج 
        if layer_name in model.output_names:
            model_outputs.append(x)

    return Model(inputs=model.inputs, outputs=model_outputs)

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

لحذف ال bias من ال conv2D يمكنك اضافة المتغير use_bias = False للطبقة التي لا تريد استعمال bias فيها.

x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv1', use_bias = False)(inputs1)

بالنسبة لل BatchNormalization, لاضافة طبقة من هذا النوع ستحتاج اولا لاستدعائها

from keras.layers import BatchNormalization

بعدها يمكنك استعمالها كما تستعمل اي طبقة أخرى في keras في المكان الذي تريده

inputs1 = Input((28, 28, 1))
x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv1')(inputs1)
x = BatchNormalization()(x)
x = Activation('relu')(x)

 

تمّ تعديل بواسطة Walid K

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن