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

لوحة المتصدرين

  1. Ali Haidar Ahmad

    Ali Haidar Ahmad

    الأعضاء


    • نقاط

      10

    • المساهمات

      1068


  2. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      9

    • المساهمات

      2934


  3. Adam Ebrahim

    Adam Ebrahim

    الأعضاء


    • نقاط

      5

    • المساهمات

      165


  4. عامر ابراهيم

    عامر ابراهيم

    الأعضاء


    • نقاط

      4

    • المساهمات

      77


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 09/16/21 في كل الموقع

  1. أرغب في تغيير اسم حقل معين في النموذج model في جانغو Django: class Foo(models.Model): name = models.CharField() يجب أن يتغير الحقل name إلى full_name كالتالي: class Foo(models.Model): full_name = models.CharField() كيف أقوم بذلك؟
    3 نقاط
  2. أحاول تحويل صور jpeg الخاصة بي إلى تنسيق الويب باستخدام المكون الإضافي image-webpack-loader في Webpack . يعمل التكوين التالي على تصغير ملفاتي بنجاح ولكنه لا يحولها إلى صور webp. test: /\.(gif|png|jpe?g|svg)$/i, loader: 'image-webpack-loader', options: { disable: true, //bypassOnDebug convertPathData: false, mozjpeg: { //works progressive: true, quality: '80-90' }, webp: { quality: 75, enabled: true } }
    3 نقاط
  3. عندما أحاول اختبار أي تطبيق جانغو Django باستخدام الأمر fabric، والذي يستخدم هذا الأمر: python manage.py test myapp يظهر لي هذا الخطأ: Creating test database for alias 'default'... Got an error creating the test database: permission denied to create database Type 'yes' if you would like to try deleting the test database 'test_mydb', or 'no' to cancel يبدو أن الأمر syncdb يعمل. لكن بالرغم من ذلك لا يعمل الأمر السابق، هنا إعدادات قاعدة البيانات الخاصة بي في ملف settings.py: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'oracle'. 'NAME': 'mydb', 'USER': 'myusername', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '', } } ما سبب هذه المشكلة وكيف أقوم بحلها؟
    2 نقاط
  4. كما نعلم فإن أغلب نماذج نقل التعلم تم تدريبها على مجموعة بيانات ImageNet والتي تتكون من صور ملونة RGB. الآن لدي مجموعة بيانات لكنها عبارة عن صور رمادية grayscale وأريد استخدام إحدى شبكات نقل التعلم هذه، فهل هناك طريقة للقيام بهذا الأمر. لأنه لايمكن القيام بذلك بشكل مباشر فالأبعاد التي تتوقعها هذه الشبكات هي من الشكل: (batch_size, height, width, 3) أي 3 قنوات لونية بينما في حالة الصور الرمادية يكون لدينا قناة واحدة. لقد فكرت في أن أقوم بحذف الطبقة الأولى من النموذج وإضافة طبقة بدلاً منها بحيث تتلائم مع حالتي، مارأيكم؟
    2 نقاط
  5. الفرق بين fixed و sticky في css
    2 نقاط
  6. سجلت في دورة علوم الحاسب ولم أتأقلم معها ولم احرز اي تقدم ولا حتى تشجعت لاكمالها. كيف العمل؟
    1 نقطة
  7. 1 نقطة
  8. لماذا يظهر هذا الخطأ TypeError: on_delete must be callable مع العلم الكود الذي يظهر منه الخطأ هو user = models.ForeignKey(User, on_delete='None') إصدار django عندي هو 3.2
    1 نقطة
  9. في Django ، ما الفرق بين الإستعلامين التاليين: Post.objects.values_list('comment_id', flat=True).distinct() والإستعلام التالي: Post.objects.values('comment_id').distinct() هدفي هو الحصول على قائمة بمعرفات التعليقات IDs تحت كل مقالة. لقد قرأت توثيق جانغو Django، وفي الواقع استخدمت كلا الأسلوبين، ويبدو أن النتائج متشابهة بشكل كامل. ما هو الفرق بين إستخدام كلا الأسلوبين السابقين؟
    1 نقطة
  10. التابع values يقوم بإعادة QuerySet تحتوي على قواميس dictionaries، وتكون نتيجته كالتالي: <QuerySet [{'comment_id': 1}, {'comment_id': 2}]> بينما التابع values_list يقوم بإعادة كائن QuerySet يحتوي على tuples، وتكون نتيجته كالتالي: <QuerySet [(1,), (2,)]> إذا كنت تستخدم التابع values_list لإعادة حقل واحد فيمكنك أن تضع الخاصية flat بقيمة true لإعادة كائن QuerySet يحتوي على كل المعرفات في شكل قيمة واحدة بدلًا من tuple، كالتالي: <QuerySet [1, 2]>
    1 نقطة
  11. أستخدم واجهة "messages" لتمرير الرسائل إلى المستخدم مثل الكود التالي: request.user.message_set.create(message=message) أود تضمين html في المتغير {{message}} الخاص بي وعرضه دون تجاوز أكواد HTML في القالب، وبالتالي يتم عرض كود HTML بشكل صحيح في المتصفح. كيف أقوم بعمل هذا الأمر؟
    1 نقطة
  12. بما ان القائمتين ليستا متجاورتين لا يمكن استخدام next، بما انك وجدت العنصر الأب المشترك للقائمتين يمكنك الوصول لأي منهما كالتالي var mainDIV = $(this).parents('div.sara1'); ... success:(data) => { mainDIV.find(".size_select").html(data); // الوصول للعنصر عن طريق العنصر الأب }
    1 نقطة
  13. ما هي افضل دوره في اكاديمية حسوب من حيث ايجاد وضيفه و دخل(راتب) و وشكرا
    1 نقطة
  14. لا يمكن تحديد أي دورة , فكل الدورات قد تؤهلك إلى الانطلاق في مجال العمل الحر , لذلك هذا الأمر يرجع لك في تحديد أي مسار تريد الانطلاق به سواء , برمجة و تصميم مواقع الويب أو برمجة تطبيقات موبايل, ثم تختار أي دورة تريد الاشتراك بها , ففي مجال برمجة وتصميم مواقع الويب يمكنك الاطلاع على هذه الدورات https://academy.hsoub.com/learn/front-end-web-development/ https://academy.hsoub.com/learn/javascript-application-development/ https://academy.hsoub.com/learn/php-web-application-development/ و في مجال برمجة تطبيقات الموبايل يمكنك الاطلاع على هذه الدورة https://academy.hsoub.com/learn/hybrid-mobile-application-development/ , مع العلم أن دورة تطوير التطبيقات باستخدام لغة JavaScript يوجد بها أقسام لبرمجة تطبيقات للموبايل باستخدام لغة react native , وبعد الانتهاء من الدورة التي اشتركت فيها , يمكنك الانتقال إلى مجال العمل الحر و كسب الأموال من خلال عملك في هذا المجال.
    1 نقطة
  15. أنا أستخدم المسارات التالية لدي تسجيل دخول وعندما تحدث مشكلة أرجع 401 ونص الرسالة التي أود عرضها للمستخدمين. Api: /api/v1/auth/signin.js export default async (req, res) => { const { name, password } = req.body; const url = process.env.SH_API_BASEURL + 'auth/signin'; console.log(url); try { const resp = await axios.patch(url, { name, password }); return res.status(200).send(resp.data); } catch (err) { const { response } = err; const status = response.status; const message = response.data.errors[0].message; console.log(`status: ${status}, message ${message}`); return res.status(status).send(message); } }; Pages /pages/auth/signin.js const handleFormSubmit = async (formData, e) => { e.preventDefault(); try { const res = await axios.post('/api/v1/auth/signin', formData); router.push('/secure/home'); } catch (err) { console.log('pages auth in error'); console.log(err); setSubmitError(true); console.log('sigin handle submit error'); } }; console.log(err) تعرض ه>ا الخطا Error: Request failed with status code 401 at createError (createError.js:16) at settle (settle.js:17) at XMLHttpRequest.handleLoad (xhr.js:62) كيف يمكنني الوصول إلى statuscode ونص الخطأ في كود الصفحات؟
    1 نقطة
  16. المعامل on_delete يجب أن يكون قابل للاستدعاء أي تابع أنت تحاول تمرير None ولكن محاطة بعلامة الاقتباس " ' " أي يتم معاملتها كنوع نص يمكنك تغييرها الى التالي user = models.ForeignKey(User, on_delete=None) لكن اذا كنت تقصد ب None أن لا يتم اتخاذ اجراء عند حذف البيانات المرتبطة يمكنك تمرير التالي user = models.ForeignKey(User, on_delete=models.DO_NOTHING) حيث قيم on_delete يمكن أن تكون التالي models.CASCADE models.SET_NULL models.DO_NOTHING models.PROTECT
    1 نقطة
  17. إذا كنت لا تريد تجاوز HTML، لعرضها بشكل كامل فيمكنك أن تستخدم عامل التصفية safe: {{ myhtml |safe }} كما يمكنك أن تستخدم autoscape لكي يتم إيقاف عملية auto-scaping المسئولة عن تخطي أكواد HTML، يقبل هذا العنصر معامل واحد بيقمة on أو off، على النحو التالي: {% autoescape off %} {{ myhtml }} {% endautoescape %} كما يمكنك إعادة تشغيل عملية تخطي أكواد HTML في جزء معين من خلال المرشح escape، كالتالي: {% autoescape off %} {{ title|escape }} {% endautoescape %} كما يمكنك ان تستخدم التابع format_html والذي يقوم بقبول كود HTML كمعامل أول ثم المتغيرات التي يتم إستخدامها في هذا الكود، كالتالي: from django.utils.html import format_html from django.utils.safestring import mark_safe some_html = "<h1>this is title</h1>" some_text = "this is a strong text" some_other_text = "another text here" format_html("{} <b>{}</b> {}", mark_safe(some_html), some_text, some_other_text, ) أيضًا يوفر جانغو Django طريقة أخرى لعمل render لكود HTML لديك من خلال الصنف Context و Template، على النحو التالي: from django.template import Context, Template t = Template('This is your <span>{{ message }}</span>.') c = Context({'message': 'first message'}) html = t.render(c) # This is your <span>first message</span>.
    1 نقطة
  18. تحتوي الأكاديمية على دورة تطوير تطبيقات الجوال بتقنيات الويب، والتي من خلالها سوف تتعلم كيفية عمل تطبيقات أندرويد و iOS من خلال لغات مثل HTML و CSS و JavaScript وسوف تحصل في النهاية على القدرة على برمجة تطبيقات للأندرويد و iOS معًا من خلال كود واحد فقط (تركز الدورة على برمجة تطبيقات الأندرويد بشكل خاص ولكن يمكنك أن تقوم بعمل تطبيقات iOS بنفس الطريقة وبدون إختلافات)، وبما أنك سوف تستخدم تقنيات الويب مثل HTML و CSS و JavaScript فسوف يكون لديك القدرة على عمل مواقع (Frontend)، فبطبيعة الحال تسمى الدورة "دورة برمجة تطبيقات الهواتف الذكية بإستخدام تقنيات الويب". بالنسبة للفرق بين المطور والمبرمج والمصمم، فهو كالتالي: المصمم هو الشخص الذي يقوم برسم شكل التطبيق النهائي بإستخدام برامج مثل أدوبي أكس دي و Figma، مجرد رسومات فقط وليس تطبيق حقيقي، ويتم إرسال هذه التصاميم إلى المطور ليحولها إلى كود. المطور هو الشخص الذي يقوم بكتابة كود واجهة التطبيق مثل الأزرار وإضافة الصور والنصوص في التطبيق، بمعنى آخر هو الشخص المسئول عن كل ما يظهر في التطبيق. المبرمج هو الشخص الذي يقوم بكتابة الكود المنطقي، مثل ما الذي سيحدث عندما يضغط المستخدم على زر معين وكيف سيتم جلب البيانات من قاعدة البيانات والتأكد من مدخلات المستخدم (البريد الإلكتروني، كلمة السر ...)، إلخ. وفي كثير من الأحيان يقوم شخص واحد فقط بالقيام بمهمتين أو أكثر معًا، ويسمى مبرمج ومطور تطبيقات على سبيل المثال. وعند الإنتهاء من دورة تطوير تطبيقات الهواتف الذكية بإستخدام تقنيات الويب سوف تكون مطور ومبرمج في نفس الوقت، لأنك سوف تقوم بعمل التطبيقات من الصفر وحتى إنهائها تمامًا. أيضًا يوجد خيار آخر وهو دورة التطوير بإستخدام لغة JavaScript والتي من خلالها سوف تتعلم برمجة وتطوير مواقع الويب (backend & frontend) وكذلك عمل تطبيقات لسطح المكتب تعمل على الويندوز ولينكس وماك من خلال أطار Electron، وسوف تتعلم أيضاً عمل تطبيقات الهواتف الذكية (أندرويد و iOS) من خلال React Native، وسوف تقوم ببناء تطبيق للمراسلة مثل WhatsApp خلال الدورة. كل الدورات تبدأ معك من الصفر ولا تحتاج لخبرة مسبقة للبدأ في أي دورة من دورات الأكاديمية، ولكن إن لم تتعامل مع أي أكواد من قبل أو لا تعرف أساسيات البرمجة فيفضل أن تقوم بأخذ دورة علوم الحاسوب وهي دورة مخصصة تشرح لك كل أساسيات البرمجة وأنظمة التشغيل وأساسيات الويب عبر تعلم HTML, CSS & JavaScript وطلبات الإنترنت requests والخوارزميات وهياكل للبيانات من خلال لغة بايثون وكيفية التفكير المنطقي وحل المشاكل وإصلاح الأخطاء ... إلخ.
    1 نقطة
  19. يحدث هذا الخطأ لأن المتصفح لا يقوم بإرسال حقل checkbox إن لم تكن محددًا، وبالتالي لا يوجد مفتاح باسم is_published في القاموس request.POST، لذلك يمكنك أن تستخدم التابع get الموجود في أي قاموس dictionary والذي يسمح لك يتمرير قيمة إفتراضية في حالة عدم وجود المفتاح في القاموس، كالتالي: is_published = request.POST.get('is_published', False) أو يمكنك عمل ذلك من خلال جملة if .. else، على النحو التالي: if 'is_published' in request.POST: is_published = request.POST['is_published'] else: is_published = False ويمكن إختصار الكود السابق في سطر واحد، كالتالي: is_published = 'is_published' in request.POST and request.POST['is_published'] كما يمكنك أن تستخدم جملة try ... except: from django.utils.datastructures import MultiValueDictKeyError try: is_published = request.POST['is_published'] except MultiValueDictKeyError: # في حالة لم يوجد المفتاح is_published is_published = False
    1 نقطة
  20. حسب شروط عمل موقع مستقل وأقتبس: صاحب المشروع: أرجو قراءة كيف يضمن مستقل حقوقك للتأكد ومراجعة قيود وشروط العمل في مستقل. نصيحتي هي محاولة التواصل مع المستقل، وتنبيهه للمشاكل التي تعرضت لها، يمكن أن يقوم بعمل تعديل إن أراد ذلك ولكنه ليس مجبراً، أنت عليك تجربة البرنامج قبل الاستلام والتأكد منه. ربما تفتح مشروعاً جديد مع المستقل نفسه وتطلب منه عمل التعديلات المطلوبة وإصلاح المشاكل مقابل مبلغ بينكم يتم بالاتفاق. المشاكل البرمجية ربما لاتظهر في مرحلة التطوير وهذا شيئ طبيعي، ربما سقط سهواً أي مشكلة ولو بسيطة وسبب عطل لديك. الحل الودي هو الأفضل دوما، ويمكنك التواصل مع الإدارة لربما لهم توصيات. انتبه لقراءة شروط الاستخدام عند شراء أي منتج أو خدمة و تأكد منها، لأن القانون يكون مكتوب في معلومات الموقع ولكي لا تتعرض لخسارة.
    1 نقطة
  21. يمكنك أن تستخدم جملة with على النحو التالي: {% with "posts/"|add:myVar|add:"/base.html" as template %} {% include template %} {% endwith %} لكن الطريقة الأفضل هي أن تقوم بعمل وسم مخصص لهذا الأمر كالتالي: أولًا قم بعمل ملف يف المسار: <yourAppName>\templatetags\<yourAppName>_extras.py ثانيًا في هذا الملف قم بعمل وسم مخصص على النحو التالي: from django import template register = template.Library() @register.filter def addStr(str1, str2): return str(str1) + str(str2) والآن أصبح بإمكانك أن تستخدم هذا الوسم على كالتالي: {% load <YourAppName>_extras %} {% with "posts/"|addstr:myVar|addstr:"/base.html" as template %} {% include template %} {% endwith %}
    1 نقطة
  22. تضمن لك أكاديمية حسوب بإسترداد استثمارك خلال 6 أشهر، وأنا أقتبس هنا من مركز المساعدة الخاص بالأكاديمية: كما يمكنك التواصل مع فريق الدعم الفني للحصول على المساعدة أو الاستفسار بشكل أكبر من خلال هذا الرابط (مركز مساعدة أكاديمية حسوب).
    1 نقطة
  23. لماذا تريد سحب المال هل يوجد مشكلة في المشروع؟ قم بالتواصل مع ادارة حسوب و اعكهم التفاصيل و سيقومون بحل الموضوع
    1 نقطة
  24. عموماً لايوجد طريقة مباشرة للقيام بذلك لأن GradientDescentOptimizer يقبل معدل تعلم ثابت (غير متغير) لكن للقيام بذلك نستفيد من فكرة أن وسيطة ال learning_rate في باني ال GradientDescentOptimizer يمكن أن يكون موتر (Tensor)، وبالتالي يمكننا استخدام معدل تعلم مختلف في كل خطوة، على سبيل المثال: import tensorflow as tf lr = tf.placeholder(tf.float32, shape=[]) # ... # ... train_step = tf.train.GradientDescentOptimizer(name="myOptimizer" learning_rate=learning_rate).minimize(m) mysess = tf.Session() # تمرير قيم مختلفة لمعدل التعلم في كل خطوة تدريب mysess.run(train_step, feed_dict={lr: 0.1}) mysess.run(train_step, feed_dict={lr: 0.01}) mysess.run(train_step, feed_dict={lr: 0.001})
    1 نقطة
  25. eval تقوم بتقييم ال Tensorالذي قام باستدعائها (دالة نستدعيها من خلال الموتر أي: ()tensor.eval). وسيؤدي استدعاء هذه الطريقة إلى تنفيذ جميع العمليات السابقة التي تنتج المدخلات اللازمة للعملية التي تنتج هذا الموتر "التنسر". وطبعاً قبل استدعاء Tensor.eval، يجب أن يكون قد تم تشغيل البيان الخاص به في جلسة Session، ويجب أن تكون الجلسة الافتراضية متاحة ، أو يجب تحديد الجلسة بشكل صريح. Session.run تقوم أيضاً بتقييم التنسر (run هي دالة نمرر لها الموتر أي: (tensor)Session.run). نستنتج أنه عندما يكون لدينا موتر ما وليكن t فإن استدعاء t.eval يكافئ استدعاء tf.get_default_session().run(t) مثال: import tensorflow as tf t = tf.constant(5.0) mysess = tf.Session() with mysess.as_default(): assert sess is tf.get_default_session() assert t.eval() == mysess.run(t) # لن يعطي خطأ لأنهما متساويتان لكن Session.run نستطيع من خلالها الحصول على قيم أكثر من موتر دفعة واحدة، مثال: t1 = tf.constant(5.0) t2 = tf.constant(4.0) t3 = tf.constant(6.0) mul1 = tf.mul(t1, t2) mul2 = tf.mul(t1,t3 ) with sess.as_default(): # تقييم الموترين دفعة واحدة sess.run([mul1, mul2]) mul1.eval() # تقييم الموتر الأول mul2.eval() # الثاني
    1 نقطة
  26. يتم استخدام SECRET_KEY في العديد من الأماكن المختلفة في مشروغ جانغو Django، وسأوضح ما التأثيرات و الأضرار التي قد تحدث إذا قمت بتغيير الـ SECRET_KEY. قائمة الأشياء التي تستخدم SECRET_KEY بشكل مباشر أو غير مباشر: JSON object signing دوال التشفير لـ salted hmacs أو دعم محرك توليد النصوص والأرقام العشوائية الذي يؤثر على كل من: توليد رمز إعادة تعين كلمات السر password reset token (للمستخدمين والمسؤولين) comment form security: لحماية الموقع من طلبات POST من مواقع غريبة form security: حماية النماذج بشكل عام message tampering، لأنه قد يستخدم ملفات الكوكيز Cookis لنقل البيانات بين ملفات العرض views حماية الجلسات session data وعمل مفاتيح عشوائية للجلسات session keys توليد random salt من أجل إستخدامها في دوال الهاش password hashers توليد كلمات مرور عشوائية passwords، إذا تطلب الأمر عمل مفتاح CSRF ما سوف يتغير عند المستخدم بشكل مباشر عند تغيير قيمة SECRET_KEY هي: الجلسات، سيتم كسر فك تشفير البيانات، وهو صالح لأي خلفية جلسة (ملفات تعريف الارتباط أو قاعدة البيانات أو الملفات المستندة إلى ذاكرة التخزين المؤقت). لن يعمل رمز إعادة تعيين كلمة المرور الذي تم إرساله بالفعل لأي مستخدم، وسيتعين على المستخدمين طلب رمز جديد. لن يتم التحقق من صحة نموذج التعليقات (في حالة استخدام django.contrib.comments) إذا تم طلبه قبل تغيير القيمة (أي إذا تم تحمليه في المتصفح ثم تم تغير الـ SECRET_KEY) وتقديمه بعد تغيير القيمة. أعتقد أن هذا بسيط جدًا ولكنه قد يكون مربكًا للمستخدم. الرسائل (من django.contrib.messages) لن تتحقق من جانب الخادم مثل نموذج التعليقات. بداية من جانغو Django الإصدار 1.10 يمكنك توليد SECRET_KEY جديد من خلال دالة get_random_secret_key على النحو التالي: ./manage.py shell -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
    1 نقطة
  27. بداية من الإصدار 1.7 جانغو Django أصبح بإمكانك إضافة بيانات ديناميكية من خلال المعامل html_message. إذا تم توفير المعامل html_message (قيمته ليست None)، فسيكون بإمكانك أن تستخدم متغيرات في نص البريد الإلكتروني، ولإتمام هذه العملية ستحتاج إلى إستعمال الدالة render_to_string لكي تستطيع عمل النص، وبالتالي يمكنك عمل الرسالة على النحو التالي: from django.template.loader import render_to_string from django.core.mail import EmailMultiAlternatives username = "My Username" msg_plain = render_to_string('templates/email.txt', {'username': username}) msg_html = render_to_string('templates/email.html', {'username': username}) msg = EmailMultiAlternatives('عنوان الرسالة', msg_plain, 'info@example.com', ['username@gmail.com']) msg.attach_alternative(msg_html, "text/html") msg.send() بهذه الطريقة سوف يتم توليد نص البريد الإلكتروني من خلال المتغيرات التي يمكنك تمريرها إلى الدالة render_to_string، وفي النهاية تقوم بإرسالة هذه الرسالة بشكل عادي.
    1 نقطة
  28. يمكن عمل ذلك في جانغو Django ولكن تختلف الطريقة حسب الإصدار الذي لديك، فبالنسبة إلى الإصدار 1.8 وما هو أحدث من جانغو Django، يمكنك أن تستخدم التابع get_fields، على النحو التالي: # نستدعي النموذج هنا from django.contrib.auth.models import User [field.name for field in User._meta.get_fields()] # أو [field.name for field in User._meta.fields] بهذه الطريقة سوف تحصل على قائمة بكل الحقول الموجودة في هذا النموذج. لاحظ أن التابع get_fields سوف يقوم بإرجاع على بعض العلاقات التي لا يمكنك عرضها في view على سبيل المثال. أما بالنسبة للإصدارات الأقدم من 1.8، فيمكنك أن تستخدم التابع get_all_field_names، على النحو التالي: model._meta.get_all_field_names() لاحظ أن هذه الدالة لا تعمل إلا في الإصدارات القديمة وأصبحت متجاهلة deprecated، وتم حذفها بداية من الإصدار 1.10
    1 نقطة
  29. السلام عليكم أخي هناك دورات أكاديمية مجانية كثيرة في اليوتيوب يمكنك الإعتماد عليها في تطوير مهاراتك وهناك أيضا موقع إدراك فهو مجاني ويعطيك شهادة بعد إكمال الدورة إذا تريد تطوير مهارتك يجب عليك التطبيق كثيرا والقيام بالتغذية البصرية وحاول أن تخرج بستايل خاص بك تحياتي
    1 نقطة
  30. الطريقتين السابقتين تعتمدان على إنشاء مايسمى view لكن ماهو هذا ال view وكيف ينتج.. دعنا نفهم ذلك؟ ال view أو المشهد هو عرض جديد للمصفوفة مع نفس البيانات. أو بمعنى أوضح فكما يقول اسمها، إنها ببساطة طريقة أخرى لعرض بيانات المصفوفة. من الناحية الفنية ، هذا يعني أنه تتم مشاركة بيانات كلا الكائنين. هذا العرض الجديد للمصفوفة ينتج في حالتين الأولى عند قيامك بتطبيق مفهوم ال slicing (مثلاً عرض جزء من المصفوفة أو كاملها)، أو تغيير نمط البيانات (أو كليهما). وفيما يلي توضيح أكبر. وله الشكل التالي في بايثون: ndarray.view([dtype][, type]) # الوسيط الأول هو نمط البيانات الذي تريده # الوسيط الثاني نوع العرض الذي سيتم إرجاعه أمثلة، أولاُ سنعطي مثال لكيفية إنتاج مشهد للمصفوفة من خلال مفهوم التشريح أو slicing: # Slice views أخذ شرائح من المصفوفة أو أقسام محددة منها # المصفوفة الناتجة تكون عبارة عن مشهد من المصفوفة الأصلية بحيث تتم مشاركة البيانات import numpy as np arr = np.arange(8) arr # array([0, 1, 2, 3, 4, 5, 6, 7]) # الآن سنطبق مفهوم الشرائح ve = arr[1:2] ve # array([1]) # سنعدل قيمة في المصفوفة الأصلية لنرى فيما إذا كان حقاً قد تم تشارك البيانات arr[1] = 2 # لاحظ كيف تغيرت هي أيضاً ve # array([2]) # مثال آخر ve1 = arr[1::3] ve1 # array([1, 4, 10]) arr[7] = 10 ve1 #array([1, 4, 7]) الآن الطريقة الأخرى لإنتاج مشهد وهي تغيير نمط البيانات (حل مشكلتك): # Dtype views import numpy as np arr = np.arange(8, dtype='int32') arr # array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int32) v = arr.view('float32') v """ array([0.e+00, 1.e-45, 3.e-45, 4.e-45, 6.e-45, 7.e-45, 8.e-45, 1.e-44], dtype=float32) """ # حسناً هنا صحيح أنهما تشاركا البيانات لكن حصل تشويه وهذ منطقي جداً لاختلاف حجم البايت بين النمطين (أنت تحاول تغيير النمط في نفس المكان) للقيم لذا يمكننا أن نعود بعد ذلك لفكرة التشريح # نقوم بإسناد قيم المصفوفة الأصلية ذات النمط الصحيح إلى المشهد ذو القيم الحقيقية v[:]=arr v[:] # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) #وبالتالي هنا نكون حصلنا على مانريده # الآن لو نظرنا لقيم المصفوفة الأصلية arr """ array([ 0, 1065353216, 1073741824, 1077936128, 1082130432, 1084227584, 1086324736, 1088421888], dtype=int32) """ # ولو قمنا بتعديل أي قيمة فيها arr[2]=0 v # array([0., 1., 0., 3., 4., 5., 6., 7.], dtype=float32) # نلاحظ أن التعديل أنتقل إلى المصفوفة هذا يعني أنهما يتشاركان البيانات ########################################################################### #false مع تحديد النسخ على Astype بالنسبة لاستخدام #view فلا أظنها ترجع # كما أنني لم ارى ذلك في التوثيق # انظر للمثال التالي import numpy as np arr = np.arange(8, dtype='int32') arr # array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int32) vv = arr.astype(np.float32, copy=False) vv # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) arr[0]=5 arr # array([5, 1, 2, 3, 4, 5, 6, 7], dtype=int32) vv # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) # لاحظ أنه لم يحدث أي تغيير لذا لاأظنها حلاً لمشكلتك
    1 نقطة
  31. قد ينتح هذا الخطأ في كثير من السيناريوهات أيضاً. بالنسبة لحالتك فإن المعامل not يطبق لنفي قيمة لكن لايمكنك تطبيقه لنفي عدة قيم في نفس اللحظة، وبالتالي عندما تمرر له مصفوفة سيعتبر أن ماقدمته له هو شيء غامض ولايستطيع التعامل معه لأنه يحوي عدة قيم، وبالتالي يقترح عليك أن تستخدم التابعين a.all() أو a.any() حسب ماتحتاج. الآن أنت تريد أن تعرف فيما إذا كانت مصفوفتك هي None أم لا وبالتالي تحاول استخدام not وكما نعرف فإن not None يعطي True وهذا جيد. الآن فكرتك هي أنه عندما تطبق not على مصفوفة سيعطيك False لأنه تحوي قيم (أي أنها تعتبر True)، أو حسب الكود الخاص بك لايعطي شيئ. ولكن هذا لن ينجح وسيعطيك الخطأ المذكور، وبالتالي لحل المشكلة سنستخدم التابعين اللذين اقترحهما بايثون، لكن في حالتنا فإن التابع الذي نحتاجه هو any، لكن قبل ذلك دعني أشرح لك مبدأ عمل هذا التابع، حيث أنه يقبل وسيط من أي نوع ويختبر فيما إذا كانت أي قيمة من قيمه على الأقل هي True فإذا وجد true يرد true وإلا false وهذا مانحتاجه، انظر للأمثلة: # لإرضاً نريد معرفة فيما إذا كان هنا عنصر واحد على الأقل من المصفوفة يحقق شرط معين # أي مثلاً هل يوجد أي قيمة أكبر من 0 arr = np.array([1,2]) arr>0 # array([ True, True]) np.any(arr>0) #true بالتالي سيعطي true هنا سيجد قيمة #true تمرير قيمة وحيدة سيعتبرها np.any(5) #true # لكن لو مررت 0 فسيعطي فالس لأن ال0 تقابل الفالس في بايثون np.any(0) # false # هنا سيرد none np.any(None) #False هنا سيرد np.any(False) وبالتالي يصبح الكود: import numpy as np def check(x): if not np.any(arr): print("It's None") else: print ("It's an array") arr = None check(arr) # It's None arr = np.array([1,2]) check(arr) # It's an array كما ويمكنك استخدام is None كما أشار الأستاذ محمد. كما ويمكننا استخدام فكرة نمط المصفوفة، فكما نعلم بأن المصفوفات في نمباي هي من النمط np.ndarray وبالتالي فيمكنك اختبار فيما إذا كانت الوسيط الممرر للتابع هو من هذا النمط أم لا من خلال التابع isinstance: import numpy as np def check(x): if isinstance(x, np.ndarray): print ("it's not") else: print("It's None") arr = None check(arr) # It's None arr = np.array([1,2]) check(arr) # It's an array
    1 نقطة
  32. كما هو معروف فإن البيانات تقسم إلى ٣ أقسام . بيانات تدريب training set وبيانات نقيس عليها تقدمنا خلال عملية التدريب validation set وبيانات نختبر عليها النموذج النهائي test set. وكما نعلم فإن بيانات التدريب هي بيانات مرئية أي أن النموذج يتدرب عليها ويعرف نتيجة كل عينة من البيانات. أما بيانات التحقق وبيانات الاختبار فلايعرف النموذج نتائجها أي أنها بيانات غير مرئية. والهدف من كونها غير مرئية هو قياس كفاءة النموذج الحقيقية. الآن دعنا نعود إلى بيانات ال Validation ... عندما نقوم بتدريب نموذج في التعلم الآلي (مثلاً نموذج لتصنيف الصور) فإن أهم شيئ نحتاجه هو تحديد بروتوكول لقياس عملية التقدم خلال عملية التدربب (تحديد طريقة تمكننا من معرفة سلوك عملية التدريب بغية تجنب ال overfitting وبغية ضبط معاملات النموذج العليا مثل عدد الطبقات أو الخلايا أو نوع الطبقات أو حجم الباتش ..الخ). وهناك عدة بروتوكولات أشهرها ال Cross Validation وتعتمد على أخذ عينة جزئية من بيانات التدريب وقياس دقة النموذج accuracy عليها بعد كل فترة (epoch) من عملية التدريب وهذه القيمة هي مايشار لها ب val_acc أما ال acc فهي دقة النموذج على بيانات التدريب. نحن بحاجة دوما لمراقبة هاتين القيمتين خلال تدريب النموذج ؟ لماذا؟ كما قلت لكي نقيس سلامة التقدم.. فخلال التدريب فإن الشيئ المؤكد دوماً هو أن ال acc ستزداد وتتحسن وهذا يكون إشارة إلى أن النموذج يتعلم من البيانات. لكن هذا قد يجعل النموذج يقع في ال OF وهذا ما لانريده بالطبع ..حسناً إذن كيف سنعرف متى يحدث ال OF منأجل أن نوقف علية التدريب؟ الجواب هو من خلال ال val_acc فطالما أنها تزداد مع ازدياد ال acc فهذا يعني أن النموذج مازال يتعلم ويسلك سلوك صحيح أي أن النموذج قادر على تعميم Generlaization ماتعلمه على بيانات جيدة لم يراها من قبل. أما عندما يستمر ال acc بالتحسن وتبدأ ال val_acc بالانهيار (بالانخفاض) فهذا يعني أن نموذجك لم يعد قادراً على التعلم أكثر من البيانات وبدأ يحفظها (حالة OF ) وهنا ينبغي أن نوقف عملية التدريب لأن النموذج لن يكون قادرا على تعميم مايتعلمه. ولهذا السبب نحن بحاجة لها. أما بابنسبة لل loss فهي قيمة التكلفة على بيانات التدربب و المحسوبة من دالة التكلفة التي حددتها للنموذج. أما val_loss فهي الخاصة ببيانات ال validation.
    1 نقطة
  33. من خلال np.isnan يمكنك معرفة ذلك، كل شيئ موضح في الكود التالي: import numpy as np a=np.array([[ 1. , 2.],[ 3. ,np.nan]]) a """ array([[ 1., 2.], [ 3., nan]]) """ # isnan #nan في مكان تواجد قيمة true هذا التابع يرد مصفوفة بوليانية بحيث تضع np.isnan(a) """ array([[False, False], [False, True]]) """ #وبالتالي nan أصغر قيمة هي دوماً np.min(a) #nan ترد np.isnan(np.min(a)) # True #لجمع عناصر مصفوفة تحوي قيم غير معرفة سيعطي نتيجة غير معرفة sum استخدام np.sum(a) # nan # وبالتالي np.isnan(np.sum(a)) # True ومن ناحية الأداء فاستخدام sum أفضل: a = np.random.rand(100000) %timeit np.isnan(np.min(a)) """ 10000 loops, best of 3: 153 us per loop """ %timeit np.isnan(np.sum(a)) """ 10000 loops, best of 3: 95.9 us per loop """ # سأضع قيمة نان لإحدى الخلايا a[2000] = np.nan %timeit np.isnan(np.min(a)) """ 1000 loops, best of 3: 239 us per loop """ %timeit np.isnan(np.sum(a)) """ 10000 loops, best of 3: 95.8 us per loop """ a[0] = np.nan %timeit np.isnan(np.min(a)) """ 1000 loops, best of 3: 326 us per loop """ %timeit np.isnan(np.sum(a)) """ 10000 loops, best of 3: 95.9 us per loop """ نلاحظ أن min يكون أبطأ في وجود NaN أما في غيابها أسرع. أيضا يصبح أبطأ مع اقتراب NaN من بداية المصفوفة. من ناحية أخرى ، sum تبدو ثابتة بغض النظر عما إذا كانت هناك NaNs أو لا.
    1 نقطة
  34. يمكن استخدام الدالة numpy.multiply كالتلي: import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) np.multiply(a,b) """ array([[ 5, 12], [21, 32]]) """ كما ويمكنك استخدام المعامل *: import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) a*b """ array([[ 5, 12], [21, 32]]) """
    1 نقطة
  35. حسناً أنت لديك قائمة من المصفوفات، لذا للقيام بذلك هناك عدة طرق، أولها استخدام الدالة stack حيث تقوم هذه الدالة بتكديس المصفوفات على المحور المحدد لها (طبعاً يجب أن تكون المصفوفات متجانسة في الأبعاد بالنسبة للمحور المحدد لكي يتم التكديس): import numpy li = [numpy.array([ 3, 5]),numpy.array([ 3, 5])] # [array([3, 5]), array([3, 5])] numpy.stack( li, axis=0 ) # التكديس على المحور العمودي """ array([[3, 5], [3, 5]]) """ numpy.stack( li, axis=1 ) ألأفقي """ array([[3, 3], [5, 5]]) """ أما بالنسبة للدالة concatenate فلايمكنك استخدامها في حالتك مباشرةً، حيث أن هذه الدالة تتطلب أن تكون المصفوفات متجانسة الأبعاد أي يجب أن تكون كل المصفوفات ثنائية البعد حتى تعمل، في الرابط التالي كل شيئ تحتاجه لمعرفة كيفية عملها: أما إذا أردت تطبيقها على مثالك فلن ينجح ذلك لأن np.array([1, 2, 3]) تمثل شعاع أي ببعد واحد أما np.array([[4, 5, 6],[7, 8, 9]]) تمثل مصفوفة ثنائية وبالتالي لايمكن استخدام هذه الدالة لربطهما بالشكل الذي تريده. وسيعطي خطأ انظر: import numpy as np lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])] np.concatenate(lst, axis=0 ) """ ValueError: all the input arrays must have same number of dimensions... لذا يجب عليك توسيع أبعاد المصفوفة الأولى قبل أن تستخدمها ولكن هذا سيكون مكلف، لذا فإن أفضل حل هو استخدام Stack. أو vstack : import numpy as np lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])] np.vstack( lst ) """ array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) """ كما يمكنك استخدام row_stack: import numpy as np lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])] np.row_stack( lst ) """ array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) """
    1 نقطة
  36. في النسخ الأحدث من كيراس تم نقلها إلى الموديول keras.layers.convolutional لذا يجب أن تستوردها بالشكل: from keras.layers.convolutional import Conv2D أو من خلال تنسرفلو فهي من الموديول tensorflow.keras.layers: from tensorflow.keras.layers import Conv2D
    1 نقطة
  37. كما أجاب محمد، وأيضاً قد يكون الكود التالي جيداً لتحسين محركات البحث: <Link href="/timer" passHref> <Tab component="a" label="Timer" /> </Link> حيث أن Link لاتضيف href للابن حتى لو كان مكوناً. و passHref يفرض هذا، ولكن لا يمكن وضع منع PreventionDefault في onClick كما هو مذكور في توثيق MUI لأنه لن يغير عنوان URL.
    1 نقطة
  38. أقترح عليك الخيارات الآتية: - إن كان بإمكانك بدء المشروع بأقل من هذا المبلغ، أعني على الأقل البدء ولو من دون تنفيذ جميع أفكار المشروع، اي البدء بالإمكانيات الموجودة، أنصحك بشدة ذلك حتى لا تكون مدينا لأحد. - إن كان يتعذر قيام المشروع سوى بالمبلغ المذكور كاملا يمكنك اقتراض بعض المال من عائلتك أو اصدقائك، 700 دولار ليس بالشئ الكثير، ويمكنك جمعه بسهولة. - هناك خيار آخر وهي أن تدخل معك شريك يدخل بماله وأنت بفكرتك وتتفاهمان حول العمل واقتسام الارباح. - هناك بعض المواقع التي تمول المشاريع ابحث في جوجل يمكنك أن تجد ضالتك. - حل أخير وهو أن تعمل في مواقع العمل الحر يمكنك جمع رأس مالك في شهر أو اقل. بالتوفيق
    1 نقطة
×
×
  • أضف...