اذهب إلى المحتوى

السؤال

نشر

قمت ببناء النموذج التالي في كيراس لكن أريد الحصول على خرج كل طبقة، كيف يمكنني القيام بذلك؟

model = Sequential()
model.add(Convolution2D(16, (3,3),
                        kernel_size[1],border_mode='valid',
                        input_shape=input_shape))
model.add(Activation('tanh'))
model.add(Convolution2D(16, (3,3), kernel_size[1]))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Convolution2D(32, (3,3), kernel_size[1]))
model.add(Activation('tanh'))
model.add(Convolution2D(32, (3,3), kernel_size[1]))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Flatten())
model.add(Dense(4096))
model.add(Activation('tanh'))
model.add(Dropout(0.4))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['acc'])
model.fit(x, y,
          batch_size=batch_size,
          nb_epoch=20,
          validation_data=(data, label))

 

Recommended Posts

  • 1
نشر

هذا أمر مهم في بعض الحالات عندما نستخدم الطبقات التلاففية، يمكنك القيام بذلك في كيراس من خلال model.layers[index].output حيث أنها تقوم بإعطاء خرج أي طبقة من خلال تمرير رقم الطبقة أي ال index الخاص بها. ومن خلالها يمكنك الحصول على طلبك وهو خرج كل طبقة كالتالي:

from keras import backend as K
#placeholder إدخال ال  
in = model.input   
# مخرجات كل الطبقات
outputs = [layer.output for layer in model.layers]
# تابع التقييم          
functor = K.function([in , K.learning_phase()], outputs )
# الاختبار
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 1.])
print layer_outs

ولمحاكاة عملية التسرب (أقصد التنعيم وتحديداً ال Dropout هنا)، استخدم learning_phase كـ 1. في layer_outs وإلا استخدم 0. حيث أننا نحتاجها في حال احتوى النموذج على طبقة Dropout  أو batchnorm كما تعلم.

  • 1
نشر

الحصول على الخرج الخاص بكل طبقة في النموذج مهم لمتابعة حالة التعلم في كل مرحلة، ولحسن الحظ فان تلك المتابعة ليست صعبة في keras ، حيث يمكن استخدام 

model.layers[index].output

فقط تمرر ال index الخاص بالطبقة التي تريد الحصول على الخرج الخاص بها، فمثلا الطبقة الاولي هي رقم 0 والثانية 1 وهكذا، الكود بسيط للغاية وهو كالتالي:

from keras import backend as K

inp = model.input                                           # الطبقة التي يدخل منها البيانات
outputs = [layer.output for layer in model.layers]          # الخارج من كل الطبقات
functor = K.function([inp, K.learning_phase()], outputs )   # الدالة التي تعطينا الخرج بدلالة الطبقة  التي تدخل منها البيانات والتي نريد الخرج منها

# نجرب اخراج طبقة من الطبقات
test = np.random.random(input_shape)[np.newaxis,...] #اختيار طبقة بشكل عشوائي
layer_outs = functor([test, 1.]) 
print (layer_outs) #طباعة الخرج

مثال أخر اكثر وضوحا:

from keras import backend as K

# with a Sequential model
# الحصول على مخرجات الطبقة الثالثة بدلالة المدخلات من الطبقة الاولي
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([x])[0]

اما بالنسبة للطبقات التي لا يتم فيها التعلم او تعديل اي قيم فيها (لا يحدث فيها تعديل لل parameters مثل طبقة ال dropout او ال regularization ، فاننا نستخدم learning_phase =1 في layer_outs، او استخدم learning_phase =0 في غير ذلك.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...