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

Ali Haidar Ahmad

الأعضاء
  • المساهمات

    1068
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    43

كل منشورات العضو Ali Haidar Ahmad

  1. يمكننا حذف اسطر محددة من جدول ما عن طريق: Delete from اسم الجدول Where شرط محدد على الأسطر إذا لم نضع شرط (لم نضع where) يتم حذف جميع الاسطر. مثلاً لديك قاعدة بيانات لمؤسسة وتريد حذف كل الموظفين الموجودين فيها: Delete from emp; أما بالنسبة للإدراج فهناك طريقتين، 1. الطريقة الأولى المباشرة (اليدوية): insert اسم الجدول values (قيمة3,قيمة2,قيمة1....) - وفي حال لم تكن تعرف ترتيب الأعمدة بالضبط في الجدول فيمكنك تحديد أسماء الأعمدة كالتالي: insert into Table_name(col1,col2,...coln) values (val1,val2,...,valn) 2. الطريقة الثانية فهي الطريقة التقليدية (بواسطة استعلام): insert into Table_Name select col1,col2,..,coln from ... where ..
  2. بشكل عام ضمن أنظمة التشغيل، نصادف أحيانا ثلاث حالات للإنهاء: - الحالة الطبيعية: عندما تنتهي الاجرائية من تنفيذ آخر تعليمة لها تطلب من نظام التشغيل أن يقوم بحذفها عن طريق استدعاء نظام يدعى exit بالتالي في هذه النقطة بعد استدعاء النظام exit فإنه يتم تحرير deallocate كل الموارد التي كانت تحجزها هذه الإجرائية لتعود إلى نظام التشغيل ويتم تحرير flush كل الملفات المفتوحة وإغلاقها. - الحالة الخاصة: قد تطلب الإجرائية أن يتم إنهائها قبل تنفيذ كل التعليمات وذلك عن طريق استدعاء النظام exit (هو تابع يرد قيمة وقد يختلف اسمه من نظام لآخر) الذي يرد قيمة صحيحة integer هذا العدد الصحيح int يمرر passed إلى الإجرائية الأب parent في حال كان الأب قد استدعى wait ويرد الإجرائية exit إحدى القيمتين: •يرد zero في حال إن إنهاء الإجرائية تم بشكل صحيح. •يرد non-zero (رقم عشوائي صحيح) فيحال تم حدوث مشاكل قبل الإنهاء. - الحالة القسرية: في حال أرادت الإجرائية الأب أن تقوم بإنهاء الإجرائيات الأبناء تستخدم استدعاء النظام يدعى abort وهذه بعض الاسباب للقيام بذلك: 1. الإجرائية البنت child تخطت الاستخدام المسموح به لبعض الموارد التي خصصت لها. 2. المهمة task التي اعطت للإجرائية البنت لم تعد مهمة (لاحاجة لها بعد الآن no required ). 3. الإجرائية الأب انتهت (تنفذ exit) ولكن نظام التشغيل لايسمح بإنهاء الأب قبل البنت وبالتالي سوف تنهي الإجرائية البنت لتستطيع أن تنهي نفسها. ملاحظة: إذا انتهى الأب فإن نظام التشغيل قد وقد لا يسمح بوجود الابن بدون أبيه (يختلف الأمر من نظام تشغيل لآخر).
  3. نعم هناك الكلاس Random يمكنك استخدامه لتوليد أعداد صحيحية عشوائية. نقوم أولاً بتعريف غرض (object) من هذا الكلاس: Random rand = new Random(); ثم بعدها يمكنك استخدام الدالة next عن طريق استدعائها من خلال هذا الغرض لتوليد أعداد عشوائية كالتالي: int number = rand.Next(min, max); حيث تكون الأعداد المولَدة ضمن المجال [min,max] مثال: int number1 = rnd.Next(9, 99); // تولد رقم عشوائي بين ال 9 وال 99 int number2 = rnd.Next(9); // تولد رقم عشوائي بين ال0 وال 9
  4. أولاً عليك قراءة البيانات في بايثون ويفضل تحويلها إلى ملف CSV ثم قراءتها ك Dataframe ليسهل التعامل معها (لامشكلة المهم أن تقوم بقراءتها بالشكل المناسب)، ثم بعد ذلك يمكنك استخدام مكتبة sklearn لتنفيذ الطلبات المتبقية حيث توفر لك مكتبة sklearn ماتحتاجه لتقسيم البيانات (الطلب 2 ) وبناء نموذج LinearR وإليك الروابط التالية التي تشرحهما: وبالنسبة للطلب الأخير (تقييم أداء النموذج) فهنا يوجد كل الطرق مع شرحها، ويمكنك استخدام واحدة منها:
  5. نعم يوجد، ويمكنك تحديد أي عدد إذا كان أوليَاً أم لا اعتماداً على التعريف "العدد الأولي هو عدد طبيعي أكبر قطعاً من 1، لا يقبل القسمة إلا على نفسه وعلى واحد فقط. " وفي البرمجة هناك نهجين أساسيين الأول تعقيده O(n^2): def isPrime(x): # إذا كان العدد أصغر أو يساوي الواحد فهو ليس أولي حسب التعريف if x <= 1: return False else: # [2,x/2] نبحث عن وجود أي قاسم للعد ضمن المجال التالي for i in range(2, int(x/2)+1): # إذا وجدنا أي قاسم له ضمن هذا المجال، فهذا يعني أنه ليس أولي if (x % i) == 0: return False # وأخيراً إن لم يجد أي قاسم، فهذا يعني أنه أولي return True # تجربته isPrime(5) # True isPrime(1) # False ليس أولي isPrime(11) # True أولي isPrime(6) # False isPrime(15) # False isPrime(23) # True النهج الثاني يعتمد على نظرية الأعداد حيث سنقوم بالبحث ضمن مجال أضيق وهو من 2 إلى جذر العدد فلايمكن أن تجد قاسم لعدد ما أكبر من جذره، وهذا ماسيحسن تعقيد الخوارزمية من n^2 إلى جذر ال n: def isPrime(x): from math import sqrt # إذا كان العدد أصغر أو يساوي الواحد فهو ليس أولي حسب التعريف if x <= 1: return False else: # 1+هنا سنغير المجال الذي سنبحث فيه عن وجود قاسم حيث أن المجال هو من 2 إلى جذر العدد for i in range(2, int(sqrt(x)) + 1): if (x % i == 0): return False # ليس أولي return True # تجربته isPrime(5) # True أولي isPrime(1) # False غير أولي isPrime(11) # True isPrime(6) # False isPrime(15) # False isPrime(23) # True
  6. في النسخ الحديثة من جانغو "2.0 وما فوق" تنفيذ هكاذا أمر أصبح أسهل: from django.utils.cache import learn_cache_key from django.core.cache import cache from django.views.decorators.cache import cache_page keys = set() @cache_page( 60 * 15, "blog" ); def blog( request ): response = render(request, 'template') keys.add(learn_cache_key(request, response) return response def invalidate_cache() cache.delete_many(keys) حيث يمكنك تسجيل Invate_cache كـ callback عندما يقوم شخص ما بتحديث منشور في المدونة عبر إشارة pre_save.
  7. يمكنك استخدام الدالة tf.data.Dataset.from_generator لتحويل أي iterable في بايثون (أي قوائم أو قواميس أو tubles أو set) إلى Dataset ولها الشكل التالي: from_generator( generator, output_types=None, output_shapes=None ) #كما ذكرنا iter الوسيط الأول هو أي كائن # output_shapes: None أبعاد المخرجات وفي حالتك كونها أحجام مختلفة نضع # output_types: نمط الإخراج لتطبيقها على مثالك كالتالي: import tensorflow as tf li = [[1,11], [1,2,3]] #from_generator استخدام الدالة #none كون الأحجام مختلفة نضع المخرجات dataset = tf.data.Dataset.from_generator(lambda: li, tf.int32, output_shapes=[None]) # وسنستعرضها الآن iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() with tf.Session() as sess: print(sess.run(next_element)) # '[1,11]' print(sess.run(next_element)) # '[1,2,3]' كما يمكنك استخدام الدالة from_tensor_slices كالتالي: dataset = tf.data.Dataset.from_tensor_slices(tf.ragged.constant(li)) # عرضها for s in dataset: print(s) """ <tf.RaggedTensor [[1, 11]]> <tf.RaggedTensor [[1, 2, 3]]> """
  8. يمكنك أيضاً تمرير request.user عند استدعاء الدالة (...)save. داخل ال view: class EventSerializer(serializers.ModelSerializer): class Meta: model = models.Event exclude = ['user'] class EventView(APIView): def post(self, request): es = EventSerializer(data=request.data) if es.is_valid(): es.save(user=self.request.user) return Response(status=status.HTTP_201_CREATED) return Response(data=es.errors, status=status.HTTP_400_BAD_REQUEST) وهذا هو النموذج: class Event(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE) date = models.DateTimeField(default=timezone.now) place = models.CharField(max_length=255)
  9. إليك حل ممتاز في حال كنت تريد بعض المرونة الإضافية ولا تريد تغيير مجال النموذج الخاص بك. عن طريق validator مخصص: from django.core.exceptions import ValidationError class validate_range_or_null(object): compare = lambda self, a, b, c: a > c or a < b clean = lambda self, x: x message = ('Ensure this value is between %(limit_min)s and %(limit_max)s (it is %(show_value)s).') code = 'limit_value' def __init__(self, limit_min, limit_max): self.limit_min = limit_min self.limit_max = limit_max def __call__(self, value): cleaned = self.clean(value) params = {'limit_min': self.limit_min, 'limit_max': self.limit_max, 'show_value': cleaned} if value: # اجعله اختياريًا ، أو قم بإزالته لجعله مطلوبًا، أو اجعله مطلوبًا في النموذج if self.compare(cleaned, self.limit_min, self.limit_max): raise ValidationError(self.message, code=self.code, params=params) حيث أن المعلمتان هما max و min ، وتسمح بقيم nulls. كما يمكنك تخصيص validator إذا كنت ترغب في ذلك عن طريق التخلص من عبارة if أو تغيير الحقل ليصبح blank = False، null = False في النموذج. سيتطلب ذلك بالطبع عملية migration. ويمكن استخدامه على هذا النحو: class YourModel(models.Model): .... no_dependents = models.PositiveSmallIntegerField("How many dependants?", blank=True, null=True, default=0, validators=[validate_range_or_null(1,100)])
  10. الطبقة Conv2D هي الطبقة التي يمكننا من خلالها بناء شبكة CNN في كيراس وتنسرفلو.. وسأشرح كيف نستخدمها.. أولاً الشكل العام لها: tf.keras.layers.Conv2D( filters, kernel_size, strides=(1, 1), padding="valid", data_format=None, activation=None, use_bias=True, kernel_initializer="glorot_uniform", bias_initializer="zeros", kernel_regularizer=None, bias_regularizer=None, input_shape, **kwargs ) الوسيط الأول filters يمثل عدد المرشحات التي تريد أن يتم تطبيقها على مجموعة بياناتك (الصور). حيث يتم تطبيق كل فلتر على كل صورة لاستخراج السمات المميزة فيها (حواف زوايا نقاط..إلخ) عن طريق تنفيذ عملية "التفاف" convolution عليها. وعدد هذه الفلاتر سيمثل عدد القنوات التي سيتم إخراجها من هذه الطبقة (ستفهم أكثر في المثال بعد قليل). الوسيط الثاني kernel_size يمثل حجم النواة (حجم المرشحات التي سيتم تطبيقها) حيث نمرر tuble يحوي قيمتين تمثلان طول وعرض المرشح، على سبيل المثال إذا قمنا بتمرير (3,3) فهذا يعني أن المرشحات التي سيتم تطبيقها ستكون أبعادها 3*3. كما يمكننا أن نمرر قيمة واحدة بدلاً من ال tuble، على سبيل المثال يمكن أن نمرر 5 وبالتالي سيفهم تلقائياً أن حجم المرشح الذي تريده هو 5*5. كما يجب أن نعلم أن أبعاد هذا المرشح يجب أن تكون أعداداً فردية لأن الأرقام الزوجية تعطي أداء ضعيف لأنك ستعاني مما يسمى بال aliasing error وهي عبارة عن تشوهات غير مرغوبة. الوسيط الثالث هو strides أي عدد الخطوات، فكما نعلم إن عملية ال convolution هي عملية مرور مرشح على الصورة بدءاً من أعلى اليسار وصولاً لأسفل اليمين من الصورة. والوسيط strides يقوم بتحيد عدد الخطوات (عدد البكسلات). الوسيط الرابع padding لتحيد فيما إذا كنت تريد تنفيذ عملية حشو للصورة أو لا (حشو جوانب الصورة بأصفار). ويأخذ قيمتان same لتنفيذ عملية الحشو و valid لعدم تنفيذها. ويكون الحشو في يمين ويسار أو أسفل وأعلى الصورة حسبما تحتاجه الصورة وذلك للحفاظ على نفس الأبعاد للصورة. الوسيط الخامس data_format لتحديد شكل أبعاد الصور في بياناتك فمثلاً إذا كان عدد القنوات اللونية للصور في مجموعة بياناتك يتم تمثيلها في البعد الأخير (أي الثالث) فهنا نضع channels_last (وهي الحالة الافتراضية حيث أن أغلب الصور يتم تمثيل القنوات اللونية فيها كآخر بعد (batch_size, height, width, channels) ). أو channels_first في حال كان عدد القنوات اللونية ممثل في أول بعد (batch_size, channels, height, width). الوسيط السادس activation هو دالة التنشيط التي سيتم استخدامها (افتراضياُ لن يتم استخدام أي دالة تنشيط) حيث يتم تطبيقها على مخرجات الطبقة. أما الوسيط السابع use_bias ويأخذ إما True أو False لتحديد فيما إذا كنت تريد إضافة وزن يمثل ال bias بحيث يتم جمعه على ناتج تطبيق الفلتر. أما الوسيط الثامن فهو kernel_initializer وهو لتحديد نوع التهيئة التي سيتم فيها تهيئة الفلاتر (افتراضياً يكون "glorot_uniform") والوسيط التاسع bias_initializer وافتراضياً يكون التهيئة بأصفار"zeros". وأخيراً input_shape لتحديد حجم الصور التي سيتم تقديمها للطبقة حيث نحدد لها طول وعرض وعدد القنوات اللونية للصورة وهو يضيف تلقائياُ البعد الرابع الذي يمثل حجم الباتش أي: batch_shape + (channels, rows, cols) أو batch_shape + (rows, cols, channels) حسب موضع القناة اللونية. خرج هذه الطبقة هو: batch_shape + (filters, new_rows, new_cols) في حالة كانت القناة اللونية في البداية. أو batch_shape + (new_rows, new_cols, filters) في حالة كانت القناة اللونية في النهاية. ال new_rows و ال new_cols يتم حسابهم من المعادلة: new_col=(col-2*p+f)/strides + 1 new_row=(row-2*p+f)/strides + 1 {{{{{{{{{وعدد الخطوات هو 1 p=0 في حالة كان بدون حشو يكون }}}}}}}}}} new_col=(col-f) + 1 new_row=(row-f + 1 الأمثلة التالية ستوضح الأمر أكثر: # سنقوم بإنشاء 4 صور طولها 28 وعرضها 28 وملونة أي لها 3 قنوات لونية # سنقوم بتوليد هذه الصور بقيم عشوائية import tensorflow as tf x = tf.random.normal((4, 28, 28, 3)) #Conv2D الآن سنطبق عليها ال # سنستخدم مرشحين بحجم 3*3 #p=0 لن نستخدم حشو أي # وعدد الخطوات هو (1, 1) y = tf.keras.layers.Conv2D(2, 3,padding="valid",strides=(1, 1), activation='relu', input_shape=(28, 28, 3))(x) # الآن لنعرض أبعاد الخرج print(y.shape) (4, 26, 26, 2) # لاحظ أن الخرج ينتج من المعدلات السابقة كالتالي # new_col=new_row=28-3+1=26 # وعدد الفلاتر يصبح عدد القنوات في حالة كان ال padding=same: y = tf.keras.layers.Conv2D(2, 3, activation='relu', padding="same", input_shape=input_shape[1:])(x) print(y.shape) # (4, 28, 28, 2) # لاحظ أن الخرج لم يتغير حيث أنه يقوم هنا بعملية حشو بأصفار بحيث تحافظ الصورة على أبعادها مثال عملي، حيث سأقوم باستخدامها مع مجموعة البيانات التالية لتصنيف صور القطط والكلاب (يمكنك الحصول على مجموعة البيانات من هنا https://www.kaggle.com/c/dogs-vs-cats/data): from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K # نحدد مسارات البيانات train_data_dir = 'data/train' validation_data_dir = 'data/validation' nb_train_samples = 2000 # عدد عينات التدريب nb_validation_samples = 800 # التحقق epochs = 50 batch_size = 16 # عدد الباتشات # أبعاد الصور img_width, img_height = 150, 150 # نحدد طبقة الادخال input_shape = (img_width, img_height, 3) #DataAugmentation الآن سنقوم بعملية # إن لم يكن لديك معرفة بها فلقد تركت لك رابط في الأسفل train_datagen = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') # نبدأ ببناء النموذج model = Sequential() # نعرف أول طبقة التفاف model.add(Conv2D(32, (3, 3),activation='relu', input_shape=input_shape)) #وذلك لتقليل أبعاد الصورة Conv2Dبعد كل طبقة MaxPooling2D غالباً مانستخدم طبقة تسمى # إن لم يكن لديك معرفة بها فلقد تركت لك رابطاً في الأسفل لتوضيها model.add(MaxPooling2D(pool_size=(2, 2))) # ثاني طبقة التفاف model.add(Conv2D(32, (3, 3),activation='relu', )) model.add(MaxPooling2D(pool_size=(2, 2))) # ثالث طبقة model.add(Conv2D(64, (3, 3),activation='relu', )) model.add(MaxPooling2D(pool_size=(2, 2))) # نقوم بتسطيح المخرجات model.add(Flatten()) # fully-connected نبني الكلاسيفير الآن وهنا سنستخدم الطبقات المتصلة بالكامل model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) #لمنع الأوفرفيت model.add(Dense(1)) # طبقة الخرج model.add(Activation('sigmoid')) # تجميع النموذج model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc']) # تدريب النموذج model.fit_generator( train_generator, steps_per_epoch=nb_train_samples // batch_size, epochs=epochs, validation_data=validation_generator, validation_steps=nb_validation_samples // batch_size)
  11. يمكنك القيام بذلك من خلال تصفية السجلات الأكثر أهمية ثم استخدام random.sample لتحديد أي عدد تريده كالتالي: import random from myapp.models import MyModel qs = MyModel.objects.filter(criteria=True) #QuerySet الخرج سيكون random.sample(qs, 1) #qs الحصول على عنصر عشوائي واحد من مجموعة الاستعلام السابقة random.sample(qs, 6) # الحصول على ستة عناصر random.sample(qs, 8) # الحصول على ثمانية # وهكذا.. كما يمكنك القيام بإنشاء manager للنموذج الخاص بك للقيام بهذا النوع من الأشياء كالتالي: from django.db import models class RandomManager(models.Manager): def get_query_set(self): return super(RandomManager, self).get_query_set().order_by('?') class Painting(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) objects = models.Manager() # المدير الافتراضي. randoms = RandomManager() # مدير عشوائي محدد. ولاستخدامه: random_painting = Painting.randoms.all()[0]
  12. كما ذكر سامح في الطريقة الثانية التي قدمها،.. ضمن ملف apps.py الخاص بك من مجلد التطبيق الخاص بك ، نقوم بتغيير الواصفة verbose_name. على سبيل المثال: from django.apps import AppConfig class PostConfig(AppConfig): name = 'post' verbose_name = "posts" لكن إضافةً لذلك في حال كنت تستخدم إصدارات 3 ومافوق فيجب أن تضيف الكود التالي أيضاً ضمن ملف init.py: #__init__.py قم بإضافة الكود التالي إلى ملف default_app_config = 'post.apps.PostConfig'
  13. يمكنك استخدام هذا النموذج من خلال الموديول application.vgg16 في كيراس وتنسرفلو: tf.keras.applications.vgg16.VGG16 وبالتالي لإنشاء النموذج نقوم بمايلي: # نقوم أولاً بإنشاء المودل from tensorflow.keras.applications.vgg16 import VGG16 # استيراده model = VGG16() # تعريف كائن يمثل المودل print(model.summary()) # يمكنك استعراض شكل النموذج بالشكل التالي # كما يمكنك عرض رسم بياني يمثل النموذج from keras.utils.vis_utils import plot_model plot_model(model, to_file='vgg.png') الآن لتكن لدينا صورة ما ونريد تصنيفها من خلال هذا النموذج، فأول خطوة يجب القيام بها هي تحميل الصورة، ويمكننا القيام بذلك من خلال الدالة load image: # نقوم بتحميل الصورة from tensorflow.keras.preprocessing.image import load_img image = load_img('/car.jpg', target_size=(224, 224)) # تعديل حجم الصورة بشكل يتناسب مع الحجم الذي تتطلبه الشبكة الصورة التي استخدمناها هي صورة سيارة: الآن يجب أن نقوم بتحويل الصورة إلى شكلها الرياضي (مصفوفة بكسلات) من خلال الدالة img_to_array: # تحويل المصفوفة إلى مصفوفة from tensorflow.keras.preprocessing.image import img_to_array image = img_to_array(image) # أبعاد الصورة image.shape # (224, 224, 3) الآن الصورة ستكون ب 3 أبعاد (طول وعرض وقنوات لونية)، لكن النموذج vgg16 (وأي نموذج آخر يتعامل مع الصور) يتوقع منك أن تمرر الصور في batches (حزم أو مجموعة من الصور دفعة واحدة). لذا يجب أن نقوم بتوسيع أبعاد الصورة (جعلها رباعية الأبعاد) بحيث أن البعد الجديد سوف يمثل عدد العينات(عدد الصور): # نقوم بتوسيع أبعاد الصورة image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2])) # عرض حجمها الآن image.shape # (1, 224, 224, 3) # البعد الجديد يمثل عدد الصور وهنا لدينا صورة واحدة فقط الآن علينا القيام ببعض عمليات المعالجة على الصورة، بشكل يتطابق مع العمليات التي تمت على الصور أثناء تدريب النموذج، وحسب الورقة البحثية بهذا النموذج: فإن مانحتاجه هو عملية واحدة فقط وهي طرح متوسط قيم ال RGB من كل بكسل، والخبر الجميل أنك لن تضطر للقيام بذلك بشكل يدوي وإنما هناك دالة preprocess_input تقوم بمايلزم: # القيام بمعالجة الصورة بشكل يتطابق مع عمليات الممعالجة التي تمت على الصور التي تم تدريب النموذج عليها from keras.applications.vgg16 import preprocess_input image = preprocess_input(image) الآن الصورة (أو مجموعة الصور) جاهزة لأن يتم إنشاء توقعات لها من خلال النموذج: # إيجاد التوقعات yhat = model.predict(image) yhat.shape # (1, 1000) كما نعلم فإن هذا النموذج تم تدريبه على مجموعة بيانات ImageNet التي تحوي ألف فئة مختلفة وبالتالي الخرج سيكون 1000 قيمة احتمالية تمثل احتمال انتماء هذه الصورة لكل فئة. لذا نحتاج لطريقة نستطيع فيها أخذ أكبر احتمال وهذا مايقدمه لنا decode_predictions: from keras.applications.vgg16 import decode_predictions # تحويل الاحتمالات إلى تسميات فئة label = decode_predictions(yhat) label """ [[('n04037443', 'racer', 0.562338), # لاحظ أن أقوى احتمال هو أن الصورة تمثل صورة متسابق باحتمالية قدرها 56 بالمئة ('n04285008', 'sports_car', 0.28281146), # ثاني أكبر احتمال هو أنها صورة سيارة سباق باحتمالية قدرها 28 بالمئة ('n03100240', 'convertible', 0.08739577), ('n02974003', 'car_wheel', 0.037510887), ('n03930630', 'pickup', 0.010782746)]] """ الآن إذا كنت تريد استخلاص أكبر احتمال (التوقع الأساسي): # استرداد النتيجة الأكثر احتمالا ، على سبيل المثال أعلى احتمال label = label[0][0] # طباعة التصنيف print('%s (%.2f%%)' % (label[1], label[2]*100)) # racer (56.23%) هذا كل شيئ...
  14. هناك العديد من الأسباب المحتملة لعدم اكتشاف django لما سيتم ترحيله أثناء أمر makemigrations: يجب أنت تكون حزمة الترحيل في تطبيقك. أيضاً في INSTALLED_APPS، يوصى بتحديد مسار ال module app config كاملاً "application.apps.MyAppConfig" أيضاً يجب أن تتأكد من أنك قمت بتعيين ملف ال settings الصحيح manage.py makemigrations --settings mysite.settings ، ويفضل أن تقوم أيضاً بوضع اسم التطبيق بشكل صريح في manager.py makemigrations myapp - فهذا يساعدك على عزل المشكلة. أيضاً تأكد من أن لديك ال app_label الصحيح في model meta. أيضاً يمكنك تنفيذ الأمر makemigrations -v 3 الذي قد يساعدك في تحديد المشكلة. أيضاً يجب أن تتأكد من أن اسم التطبيق الخاص بك موجود في settings.py ا INSTALLED_APPS وإلا فلن يتم تشغيل عمليات الترحيل بغض النظر عن ما تفعله: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', ] ثم قم بتنفيذ: ./manage.py makemigrations blog
  15. المعلمات غير القابلة للتدريب " non-trainable parameter " هي عدد الأوزان التي لن يتم تحديثها أثناء التدريب باستخدام خوارزمية ال Gradient descent الانتشار العكسي backpropagation. وهناك نوعان رئيسيان للأوزان / المعلمات غير القابلة للتدريب: أوزان wights نريد جعلها ثابتة لاتتغير قيمتها خلال عملية التدريب. هذا يعني أن keras لن تقوم بتحديث هذه الأوزان من خلال خواررزمية GD أثناء التدريب على الإطلاق (على سبيل المثال عندما نقوم باستخدام نماذج نقل التعلم مثل VGG أو Inception أو Res .. إلخ) فإننا نقوم بعملية تجميد لهذه الأوزان المدربة (فتغييرها من خلال خواررزمية GD يلغي فكرة نقل التعلم كلها فنحن نريد هذه الأوزان المدربة لذا نحتاج إلى تجميدها freez لكي لاتتغير). أو مثلاً عندما نستخدم شبكات تلاففية CNN فكما نعلم فإن هذه الشبكات تعتمد على تطبيق مرشحات لكشف سمات الصورة مثل الحواف من خلال مرشح سوبل مثلاُ الذي يعتمد على مشتقات الدرجة الأولى. وكما نعلم فإن قيم المرشح ستتغير من خلال عملية الانتشار الخلفي. لكن لو قمنا بتثبيت قيمها (قمنا بتثبيت قيم مرشح سوبل -قيم المرشحات تعتبر أوزان-) فقد يؤدي ذلك إلى أداء أفضل. النوع الثاني ليس أوزان وإنما معلمات كتلك التي نستفيد منها للقيام بعمليات أشبه بالعمليات الإحصائية عندما نستخدم فكرة ال BatchNormalization في نماذجنا. وبالرغم من أنه قد يتم تحديث بعضها خلال التدريب إلى أنه لايتم تعديلهم من خلال ال backpropagation. لاحظ عندما نستخدم ال BatchNormalization: model.add(BatchNormalization()) model.summary() """_________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 10) 1010 _________________________________________________________________ batch_normalization_1 (Batch (None, 10) 40 ================================================================= Total params: 1,050 # العدد الكلي للمعلمات والأوزان Trainable params: 1,030 # قابلة للتدريب Non-trainable params: 20 # معلمات غير قابلة للتدريب _________________________________________________________________ """ ويمكنك مثلاً جعل أوزان طبقة ما ثابتة باستخدام الواصفة trainable حيث نقوم بضبطها على False: model.get_layer(layerName).trainable = False كما يمكن التحكم بها من خلال الوسيط trainable لكن فقط أثناء بناء النموذج. مثال: model.add(Dense(32, trainable=False,..)) # هنا جعلنا كل الخلايا غير قابلة للتدريب في هذه الطبقة أما ال trainable parameter فهي الأوزان وال bias التي يتم تحديث قيمهم خلال عملية التدريب من خلال خوارزمية ال GD أي أنها الأوزان الموجودة داخل الشبكة والتي يتم تعديلها للحصول على ما نريد (حل مشكلة معينة).حيث يتم تعديل قيمهم من خلال خوارزمية الانتشار العكسي بحيث يتم تقليل قيمة ال loss إلى أقل مايمكن. وبشكل افتراضي ، يمكن تدريب جميع الأوزان في نموذج keras مالم تحدد عكس ذلك (مالم تقوم بتجميد بعضها -الحالة الأولى في الأعلى-). هذا كل شيئ.
  16. الدالة compile هي الدالة المسؤولة عن تكوين النموذج بعد أن تكون قد قمت بتحديد هيكليته (طبقاته وبارمتراته). حيث تقوم بترجمة هذه الهيكلية وتحديد المعلومات الأخرى اللازمة لتكوين النموذج وتجهيزه لبدء عملية التدريب. ولها الشكل التالي: Model.compile( optimizer="rmsprop", loss=None, metrics=None, weighted_metrics=None, steps_per_execution=None, **kwargs ) حيث أن الوسيط الأول هو المحسَن المستخدم (وفي الرابط في الأسفل هناك شرح لأشهر نوعين من المحسنات وهما Rmsprop و Adam). أما الوسيط الثاني فهو دالة التكلفة المراد تطبيقها (غالباً نستخدم Binary_cross_Entropy مع مسائل التصنيف الثنائي و Categorical Crossentropy مع مسائل التصنيف المتعدد أو Spare Categorical Crossentropy) وأيضاً تجدهما في الروابط وكذلك يمكنك القيام بتعريف دالة التكلفة الخاصة بك واستخدامها كما تم شرح ذلك في الرابط في الأسفل. أما الوسيط الثالث فهو معيار قياس أداء النموذج خلال التدريب وغالباً نستخدم المعيار Accuracy عندما تكون البيانات متوازنة أو F1-Score عندما تكون البيانات غير متوازنة. أما الوسيط الخامس فهو لتوزين الفئات حيث نمرر لها قائمة المقاييس التي سيتم تقييمها ووزنها حسب وزن العينة sample_weight أو وزن الفئة class_weight أثناء التدريب والاختبار. أما الوسيط الأخير steps_per_execution فهذا يتعلق بسرعة التنفيذ و الافتراضي هو 1. ويمث عدد الدُفعات batches التي سيتم تنفيذها أثناء كل استدعاء tf.function. والفائدة منه تكمن في أن تشغيل دفعات متعددة داخل استدعاء tf.function واحد إلى تحسين الأداء بشكل كبير في حال كنت تستخدم وحدات TPU(على كولاب مثلاً). وما يلي هو مثال بسيط لها: model.compile(optimizer=tf.keras.optimizer.Adam(learning_rate=1e-3), # هنا مررنا المحسن loss=tf.keras.losses.BinaryCrossentropy(), # دالة التكلفة metrics=[tf.keras.metrics.BinaryAccuracy(), # ومقياسين للأداء tf.keras.metrics.FalseNegatives()]) كما يمكنك أن تجد مثال عنها في كل رابط من الروابط المذكورة في الأسفل مع نماذج بسيطة وواضحة.
  17. تتبع الخطوات التالية لإعادة تسمية التطبيق في جانغو: أولاً: قم بإعادة تسمية مجلد التطبيق، على سبيل المثال ليكن اسم التطبيق القديم هو "app1" و "app2" هو اسم التطبيق الجديد. mv ./app1 ./app2 ثم قم بتحديث كافة عمليات الاستيراد التي تشير إلى المجلد القديم وقم بجعلها تشير إلى الجديد. مثال: from myproject.app1 import models ----> from myproject.app2 import models ثم قم بتحديث مراجع اسم التطبيق القديم داخل عمليات ترحيل Django. أمثلة على التغييرات التي قد تضطر إلى القيام بها: # قبل dependencies = [ ('app1', '...'), ] # بعد dependencies = [ ('app2', '...'), ] # قبل field = models.ForeignKey( default=None, on_delete=django.db.models.deletion.CASCADE, to='old_app.Experiment' ) # بعد field = models.ForeignKey( default=None, on_delete=django.db.models.deletion.CASCADE, to='new_app.Experiment' ) ثم قم بعمل commit في هذه المرحلة. بعد ذلك، يمكنك تشغيل عمليات ترحيل التطبيق في بيئة منشورة، قم بتشغيل django_rename_app قبل تشغيل عمليات الترحيل في هذه العملية. على سبيل المثال ، قبل "python manager.pyigration --noinput" ، كما يوضح المثال التالي: # قبل python manage.py collectstatic --noinput python manage.py migrate --noinput gunicorn my_project.wsgi:application # بعد python manage.py collectstatic --noinput python manage.py rename_app old_app new_app python manage.py migrate --noinput gunicorn my_project.wsgi:application سيؤدي هذا إلى تحديث اسم التطبيق في جداول قاعدة بيانات Django الداخلية التالية: django_content_type django_migrat2ions وإعادة تسمية بادئة "prefix" جميع جداولك لتبدأ باسم التطبيق الجديد، بدلاً من الاسم القديم.
  18. قم أولاً بإنشاء حساب SendGrid (إرسال بريد إلكتروني باستخدام SendGrid هو مجاني ويصل إلى 12 ألف بريد إلكتروني كل شهر) من الرابط التالي (https://signup.sendgrid.com/). ثم أضف المعلومات التالية إلى ملف settings.py: EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = '<your sendgrid username>' EMAIL_HOST_PASSWORD = '<your sendgrid password>' EMAIL_PORT = 587 EMAIL_USE_TLS = True والآن يمكنك إرسال الإيميل: from django.core.mail import send_mail send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com']) وإذا كنت تريد من Django أن يرسل إليك بريداً إلكترونياً عندما يكون هناك خطأ 500 داخلي في الخادم ، فأضف ما يلي إلى settings. py: DEFAULT_FROM_EMAIL = 'your.email@example.com' ADMINS = [('<Your name>', 'your.email@example.com')] كما يمكنك استخدام "Test Mail Server Tool" لاختبار إرسال البريد الإلكتروني على جهازك أو المضيف المحلي. قم بتنزيل "Test Mail Server Tool" وقم بإعدادها، ثم في ملف settings. py : EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'localhost' EMAIL_PORT = 25 ثم استخدم send_mail للإرسال: from django.core.mail import send_mail send_mail('subject','message','sender email', ['receipient email'],fail_silently=False )
  19. يتم تصنيف الآلات التي تستخدم الذاكرة المشتركة إلى ( Uniform Memory Access) UMA و(Non Uniform Memory Access) NUMA وذلك بالاعتماد على زمن الوصول للذاكرة "memory access time" حيث أن UMA يكون فيها الوصول للذاكرة متساوٍ، أما NUMA يكون الوصول غير متساوي. هنا إليك ملخص عن كل منهم: تعرف باسم اكثر شهرة وهو SMP المعالجات المتعددة المتناظرة "Symmetric Multiprocessor" (متناظرة=أي المعالجات المتكافئة في العمل،كل معالج هو رئيس وند للآخر) + المعالجات متماثلة (أي نفس الصلاحيات ونفس العمل) Identical Processor + متساوية في السماحية بالوصول للذاكرة ووقت الوصول للذاكرة access time + تحقق مبدأ ترابط الكاش cache coherency، حيث تسمى أحيانا بcc_uma. يكون لدينا ذاكرة واحدة مشتركة مع كل المعالجات موجودة في نفس المكان (كتلة واحدة) + هي عبارة عن SMP واحدة + يوجد لدينا متحكم واحد في الذاكرة ( single memory controller ) + يمكننا إضافة عدد محدود من المعالجات. + كل المعالجات لها نفس زمن الوصول latency إلى الذاكرة + يوجد نوع واحد منها هو cc_uma. يتم تحقيقها عادة بشكل فيزيائي عن طريق ربط جهازي SMP أو أكثر + كل جهاز SMP يمكنه أن يصل مباشرة إلى ذاكرة جهاز SMP آخر حيث أن المعالجات تتصل ببعضها عن طريق ناقل bus الموجود ضمن الحاسب نفسه + الوصول للذاكرة عبر الناقل أبطأ من الوصول المباشر للذاكرة ضمن نفس الSMP + ليس كل المعالجات لها وصول متساوٍ إلى كل الذواكر + كل معالج له ذاكرته المحلية الخاصة والتي تكون مشتركة مع كل المعالجات الأخرى، أي أن الذاكرة موزعة في أكثر من موقع (كتل) + كل معالج له زمن وصول محدد إلى ذاكرة المعالجات الأخرى ويختلف ذلك بحسب مكانه + يمكننا إضافة العدد الذي نريده من المعالجات + هي عبارة عن مجموعة من الSMP + يوجد لدينا عدة متحكمات في الذاكرة ( multiple memort controller) + يوجد نوعين منها هما :numa ,cc_numa.
  20. يتم تنفيذ عمليات البحث هذه في django.views.generic.date_based على النحو التالي: {'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))} كما يمكنك استخدام الخاصية startswith كالتالي: from datetime import date today = date.today() Model.objects.filter(date_created__startswith=today) أو من خلال الخاصية gte: Model.objects.filter(date_created__gte=today) وبشكل عام فإن الخاصية contain التي ذكرها سامح والخاصية startswith تعتبران الأسرع
  21. يمكننا استخدام الدالة set_weights التي لها الشكل التالي: Model.set_weights(weights) حيث نمرر لهذه الدالة الأوزان (مصفوفة نمباي) المراد استخدامها كأوزان للطبقة المستدعية (عمليى نسخ). كما نعلم فإن أوزان الطبقة تعبر عن حالة الطبقة(سلوكها والتدريب الذي تلقته). إن هذه الدالة تقوم بنسخ الأوزان من طبقة لأخرى. حيث يجب تمرير قيم الوزن بالترتيب الذي تم إنشاؤه بواسطة الطبقة. على سبيل المثال ، تُرجع الطبقة Dense قائمة من قيمتين: مصفوفة النواة (مصفوفة الأوزان) ومتجه التحيز (قيم الانحراف bias). هذه القيم يمكن استخدامها لتعيين أوزان طبقة Dense أخرى: import tensorflow as tf #وتهيئة قيم أوزانها Dense إنشاء طبقة # تهيئة الانحراف بقيمة 0 والأوزان بقيمة 1 layer1 = tf.keras.layers.Dense(1,kernel_initializer=tf.constant_initializer(1.)) out1 = layer1(tf.convert_to_tensor([[1., 2., 3.]])) # طباعة الأوزان (يتضمن ذلك قيمة الانحراف) layer1.get_weights() """ [array([[1.], [1.], [1.]], dtype=float32), array([0.], dtype=float32)] """ # تعريف طبقة أخرى layer2 = tf.keras.layers.Dense(1,kernel_initializer=tf.constant_initializer(2.)) out2 = layer_b(tf.convert_to_tensor([[10., 20., 30.]])) layer2.get_weights() """ [array([[2.], [2.], [2.]], dtype=float32), array([0.], dtype=float32)] """ # نسخ أوزان الطبقة الأولى للثانية layer_2.set_weights(layer_1.get_weights()) # عرض أوزانها الآن للتأكد layer_2.get_weights() """ [array([[1.], [1.], [1.]], dtype=float32), array([0.], dtype=float32)] """
  22. إضافة إلى الحلول التي ذكرها سامح يمكنك استخدام model_to_dict للحصول على أسماء الحقول وقيمها بالشكل التالي: from django.forms.models import model_to_dict def show(request, object_id): object = FooForm(data=model_to_dict(Foo.objects.get(pk=object_id))) return render_to_response('foo/foo_detail.html', {'object': object}) ثم في القالب: {% for field in object %} <li><b>{{ field.label }}:</b> {{ field.data }}</li> {% endfor %}
  23. كما يمكنك القيام بذلك بالشكل التالي (هذه الطريقة ليست جيدة للانتاج): #view ضمن ال request.scheme # http or https request.META['HTTP_HOST'] # example.com request.path # /some/content/1/ #template ضمن ال {{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }} حل آخر: يتأكد SimpleLazyObject من أن استدعاء قاعدة البيانات سيحدث فقط عندما يستخدم القالب بالفعل كائن الموقع. يؤدي ذلك إلى إزالة الاستعلام من صفحات المسؤول. كما أنه يخزن النتيجة مؤقتاً: from django.utils.functional import SimpleLazyObject from django.contrib.sites.shortcuts import get_current_site def site(request): return {'site': SimpleLazyObject(lambda: get_current_site(request)),} وقم بتضمينه في الإعدادات: TEMPLATE_CONTEXT_PROCESSORS = ( "module.context_processors.site", .... ) وفي القالب يمكنك استخدام {{site.domain}} للحصول على المجال الحالي.
  24. نعم ممكن. عندما نقوم بحفظ النموذج من خلال: model.save('my_model.h5') يتم حفظ معماريته (هيكليته) مما يسمح لنا بإنشاء النموذج. ويتم حفظ أوزان النموذج المدربة و ال loss وال optimizer (وحالته أيضاً) مما يمكننا من استكمال التدريب لاحقاً. وبالتالي عند تحميل النموذج: load_model('my_model.h5') يمكننا الحصول على معماريته وأوزانه من خلال: model.summary() # ملخص بطبقات النموذج وأوزانه model.get_weights() # (قيم الأوزان) أوزان النموذج ثم يمكنك القيام بحذف طبقة الدخل من خلال الدالة pop حيث نمرر لها رقم الطبقة المراد حذفها ثم إضافة الطبقة الجديدة التي تريدها: model.layers.pop(0) # حذف الطبقة الأولى # تعريف طبقة الدخل الجديدة وتعديل النموذج Input = Input(batch_shape=(0,300,300,3)) # مثلاً # الخرج الجديد newOutputs = model(Input) newModel = Model(Input, newOutputs) # عرض هيكلية النموذج بعد التعديل newModel.summary() أو كحل ثاني وجدته لك لكنني غير مقتنع تماماً به (سيتجاهل حالة الأوبتيمايزر ودالة التكلفة لذا إن كانت غايتك هي تدريب النموذج من حيث توقف فلن ينجح الأمر. لذا فهذا الحل يصلح معك فقط إن أردت استخدام الأوزان السابقة): يمكنك استخراج تكوين النموذج السابق (هيكليته) ثم تعديله بالشكل الذي تريده في نموذج جديد ثم نسخ الأوزان إليه. مثلاً: # استخراج تكوين النموذج config = model.get_config() # نسخ التكوين input_layer_name = config['layers'][0]['name'] config['layers'][0] = { 'name': 'new_input', 'class_name': 'InputLayer', 'config': { 'batch_input_shape': (None, 300, 300), 'dtype': 'float32', 'sparse': False, 'name': 'new_input' }, 'inbound_nodes': [] } config['layers'][1]['inbound_nodes'] = [[['new_input', 0, 0, {}]]] config['input_layers'] = [['new_input', 0, 0]] # النموذج الجديد model = model.__class__.from_config(model_config, custom_objects={}) # نسخ الأوزان weights = [layer.get_weights() for layer in model.layers[1:]] for layer, weight in zip(new_model.layers[1:], weights): layer.set_weights(weight)
  25. لا يكفي التحقق من self.pk == None لتحديد ما إذا كان سيتم إدراج الكائن أو تحديثه في قاعدة البيانات. الكائن الذي تم إنشاؤه حديثاً (self) يحتوي على قيمة pk يمكنك أن تتحقق من وجود self.id وال flag (العلم) force_insert. كما يلي: if not self.pk or kwargs.get('force_insert', False): self.created = True #save استدعاء دالة super(self.__class__, self).save(*args, **kwargs) #التالي if ضمن بلوك post save قم بتنفيذ كل إجراءات ال if getattr(self, 'created', False): # Statements
×
×
  • أضف...