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

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

  1. Ali Haidar Ahmad

    Ali Haidar Ahmad

    الأعضاء


    • نقاط

      11

    • المساهمات

      1068


  2. Mohamed Elnemr

    Mohamed Elnemr

    الأعضاء


    • نقاط

      7

    • المساهمات

      54


  3. Najah Alsaker

    Najah Alsaker

    الأعضاء


    • نقاط

      6

    • المساهمات

      543


  4. Amer Abdallah

    Amer Abdallah

    الأعضاء


    • نقاط

      5

    • المساهمات

      150


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

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

  1. لدي نموذج User ويمكنني أن أقوم بإرجاع كل المستخدمين من خلال الكود التالي: User.objects.all() ويقوم السطر السابق بإرجاع النتيجة التالية: # Name, role, age Amer, Admin, 22 Adam, user, 18 khaled, user, 23 Salah, Admin, 25 ما أريد القيام به هو تطبيق خاصية SQL وهي GROUB BY على الحقل role، كالتالي: User.objects.all().group_by('role') بالطبع الكود السابق لا يعمل. أعلم أنه يمكننا القيام ببعض بشيء مشابهة من خلال ملف django/db/Models/query.py ، لكني أريد أن أقوم بذلك بطريقة مباشرة مثل باقي الإستعلامات العادية.
    3 نقاط
  2. لدي بيانات على هيئة dataframe حيث تحتوي علي عمود به التاريخ على الشكل التالي: 1/1/2021 والذي يتم تعريفة تلقائية بالنوع object قمت باستخدام الكود التالي لتحويل نوعه : df['DOB'] = pd.to_datetime(df['DOB']) >>> dtype: DOB datetime64[ns] لكن شكله تحول لهذا الشكل 2021-08-26. أريد أن أقوم بتحويله بحيث يكون على هذا الشكل 08/26/2021، كيف يمكنني فعل هذا؟
    2 نقاط
  3. أريد أن أزيد من عدد الأعمدة التي تظهر على الشاشة عن استخدام dataframes، فمثلا عندما أقوم باستخدام دالة describe على dataframe وكان عدد الأعمدة أكبر من 5 لا تظهر كل الأعمدة بل تظهر التالي: >> Index: 8 entries, count to max >> Data columns: >> 1 8 non-null values >> 2 8 non-null values >> 3 8 non-null values >> 4 8 non-null values >> 5 8 non-null values >> 6 8 non-null values >> 7 8 non-null values كيف يمكنني زيادة حجم الشاشة لتظهر عدد أكثر من الأعمدة؟
    2 نقاط
  4. مرحبا قمت بأنهاء مشروع react وقمت باستضافته وكل شيء يعمل دون مشاكل باستثناء مشاركة صفحات الموقع لا تظهر معلومات الخاصة بالصفحات مثلا صفحة الكتاب الواحد لدي أضفت فيها المعلومات بمكتيه helmet <Helmet> <title>{data.title}</title> <meta name="title" content={data.title} /> {/* <meta name="description" content={data.description} /> */} <meta property="og:title" content={data.title} /> <meta property="og:url" content={`....${data.id}`} /> <meta property="og:type" content="book" /> {/* <meta property="og:description" content={data.description} /> */} <meta property="og:image" content={`${process.env.REACT_APP_STORAGE}/${data.cover}`} /> </Helmet> المشكلة ان المعلومات تظهر تظهر في ادوات المطور element لكن لا تظهر في page source وعند مشاركة الصفحة في وسائل التواصل الاجتماعي لا تظهر مغلومات ال meta فما المشكلة
    2 نقاط
  5. لدي موقع ويب مبني باستخدام إطار العمل express.js ويتطلب التسجيل وتسجيل الدخول للمستخدمين. وأرغب بإضافة خاصية عندما يحاول المستخدم التسجيل ببريد الكتروني موجود مسبقاً إظهار رسالة خطأ بشكل مباشر لقد قمت بإضافة التالي: <% if (message.length > 0) { %> <div class="alert alert-danger"><%= message %></div> <% } %> ثم في مسار التوجيه قمت بإضافة التالي للتأكد من عملها: router.get('/register', function(req, res) { res.render('/register', { message: req.flash('register message here') }); }); ثم وضعت الإعدادات التالية: app.configure(function() { app.use(express.session({ secret : 'topsecrethere' })); }); ولكن لم تعمل معي الآلية السابقة. كيف يمكنني تطبيقها بشكل صحيح؟
    2 نقاط
  6. ما هى أفضل مكتبات الانيميشن المتاحة ف الرياكت نيتف وما هى افضل واحده من حيث الاستخدام ؟
    2 نقاط
  7. لدي بيانات على الشكل التالي: Station ID Pollutants 1000 {"col1": "46", "col2": "3", "col3": "12"} 1001 {"col1": "36", "col1": "5", "col3": "8"} 1002 {"col2": "2", "col3": "7"} 1003 {"col3": "11"} 1004 {"col1": "82", "col3": "15"} وأريد تحويلها الى الشكل dataframe بحيث يكون العمود الثاني pollutants متقسم الى عدة أعمدة كالتالي: Station ID col1 col2 col3 1000 46 3 12 1001 36 5 8 1002 NaN 2 7 1003 NaN NaN 11 1004 82 NaN 15 كيف يمكنني أن أفعل هذا بسهولة؟
    2 نقاط
  8. استخدم نفس الطريقة الاعتيادية الموجودة بالموقع لرفع الملفات ولكنه بالرغم من ذلك لا يتم رفعها Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\coffee>git init Reinitialized existing Git repository in C:/coffee/.git/ C:\coffee>git add . warning: LF will be replaced by CRLF in dist/css/product1.css. The file will have its original line endings in your working directory warning: LF will be replaced by CRLF in dist/css/style.css. The file will have its original line endings in your working directory warning: LF will be replaced by CRLF in dist/main.js. The file will have its original line endings in your working directory C:\coffee>git add . C:\coffee>git commit -m "first commit" [main 9738844] first commit 11 files changed, 16 insertions(+), 13 deletions(-) rewrite dist/contact.html (67%) rewrite dist/distributors.html (90%) rewrite dist/history.html (95%) rewrite dist/index.html (93%) rewrite dist/product1.html (95%) rewrite dist/product2.html (95%) rewrite dist/product3.html (91%) C:\coffee>git branch -M main C:\coffee>git remote add origin https://github.com/najah18/cof.git error: remote origin already exists. C:\coffee>git push -u origin main Username for 'https://github.com': najah18 Password for 'https://najah18@github.com': remote: Support for password authentication was removed on August 13, 2021. Plea se use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requireme nts-for-git-operations/ for more information. fatal: Authentication failed for 'https://github.com/najah18/coffee.git/' C:\coffee>
    2 نقاط
  9. من الأساسيات المهمة لمدونتك كتابة كلمات مفتاحية لها تمتاز بقيمتها العالية، لكن البحث عن كلمات مفتاحية يُعَد أمرًا صعبًا، حيث أن إيجاد الكلمات المفتاحية الشائعة مجرد بداية، لذا عليك الارتقاء بمدونتك من جهة ومعرفة أي الكلمات تعرّض منافسيك للخطر من جهة أخرى، وإذا أردت الارتقاء بمدونتك بطريقة طبيعية، فعليك استخدام طريقة تحسين محركات البحث سيو SEO، وكلما زاد فهمك لهذه الطريقة، زادت احتمالية وصولك إلى جمهور أكبر، وسنتحدث في هذا المقال عن عملية من أربع مراحل لتحديد الكلمات المفتاحية التي يجب استخدامها. 1. ابحث عن الكلمات المفتاحية المحتملة باستخدام أداة Ubersuggest توجد العديد من الأدوات التي يمكن استخدامها للبحث عن الكلمات المفتاحية، والخيار الأول في حال كان حجم البيانات هائلًا هو Google Keyword Planner، وطبعًا ليس هو الخيار الجيد الوحيد، فهناك أداة أخرى مجانية وسهلة الاستخدام وهي أداة Neil Patels’ Ubersuggest التي تسمح بالبحث عن اقتراحات لكلمات مفتاحية باستخدام فئات متعددة مع بعض المحددات، فإذا بحثت عن مصطلح لوصفة ما، فستحصل على أكثر من 500 كلمة مفتاحية كما هو موضح في الصورة الآتية: وكما ترى، تنقسم الكلمات المفتاحية إلى اقتراحات، وكلمات ذات صلة في السياق وأسئلة، وحروف جر وموازنات. وعادةً ما تكون الكلمات المفتاحية الطويلة للمدونات الجديدة في المقدمة بسبب وجود منافسة أقل، كما أنه إذا ألقيت نظرةً سريعةً على الأسئلة وحروف الجر والموازنات، فستجد العديد من الخيارات العملية: الأهم من ذلك هو أن Ubersuggest يتضمن بعض بعض نقاط الصعوبة الأكثر موثوقية الصعوبة والموثوقية في المجال، وهنا ما يجب فعله مع احتمالات الكلمات مفتاحية: ابحث عن بدائل طويلة باستخدام المرشحات المذكورة في الأعلى (الأسئلة وحروف الجر والموازنات). ضع قائمةً للاقتراحات ذات الصلة مكونة من عشرة مصطلحات أو أكثر. افصل الاقتراحات ذات عدد المصطلحات الأكبر (بالمئات). سترغب في هذه المرحلة بدمج قائمتين من الكلمات المفتاحية المحتملة، بحيث تتضمن إحداها العدد الأكبر من المصطلحات والأخرى تتضمن الباقي. وللحصول على نتيجة أفضل، ركّز على القائمة ذات المصطلحات المناسبة واستخدام الباقي مثل كلمات مفتاحية في المحتوى، ومع ذلك سيبقى الكثير من عمليات الترشيح التي تعطي نتائج / مؤشرات الصعوبة. 2. حلل نتائج الصعوبة للكلمات المفتاحية تتضمن معظم أدوات البحث عن الكلمات المفتاحية ما يسمى بنتائج الصعوبة لكل الاقتراحات المقدمة لك (إلا إذا لم يكن هناك بيانات كافية)، وباختصار ستكون النتيجة من 1-10 بحيث تشير لمدى صعوبة تقدم المدونة باستخدام كلمة مفتاحية محددة؛ أما بالنسبة لمدونة جديدة، فإن نتائج الصعوبة المثالية تكون بين 0-20، مما يعني أن كلمة مفتاحية محددة ستجعلك تتقدم بسهولة، ومع ذلك يُرجح أن يكون عدد مصطلحات البحث لهذه الكلمات المفتاحية أقل، وبالتالي مستوى منافسة أقل. وقد لا تجد العديد من الكلمات التي تستطيع استخدامها بهذا المدى، لذا ستضطر للبحث عن المزيد، ويُعَد النطاق بين 20-50 لنتائج الصعوبة هو الوسط الأفضل، كما يشير هذا النطاق إلى وجود منافسة على كلمة مفتاحية محددة ولكنها ليست كبيرة بحيث لا تستطيع مجاراتها؛ أما بالنسبة للنتائج الأكبر من 50، فيصعب التقدم بها في موقع إلكتروني جديد ليس لديه صلاحيات كبيرة. والآن بعد التعرف على ماهية نتائج الصعوبة، رتّب قائمة بالكلمات المفتاحية التي جمعتها في الخطوة الأولى، ثم ابدأ بحذف أي كلمات ذات نتائج صعوبة أكبر من 50، وتسهيلا للأمر ضع جميع المعلومات في جدول واحد لتضيف المزيد من البيانات إليها باستخدام نهج منظم. 3. انظر إلى ما يفعله منافسوك يكون التحدي الحقيقي عندما يكون الأمر متعلقًا بالتقدم باستخدام كلمة مفتاحية تعمل بشكل أفضل من كلمات منافسيك، ولفعل ذلك يتوجب عليك إجراء بعض الأبحاث، مما يعني أخذ الكلمات المفتاحية التي جمعتها واحدةً بواحدة، واستخدام محرك البحث Google وتحليل النتائج، ولنفرض مثلًا أنك تريد استهداف كلمة مفتاحية للموازنة بين وصفتي طعام، حيث ستظهر هنا أفضل النتائج: تكون معظم النتائج الأولى عبارة عن تصنيفات بسيطة للاختلافات بين الوصفتين، ولكن عند فتحها ستظهر لك تصنيفات أفضل 3 نتائج: منشور بسيط على مدونة مع وصفة بدون تنسيق (وهو أمر مرفوض تمامًا). لدينا منتديات مع العديد من الإجابات. منشور شامل يتضمن عناوين فرعية وقوائم ووصفة كاملة وتعليمات وحتى فيديو. وبالتالي ستصعب منافسة النتيجة الثالثة لأنها متكاملة. وللوصول إلى هذه المرحلة، يجب كتابة المحتوى بتنسيق وصور وكلمات مفتاحية أفضل، وعلى الرغم من الحالات الاستثنائية؛ يُظهر ذلك البحث السريع أنه من السهل التقدم باستخدام مصطلح للموازنة بين وصفتين، وبالتأكيد يحتاج الحصول على المرتبة الأولى إلى المزيد من الجهد. يعطي هذا البحث فكرةً حول نوع المحتوى الذي يجب كتابته لكل كلمة مفتاحية. أضف تلك المعلومة إلى قائمتك بجانب كل مصطلحات البحث فورًا لتتعرف على الأفكار التي ستبني عليها. 4. ابحث عن كلمات مفتاحية ذات صلة ويمكن استخدامها هناك معلومات أخرى يمكن أخذها من نتائج محرك البحث Google عندما يكون الأمر حول الكلمات المفتاحية المقترحة كما سنرى فيما يلي عند البحث عن أي مصطلح والانتقال إلى أسفل النتائج: ستعطي معظم أدوات البحث معلومات مرتبطةً بالمصطلح الذي بحثت عنه، ولكن نتائج بحث Google ترشح البيانات حتى تصل لأكثرها ارتباطًا بالمصطلح نفسه، وأفضل ما يمكن فعله هو أخذ الكلمات المفتاحية وتحديد أيها يمكن استخدامه في المحتوى المراد كتابته، فقد يكون المحتوى الأفضل هو كتابة شاملة حول كيفية طبخ الوصفتين بالإضافة إلى الفروقات الموجودة بينهما (ستكون هناك نقاط إضافية عند إضافة قصة كل منهما). وبأخذ ذلك في الحسبان، يمكن التخلص من المصطلحات ذات الصلة التي لا تناسب الجمهور المتوقَع، وبالتالي لن يكون استخدامها ضروريًا؛ أمّا الآن خذ الكلمات المفتاحية المتبقية وأضفها إلى الجدول. وهذا ما يجب أن تبدو عليه كيفية إدخال واحد في القائمة: هذه جميع المعلومات التي تحتاجها للبدء بتجميع جدول المحتويات الذي يستهدف الكلمات المفتاحية التي تقدم أفضل الفرص للتقدم في فترة زمنية قصيرة، ويعتمد ترتيب كتابة المحتوى عليك، ولكن يُفضَّل البدء باستخدام الكلمات المفتاحية الجيدة في نتائج الصعوبة وحجم نتائج البحث. قد يبدو ذلك صعبًا وتريد نشر المحتوى باستمرار، لذا يمكنك البدء بالترتيب الذي تريده. الخاتمة ستجد العديد من الكلمات المفتاحية عند البحث عن مصطلحات شائعة، لذلك ستحتاج إلى تحديد أي الكلمات تستحق الاستخدام، وأي المصطلحات تعطي أفضل النتائج في وقت قصير، وعليك أيضًا معرفة كيفية التغلب على المنافسين فيما يتعلق بالمحتوى، فالأمر ليس سهلًا وسيتطلب الكثير من العمل، بينما إذا خصصت بضع ساعات كل شهر أو اثنين، فسيكون بإمكانك التخطيط لجدول محتوى يعطي أفضل النتائج الممكنة، وهنا نلخص كيف تبدأ: ابحث عن الكلمات المفتاحية المحتملة باستخدام أداة Ubersuggest حلل نتائج الصعوبة للكلمات المفتاحية. انظر إلى ما يفعله منافسوك. ابحث عن كلمات مفتاحية ذات صلة ويمكن استخدامها. ترجمة-وبتصرف-للمقال How to Find High-Value Keywords For Your Blog لكاتبه Alexander Cordova. اقرأ أيضًا دليل البحث عن الكلمات المفتاحية للمسوق بالمحتوى 5 أدوات SEO مجانية تساعدك في تطوير مدونتك البحث عن الكلمات المفتاحية المناسبة لمدونتك 7 إضافات لتحسين ترتيب ظهور موقعك في محركات البحث
    1 نقطة
  10. السلام عليكم 1-اريد جعل الازرار في الاسفل عند الضغط عل كل واحد ينقل صوره معينه ولكن دائما" تحدث معي مشكله وتظهر اسفل الصفحه وغير ذلك 2-ال timer ينقل الصور بشكل غير مناسب وينقلها بسرعه مع اني قمت بعمل انيميشن للانتقال فاريد جعل ال timer يعمل والازرار بشكل مناسب . templete 1.zip
    1 نقطة
  11. أريد أن أكون قادرًا على عرض المنشورات التي أضافها المستخدم (تم إدراجها كمنشئ creator) أو تمت الموافقة عليها من قِبل مسؤول. ما أحاول أن أقوم به هو تنفيذ جملة SQL التالية: posts.creator = 'owner' or posts.accepted = True كيف أفعل هذا في جانغو Django؟
    1 نقطة
  12. لدي بيانات على شكل Dataframe وأريد استبدال قيم بعض العناصر التي تتخطى قيمتها 100 وأقوم بجعلها تساوى الصفر، فكرت باستخدام الكود التالي: df[df.my_channel > 100].my_channel = 0 لكنه لم يفلح، كيف يمكنني فعل هذا؟
    1 نقطة
  13. لماذا مكون ال head لا يعرض معلومات ال meta ويرسلها أثناء server side rendering function Book({ getBook, addBook, removeBook, auth, cart, book }) { ....... return ( <Box m={['0', '5%']}> {data && <Filter categories={data.bookCategories} publishers={data.publishers}></Filter>} <Box mt="50px"> <Box> {!data && ( <Box textAlign="center"> <Spinner size="xl" /> </Box> )} <Grid pr={['2%', '2%', '7%', '7%']} pl={['2%', '2%', '7%', '7%']} templateColumns={['1fr', '1fr', '0.5fr 2fr', '0.5fr 2fr']} gap="10px" > {data ? ( <> <Head> <title>{book?.title}</title> <meta name="title" content={book?.title} /> <meta name="description" content={book?.description} /> <meta property="og:title" content={book?.title} /> <meta property="og:url" content={`${process.env.NEXT_PUBLIC_BASE}/book/${book?.id}`} /> <meta property="og:type" content="book" /> <meta property="og:description" content={book?.description} /> <meta property="og:image" content={`${process.env.NEXT_PUBLIC_STORAGE}/${book?.cover}`} /> </Head> </Grid> </Box> </Box> </Box> ); } const mapStateToProps = (state) => { return { cart: state.cart, auth: state.auth }; }; const mapDispatchToProps = (dispatch) => { return { getBook: (id) => dispatch(getBook(id)), addBook: (book) => dispatch(addBook(book)), removeBook: (book) => dispatch(removeBook(book)), }; }; export async function getServerSideProps({ params }) { const res = await axios.get(`${process.env.NEXT_PUBLIC_API}/books/${params.id}`); return { props: { book: res.data, }, }; } export default connect(mapStateToProps, mapDispatchToProps)(Book);
    1 نقطة
  14. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.9/userguide/command_line_interface.html#sec:command_line_warnings 12 actionable tasks: 2 executed, 10 up-to-date
    1 نقطة
  15. أحاول أن أفهم الفرق بين select_related و prefetch_related، ووجدت في توثيق جانغو Django النص التالي: ماذا يعني القيام بـ "joining" في بايثون؟ هل يمكن لشخص أن يوضح لي هذا الأمر؟ وحسب إعتقادي أننا نستعمل select_related في حالة وجود علاقة بـ foreign key، ونستخدم prefetch_related عندما يكون هناك علاقة many to many، هل هذا صحيح أم أن هناك إختلاف آخر؟
    1 نقطة
  16. يمكنك أن تستعمل الحزمة django-settings-export، حيث تمكنك من إستخدام متغيرات معينه من ملف settings.py داخل أي قالب template بشكل سهل للغاية. اولًا عليك تثبيت الحزمة من خلال الأمر التالي: pip install django-settings-export بعد ذلك يجب أن تقوم بإعداد ملف settings.py ليشمل الكود التالي: # هنا تخبر Django بأن يقوم بتشغيل هذه الحزمة في القوالب TEMPLATES = [ { 'OPTIONS': { 'context_processors': [ 'django_settings_export.settings_export', ], }, }, ] # هذا مثال لمتغير وسوف نستخدمه في القوالب MY_TEST_DATA = 'any content goes here'; # في هذا الجزء تقوم بكتابة المتغيرات التي تريد إستخدامها في القوالب # لاحظ ان المتغيرات تكتب بشكل نص SETTINGS_EXPORT = [ 'MY_TEST_DATA', ] بعد ذلك يمكنك ان تستخدم المتغير MY_TEST_DATA، كالتالي: <script>var customVar = '{{ settings.MY_TEST_DATA }}';</script> ويمكنك تغير كلمة settings لأي شيء آخر (في حالة حدوث تعارض مع حزمة أخرى)، من خلال عمل متغير SETTINGS_EXPORT_VARIABLE_NAME في ملف settings.py، كالتالي: # نقوم بإعطاء المتغير أي قيمة نصية # يجب ألا تحتوي على مسافات، فقط حروف لاتينية وعلامة _ SETTINGS_EXPORT_VARIABLE_NAME = 'my_config' # في القالب {{ my_config.MY_TEST_DATA }} في حالة كنت تستخدم Django بإصدار اقدم من 1.8 فيجب أن تستخدم الكود التالي لإعداد الحزمة: TEMPLATE_CONTEXT_PROCESSORS = [ 'django_settings_export.settings_export', ]
    1 نقطة
  17. أعلم أنه يمكننا قياس زمن تنفيذ استدعاء sess.run، ولكن هل من الممكن الحصول على تفاصيل أكثر دقة مثل حساب زمن تنفيذ كل عقدة من البيان؟
    1 نقطة
  18. لقد حاولت تحميل إطار العمل express.js ضمن مشروعي من خلال الأمر التالي: npm install -g express ولكن تفشل عملية التحميل ويظهر لي هذا الخطأ: npm ERR! Error: EACCES, open '/Users/.npm/c1557b53-express.lock' npm ERR! { [Error: EACCES, open '/Users/.npm/64a534c1-express.lock'] npm ERR! errno: 3, npm ERR! code: 'EACCES', npm ERR! path: '/Users/.npm/64a534c1-express.lock' } npm ERR! npm ERR! Please try running this command again as root/Administrator. npm ERR! command "node" "/usr/local/bin/npm" "install" "-g" "express" npm ERR! cwd /Users/ npm ERR! path /Users/.npm/64a534c1-express.lock npm ERR! code EACCES npm ERR! errno 3 npm ERR! stack Error: EACCES, open '/Users/.npm/64a534c1-express.lock' npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /Users/npm-debug.log npm ERR! not ok code 0 كيف يمكنني حل هذه المشكلة؟
    1 نقطة
  19. افضل كتاب لتعلم البرمجه بلغة بايثون بالانجليزي (((((للمبتدئين)))))
    1 نقطة
  20. ما الذي تعنيه الملاحظة الموجودة في الأسفل بأنه يحتوي هذا التصنيف على أرشيف المسارات القديمة التي استبدلت بمسارات أحدث. ان لم تبدأ بهذه المسارات فأنت على الأغلب لا تحتاجها. هل تعني أنها ليست مهمه؟
    1 نقطة
  21. كيف ابد الدورة هل هيه مقالات او حضور مقاطع او ماذا؟؟؟
    1 نقطة
  22. جميع الدورات المُتاحة على الأكاديمية مدفوعة و هي عبارة عن دروس مرئية (مقاطع فيديو) مُسجلة مُسبقاً بعد الإشتراك و تسجيل حسابك في الدورة ستتمكن من الوصول إلى هذه الدروس، الدروس مٌقسمة على مسارات رئيسية و كل مسار بدوره مقسم على مسارات فرعية و دروس. طريقة المتابعة هي بحضور الدرس و مشاهدة محتواه و التطبيق المكثف على الدرس بالطريقة التي ترغب فيها و تُحبها إن واجهتك مُشكلة ما أو أردت الإستفسار يُمكنك ذلك من خلال صندوق تعليقات تجده أسفل الدرس تطرح من خلاله إستفسارك بشرح كافي للمُشكلة التي تواجهها بعد ذلك سيقوم فريق المُدربين المساعد بالإجابة على استفسارك و توضيح الشيء الذي تريد. و هكذا تمضي في متابعة دروس الدورة. لكن أهم شيء لرفع مستواك هو التطبيق العملي. في الأخير يُمكنك إجتياز الإمتحان و الحصول على الشهادة. هناك عدة شروط لإجتياز الإمتحان يُمكنك الإطلاع عليها من: الامتحان والحصول على الشهادة كما أن هناك عدة أسئلة شائعة يُمكنك الإطلاع عليها من خلال مركز المساعدة. لكل دورة صفحة خاصة بها تُوضح المُحتوى الذي تُقدمه: دورة علوم الحاسوب دورة تطوير واجهات المستخدم دورة تطوير التطبيقات باستخدام لغة JavaScript دورة تطوير تطبيقات الويب باستخدام لغة PHP دورة تطوير تطبيقات الجوال باستخدام تقنيات الويب دورة تطوير تطبيقات الويب باستخدام لغة Ruby تُقدم الأكاديمية أيضاً مجموعة من الكتب القيمة و المقالات الجيدة في مختلف المجالات يُمكنك الإطلاع عليها من القائمة العلوية.
    1 نقطة
  23. لقد نجحت برفع الملفات وتخزين المسار مع اسم الملف ضمن قاعدة البيانات في node.js من خلال استخدام الحزمة multer. ولكن ضمن التوثيق الرسمي تم ذكر أنه لن يتم تخزين اللاحقة مع اسم الملف بالشكل التلقائي. ماهي الخيارات التي يجب علي أن أقوم بإضافتها لتخزين اللاحقة مع اسم الملف ضمن قاعدة البيانات؟
    1 نقطة
  24. لقد قمت بتثبيت حزمة sass-loader وادارجها الى ملف index.js عبر الامر التالي import './scss/product1.scss'; بالاضافة الى انني اضفت الاضافة الى ملف webpack.config.js عبر الاوامر التالية test: /\.(sa|sc|c)ss$/, use: [ { loader: MiniCssExtractPulgin.loader, options:{ publicPath: '../' } }, 'css-loader' , 'sass-loader' ] }, ولايوجد اي خطا في الترمينال ولكن عندما اريد تحويل الملف من scss الى css يظهر لدي الخطا التالي ولا يتم انشاء الملف داخل dist Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\coffee>sass src/scss/product1.scss src/css/product1.css 'sass' is not recognized as an internal or external command, operable program or batch file. C:\coffee>
    1 نقطة
  25. يمكنك تخزين اللاحقة بشكل يدوي في كان كانت ثابتة مع الملفات من خلال الكود التالي: var multer = require('multer'); var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploadsFolder/') }, filename: function (req, file, cb) { cb(null, Date.now() + '.jpg') //مثال عن إضافة لاحقة } }) var upload = multer({ storage: storage }); أو يمكنك تخزين الصيغة التي تأتي مع الملف من خلال التالي: var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploadsFolder/') }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)) //سيتم الحصول على اللاحقة من الملف المحمّل } }) كما ينصح باستخدام mimetype للحصول على كامل الصيغة، مثال: filename: function (req, file, cb) { console.log(file.mimetype); // مثال image/jpeg
    1 نقطة
  26. لا تعمل هذه الاوامر ولكنني قمت بتنزيل sass-loader فلماذا يجب تنزيل هذا Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\coffee>sass src/scss/product1.scss src/css/product1.css 'sass' is not recognized as an internal or external command, operable program or batch file. C:\coffee>npm install -g node-sass npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/node- sass (over 30000ms) npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\len\AppData\Roaming\npm-cache\_logs\2021-08-30T16_02_25_30 6Z-debug.log C:\coffee>npm install -d node-sass npm info it worked if it ends with ok npm info using npm@6.14.4 npm info using node@v13.14.0 npm http fetch GET 200 https://registry.npmjs.org/node-sass 18730ms npm http fetch GET 200 https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tg z 66807ms npm timing stage:loadCurrentTree Completed in 90523ms npm timing stage:loadIdealTree:cloneCurrentTree Completed in 27ms npm timing stage:loadIdealTree:loadShrinkwrap Completed in 2640ms npm http fetch GET 200 https://registry.npmjs.org/get-stdin 1722ms npm http fetch GET 200 https://registry.npmjs.org/async-foreach 1974ms npm http fetch GET 200 https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tg z 606ms npm http fetch GET 200 https://registry.npmjs.org/async-foreach/-/async-foreach- 0.1.3.tgz 1803ms npm http fetch GET 200 https://registry.npmjs.org/stdout-stream 4007ms npm http fetch GET 200 https://registry.npmjs.org/stdout-stream/-/stdout-stream- 1.4.1.tgz 1314ms npm http fetch GET 200 https://registry.npmjs.org/node-gyp 8803ms npm http fetch GET 200 https://registry.npmjs.org/gaze 11643ms npm http fetch GET 200 https://registry.npmjs.org/sass-graph 14347ms npm http fetch GET 200 https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz 2940ms npm http fetch GET 200 https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5. tgz 897ms npm http fetch GET 200 https://registry.npmjs.org/true-case-path 21634ms npm http fetch GET 200 https://registry.npmjs.org/npmlog 43334ms attempt #2 npm http fetch GET 200 https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz 247m s npm http fetch GET 200 https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz 109484ms npm timing npm Completed in 213096ms npm ERR! cb() never called! npm ERR! This is an error with npm itself. Please report this error at: npm ERR! <https://npm.community> npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\len\AppData\Roaming\npm-cache\_logs\2021-08-30T16_06_53_33 4Z-debug.log C:\coffee>
    1 نقطة
  27. اعدت تشغيله اكثر من مرة ولكن هل تقصد بمسؤول اي فتحه من داخل الملفات عبر كتابة cmd مكان مسار المشروع
    1 نقطة
  28. انا اعتقد انك تحتاج الي عمل مشاريع كثيرة ثم ابحث عن دورة للخواريزمات وغير مسموح بوضع روابط لأي دورات
    1 نقطة
  29. أنا جديد في الجافاسكربت، ما فائدة الـvalues في حقول الادخال الـinputs ؟ هل هي البيانات الي تصل لقاعدة البيانات؟ والسؤال الأهم كيف أصل لقاعدة البيانات وكيف تصلني البيانات ؟
    1 نقطة
  30. أرجو الانتباه لوضع فراغات بين أسم الجدول والقوس.. INSERT INTO cloths_fabric(item, ^^^^ INSERT INTO cloths_fabric (item,
    1 نقطة
  31. أنت تحتاج الي تطوير التفكير البرمجي عن طريق عمل مشاريع كثيرة بعد تعلم الاساسيات و لكن في البداية من خلال مشاهدة فيديو يساعدك لعمل مشروع ثم تحتاج الي عمل مشاريع أخري من دون مشاهدة أي فيديو و عندما تواجهك مشكلة حاول ان تحل هذه المشكلة بدون البحث في اي موقع و ان لم تستطع حلها ابحث في المواقع و مع الوقت سوف تشعر بتحسن التفكير البرمجي و يمكنك ايضا تحسينه من خلال دورات مثل الخواريزمات و هياكل البيانات و دورة علوم الحاسوب والموضوع يحتاج الي صبر لوقت طويل
    1 نقطة
  32. عندما اقوم بتنفيذ هذا الكود ياتيني رسالة خطأ Too many re-renders. React limits the number of renders to prevent an infinite loop import React,{useState,useEffect} from 'react'; import axios from 'axios' const Textview=({id})=>{ const [label,setLabel]=useState(""); useEffect(()=>{ axios.get("/api/"+id+"/label") .then(res=>setLabel(res.data)) }) return( <div> <h1> {label}</h1> </div> ) } export default Textview
    1 نقطة
  33. نعم لانها تشرح اخر الاصدارات واخر التحديثات من التقنيات
    1 نقطة
  34. السلام عليكم لدي نظام اشعارات للرسائل في الموقع كيف يمكن تطبيق نفس الطريقة في التعليقات على المواضيع <style type="text/css"> <!-- .dropdown{ margin:0px; padding-top:6px; } .glyphicon{ margin-top:6px; margin-left:10px; border:none; cursor:pointer; background:url(images/message.png) no-repeat; width:40px; height:40px; } .count{ display:block; position:absolute; background:#E1141E; color:#FFF; font-size:14px; font-weight:normal; padding:1px 3px; margin:-1px 0 0 25px; border-radius:2px; -moz-border-radius:2px; -webkit-border-radius:2px; z-index:1; } .dropdown-menu { display: none; position:absolute; width:300px; height:470px; overflow-y:auto; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1; padding:5px; border-radius:10px; } --> </style> <link rel="stylesheet" href="css/bootstrap.min.css" /> <script src="js/jquery-3.6.0.min.js"></script> <script src="js/bootstrap-3.3.7.min.js"></script> <div class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown"> <div class="label count"></div> <div class="glyphicon" title="الرسائل" ></div> </a> <div class="dropdown-menu"></div> </div> <script> var $j = jQuery.noConflict(); $j(document).ready(function(){ function load_unseen_notification(view = '') { $j.ajax({ url:"show_pages/show_messages_menu.php", method:"POST", data:{view:view}, dataType:"json", success:function(data) { $j('.dropdown-menu').html(data.notification); if(data.unseen_notification > 0) { $j('.count').html(data.unseen_notification); } } }); } load_unseen_notification(); $j(document).on('click', '.dropdown-toggle', function(){ $j('.count').html(''); load_unseen_notification('yes'); }); setInterval(function(){ load_unseen_notification();; }, 5000); }); </script> تكرار الكود سوف يجعله مرتبط بالرسائل وتغيير مسمياته سوف يجعله لا يعمل - ما هي الطريقة لاستخدامة مرة اخرى ليرتبط بالتعليقات
    1 نقطة
  35. ليس المعنى هكذا بانها غير مهمة, بل العكس مهمة جدا وشروحاتها ممتازة ولا تقل جودة عن المسارات الحديثة, ولكن المسارات القديمة تشرح التقنيات بالاصدارات القديمة وأيضا التطبيقات تم تنفيذها بالاصدارات القديمة ولذلك تقوم الأكاديمية بتحديث المسارات كل فترة بما يتناسب مع الاصدارات الحديثة, المقصود بانك لن تحتاجها لأنه سوف يتم شرح كل شيء من البداية مع الاصدارات الحديثة ولذلك لا تحتاج اليها اذا لم تبدأ بها, أي يعني أن المسارات الحديثة تغنيك عن المسارات القديمة
    1 نقطة
  36. عند تثبيت mysqlclinet في البايثون ظهر هذا الخطاء ERROR: Command errored out with exit status 1: command: /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/setup.py'"'"'; __file__='"'"'/tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-izyt_oh5 cwd: /tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/ Complete output (12 lines): /bin/sh: 1: mysql_config: not found /bin/sh: 1: mariadb_config: not found /bin/sh: 1: mysql_config: not found Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/setup.py", line 16, in <module> metadata, options = get_config() File "/tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/setup_posix.py", line 61, in get_config libs = mysql_config("libs") File "/tmp/pip-install-soff0wys/mysqlclient_e2712f319bd345f69373f8abe409e87e/setup_posix.py", line 29, in mysql_config raise EnvironmentError("%s not found" % (_mysql_config_path,)) OSError: mysql_config not found
    1 نقطة
  37. إذا كانت قيمة ترغب في الحصول عليها لكل طلب & نموذج ، فإن استخدام معالج السياق "context processor" يكون أفضل حل كالتالي.. ننشئ ملف Context_processors.py في مجلد التطبيق. ولنفترض أنني أريد الحصول على قيمة ADMIN_PREFIX_VALUE في كل سياق: from django.conf import settings def _m(request): # إرجاع القيمة التي تريدها كقاموس يمكنك إضافة قيم متعددة هناك return {'ADMIN_MEDIA_URL': settings.ADMIN_MEDIA_PREFIX} #settings.py أضف معالج السياق إلى ملف TEMPLATES = [{ # .. 'OPTIONS': { 'context_processors': [ # .. "your_app.context_processors.admin_media", ], } }] # view في ال RequestContext استخدم #بهذا تلقائياً render shortcut الخاص بك لإضافة معالجات السياق التي تريدها ضمن القالب الذي تريده. يقوم from django.shortcuts import render def admin_media(request): return render(request, "index.html") # وأخيراً ضمن القالب الخاص بك ... <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a> ... كما أن أبسط طريقة تتجلى باستخدام custom template tag: from django import template from django.conf import settings register = template.Library() # settings value @register.simple_tag def settings_value(name): return getattr(settings, name, "") # ونستخدم {% settings_value "LANGUAGE_CODE" %}
    1 نقطة
  38. بشكل إفتراضي يتم تخزين السجلات logs في نظام Linux في أحد المسارات التالية (حسب بنية النظام لديك): /var/log/nginx/nginx_error.log /var/log/nginx/error.log يمكنك عرض آخر جزء من السجل من خلال أمر tail، كالتالي: tail -f /var/log/nginx/error.log لاحظ: يجب تغير المسار في الأمر السابق حسب المسار الذي لديك أما في MacOS فالمسار مختلف وهو: /usr/local/var/log/nginx أما في Windows فيختلف المسار حسب مكان تثبيت الخادم لكن يمكنك الوصول من خلال تنفيذ الأمر التالي: nginx -s reopen أما إن أردت أن يقوم Django بحفظ السجلات فيجب عليك أن تقوم بتعديل ملف settings.py لشمل الكود كالتالي: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'debug.log'), }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }
    1 نقطة
  39. في تنسرفلو 1، التعليمة x.assign(1) لاتقوم بتعيين القيمة 1 ل x ولكنه يقوم بإنشاء tf.Operation (عملية) وبالتالي عليك القيام بتنفيذها بشكل صريح (أي sess.run(x.assign(1))) . * ويمكنك استخدام استدعاء Operation.run أو Session.run لتنفيذ هذه العملية : my_opration = a.assign(7) s.run(my_opration) a.eval() # ###################### أو ################ my_opration = a.assign(7) my_opration.op.run()` a.eval() # 7 أما في الإصدارات الأحدث من تنسرفلو أصبح بإمكانك استخدام x.assign مباشرةً لتحديث القيمة: a.assign(5) a.eval() # 5 كما يمكنك استخدام tf.Variable.load(value, session) لإسناد قيمة جديدة لكن فقط في TF1، فقد تم إلغاؤها في TF2: import tensorflow as tf a = tf.Variable(0) s = tf.Session() s.run(tf.global_variables_initializer()) print(s.run(a)) # 0 a.load(7, s) print(sess.run(a)) # 7
    1 نقطة
  40. الinheritance "الميراث" عندما يكن لدينا الكلاس A وكلاس اخر من نفس نوعه ولكن مزود بخصائص اكثر يسمى class B , وعادة يتم استخدام الميراث كما قلنا عندما يكون B فعلا صنف ممتد من A مثل الuser وال adminUser يتم الميراث كما فى المثال: class User{ String name; int age; /////////getters and setters/ } class SuperUser extends User{ banUser(){ //////logic to ban user } unbanUser(){ ////logic to unban user } } في المثال السابق نجد ان الSuperUser لديه جميع خصائص الكلاس User ولديه بالاضافة إلى ذلك وظائف جديدة كحظر وفك الحظر عن المستخدمين ولكن إذا كان لدينا كلاس أخر يدعى book ,فهنا ليس من العقل ان يتم ميراثه من قِبل الكلاس user لإنهم ليسوا نفس النوع ,فهنا يتم استخدام الcomposition وهو أن يتم وضع الbook على هيئة خاصية للكلاس user كما في المثال class book{ String name; int price; ///////getters and setters//// } class User{ String name; int age; Book b; ///////getters and setters////// } هنا يمكننا استخدام دوال الكلاس book بدون ميراثه عن طريق استدعاء الكائن b وبوجه عام فإن الcomposition يتم تفضيله عن الinheritance(ميراث) لعدة اسباب من ضمنها : عدد من لغات البرمجة لا يدعم تعدد الميراث, بالإضافة الى أن تعدد الميراث يسبب مشاكل وتعقيد الcomposition يمكنك من تغيير نوع الكلاس المستخدم فى مرحة التشغيل(runtime) مثلاً إذا كان لدينا كلاس يسمى SuperBook وكلاس يسمى OrdinaryBook وكلاً منهم يشترك في نفس الواجهة البرمجية interface يمكنك في مرحلة الruntime أن تقم بتغيير خاصية الbook لدى الuser إلى الSuperBook او الOrdinaryBook ,بينما الميراث لا يحدث إلا في مرحلة الترجمة(compile time) الcomposition اسهل في عملية الاختبار
    1 نقطة
  41. في الرابط التالي يوجد شرح لسبب وجود 3 ملفات (في الإصدارات المختلفة): أما بالنسبة لاستعادة النموذج فيمكنك القيام بذلك كالتالي: with tf.Session() as sess: saver = tf.train.import_meta_graph('/tmp/model.ckpt.meta') saver.restore(sess, "/tmp/model.ckpt") بدلاً من ذلك ، يمكنك القيام بالتالي: # أعد إنشاء نفس المتغيرات بالضبط v1 = tf.Variable(..., name="v1") v2 = tf.Variable(..., name="v2") ... # checkpoint الآن قم بتحميل ال with tf.Session() as sess: saver = tf.train.Saver() saver.restore(sess, "/tmp/model.ckpt")
    1 نقطة
  42. الموديول tf.app.flags هو تابع توفره Tensorflow لتنفيذ ال "command line flags" أي إشارات سطر الأوامر لكود Tensorflow الخاص بك. على سبيل المثال ، فإن الكود الذي صادفته سيقوم بما يلي: flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.') تحدد الوسيطة الأولى اسم العلامة flag بينما تحدد الثانية القيمة الافتراضية في حالة عدم تحديد العلامة flag أثناء تنفيذ الملف. لذلك إذا قمت بتشغيل ما يلي: $ python fully_connected_feed.py --learning_rate 1.00 سيتم ضبط معدل التعلم على 1.00 وسيبقى 0.01 إذا لم يتم تحديد قيمة للعلم flag. ومايزال تجريبي لذا قد لاتجد توثيقاً لذا يوصى بتنفيذ تحليل العلم "flag parsing" باستخدام argparse أو أي مكتبة أخرى تفضلها.
    1 نقطة
  43. يدعم Keras الإيقاف المبكر للتدريب عن طريق callback يسمى EarlyStopping. ويسمح لنا بتحديد مقياس الأداء الذي نريد أن تتم مراقبته، ليتم إيقاف التدريب عند توقف هذا المقياس عن التحسن.(مثلاً عندما تتوقف ال validation accuracy عن التحسن يقوم النموذج بإيقاف التدريب تلقائياً). تعتمد فكرته على أنه طالما مازالت قيمة المعيار تتحسن سنستمر بالتدريب وبمجرد توقفها عن التحسن (أي تراجعت قيمتها مثلاً في حالة اخترنا المقياس Accuracy وكانت دقة التدريب في مرحلة ما 0.8 ثم في ال epoch التالي تراجعت قيمته لل 0.79 ستم إيقاف التدريب وهنا ستظهر لنا مشكلة سأتحدث عنها في *) .إن استخدام تكنيك التوقف المبكر يتطلب أن يكون لديك validation_data قمت بتحديدها مسبقاً لأننا نطبقه على أساس قيمها وإلا لن يكون لاستخدامه معنى. وكما تعلم هناك طريقتين لنقوم بتحديد ال validation الأولى بأن نحددها من خلال قسم جزء من داتا التدريب باستخدام الوسيطة validation_split: model.fit(train_X, train_y, validation_split=0.3) أو أن تكون لدينا بيانات جاهزة: model.fit(train_X, train_y, validation_data=(val_x, val_y)) يتم تكوين ال EarlyStopping عند إنشاء غرض منه وتمريره للوسيطة callback في الدالة fit. ومن خلال الوسيطة "monitor" نقوم بتحديد مقياس الأداء المراد مراقبته من أجل إنهاء التدريب: es = EarlyStopping(monitor='val_loss') بناءً على اختيار مقياس الأداء، يجب تحديد وسيطة "mode" وذلك لتحديد فيما إذا كان الهدف من المقياس المختار هو الزيادة (التكبير أو "الحد الأقصى") أو تقليله (تقليل أو "الحد الأدنى"). على سبيل المثال، سنسعى للحصول على حد أدنى لل validation loss، بينما سنسعى إلى الحد الأقصى لل val_acc. es = EarlyStopping(monitor='val_loss', mode='min') بشكل افتراضي ، يتم تعيين الوضع على "auto" وسيعرف أنك تريد التقليل في حالة ال loss أو زيادة الدقة إلى أقصى حد في حالة ال accuracy. وإذا أردت طباعة رقم ال epoch الذي توقف عنده التدريب فقط نضبط verbose على 1. es = EarlyStopping(monitor='val_loss', mode='min', verbose=1) الآن سأتحدث عن المشكلة التي أشرت لها في *، وهي "كانت دقة التدريب في مرحلة ما 0.8 ثم في ال epoch التالي تراجعت قيمته لل 0.79 ستم إيقاف التدريب" في هكذا حالة فإن إيقاف التدريب سيكون أمر خاطئ لأنه ربما في الحقبتين التاليتين سيعود للتحسن وبشكل كبير جداً، أي قد يكون النموذج قد وقع مثلاً في قيمة صغرى محلية ويحتاج للصبر قليلاً لكي يخرج منها ثم يعود للتحسن، وهنا يأتي دور الوسيطة patience والتي تمثل "الصبر" أي أصبر عليها لفترة محددة إذا لم تتحسن توقف: es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=4) # epoch هنا سينتظر 4 أخيرًا ، قد يكون من المستحسن التوقف عن التدريب فقط إذا ظل الأداء أعلى أو أقل من عتبة معينة أو خط أساس معين. على سبيل المثال ، إذا كان لديك إلمام بتدريب النموذج (مثل منحنيات التعلم) وتعلم أنه بمجرد تحقيق validation loss بقيمة معينة ، فلا فائدة من استمرار التدريب. يمكن تحديد ذلك عن طريق تعيين وسيطة "baseline". es = EarlyStopping(monitor='val_loss', mode='min', baseline=0.4) مثال كامل: from sklearn.datasets import make_moons from keras.models import Sequential from keras.layers import Dense from keras.callbacks import EarlyStopping from keras.callbacks import ModelCheckpoint from matplotlib import pyplot from keras.models import load_model # توليد بيانات ثنائية الأبعاد للتجربة عليها X, y = make_moons(n_samples=100, noise=0.2, random_state=1) # split into train and test n_train = 30 trainX, testX = X[:n_train, :], X[n_train:, :] trainy, testy = y[:n_train], y[n_train:] # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # simple early stopping es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200) # لحفظ أفضل نتيجة حصلنا عليها خلال التدريب mc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True) # fit model history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0, callbacks=[es, mc]) # load the saved model saved_model = load_model('best_model.h5') # evaluate the model _, train_acc = saved_model.evaluate(trainX, trainy, verbose=0) _, test_acc = saved_model.evaluate(testX, testy, verbose=0) print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
    1 نقطة
  44. في Tensorflow 2.x (2.1) ، يمكنك الحصول على أبعاد (شكل) الموتر كقيم عدد صحيح ، من خلال tf.shape كما هو موضح في الكود أدناه: import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.shape.as_list() print(Shape) # [2,3] أو من خلال tf.get_shape() : import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.get_shape().as_list() print(Shape) # [2,3] أو بكود عادي (دون استخدام الدوال الجاهزة في المكتبة): rows, columns = map(lambda i: i.value, tensor.get_shape())
    1 نقطة
  45. أولاً سأبدأ بهذه الملاحظة: اعتباراً من الإصدار 0.11 ، تم إهمال كل من op_scope و variable_op_scope واستبدالهما بـ name_scope و variable_scope. دعنا نتكلم أولاً عن مفهوم ال variable sharing في TensorFlow: هو آلية تسمح لنا بمشاركة المتغيرات التي يتم الوصول إليها في أجزاء مختلفة من الكود دون تمرير مراجع إلى المتغير. يمكننا استخدام الطريقة tf.get_variable مع اسم المتغير كوسيطة لإنشاء متغير جديد بهذا الاسم أو استرداد المتغير الذي تم إنشاؤه من قبل. وهذا يختلف عن استخدام tf.Variable constructor الذي سينشئ متغيراً جديداً في كل مرة يتم استدعاؤه (ويحتمل أن يضيف لاحقة إلى اسم المتغير إذا كان متغير بهذا الاسم موجوداً بالفعل). ولغرض آلية المشاركة المتغيرة ، تم تقديم نوع منفصل من النطاق (نطاق متغير). نتيجة لذلك ، تم وضع نوعين مختلفين من النطاقات: أولاً، نطاق الاسم ، يتم إنشاؤه باستخدام tf.name_scope، ثانياً، نطاق متغير ، يتم إنشاؤه باستخدام tf.variable_scope . كلا النطاقين لهما نفس التأثير على جميع العمليات وكذلك المتغيرات التي تم إنشاؤها باستخدام متغير tf، أي سيتم إضافة النطاق كبادئة إلى العملية أو اسم المتغير. ومع ذلك ، يتم تجاهل نطاق الاسم بواسطة tf.get_variable. يمكننا أن نرى ذلك في المثال التالي: الطريقة الوحيدة لوضع متغير يتم الوصول إليه باستخدام tf.get_variable في نطاق هو استخدام نطاق متغير ، كما في المثال التالي: with tf.name_scope("scope"): variable1 = tf.get_variable("variable1", [1], dtype=tf.float64) variable2 = tf.Variable(1, name="variable2", dtype=tf.float64) op = tf.add(variable1, variable2) # scope/Add:0 op.name # variable1:0 variable1.name # scope/variable2:0 variable2.name الطريقة الوحيدة لوضع متغير يتم الوصول إليه باستخدام tf.get_variable في نطاق هو استخدام نطاق متغير ، كما في المثال التالي: with tf.name_scope("scope"): variable1 = tf.get_variable("variable1", [1], dtype=tf.float64) variable2 = tf.Variable(1, name="variable2", dtype=tf.float64) op = tf.add(variable1, variable2) # scope/Add:0 op.name # scope/variable1:0 variable1.name # scope/variable2:0 variable2.name يتيح لنا ذلك مشاركة المتغيرات بسهولة عبر أجزاء مختلفة من البرنامج ، حتى ضمن نطاقات الأسماء المختلفة: with tf.name_scope("bla"): with tf.variable_scope("scope"): var = tf.get_variable("variable", [1]) with tf.name_scope("blabla"): with tf.variable_scope("scope", reuse=True): var1 = tf.get_variable("variable", [1]) assert var1 == var var.name # scope/variable:0 var1.name # scope/variable:0
    1 نقطة
  46. يمكنك حفظها يالشكل التالي (هذه الطريقة تخزنها كملف ثنائي وبالتالي غير صالحة للقراءة مباشرةً من الملف): # نحدد المسار #w ونحدد له وضع الكتابة #b نحدد له صيغة الملف أنها ثنائية with open('/trainHistoryDict', 'wb') as f: pickle.dump(history.history, f) # حفظها أو: # save to json: hist_json_file = 'history.json' with open(hist_json_file, mode='w') as f: hist_df.to_json(f) أما في حال أنك تريد تخزينها وقراءتها من الملف لاحقاً، قم بتحويلها لقاموس وخزنها كملف csv: import pandas as pd # بفرض قمت بالتدريب وتخزين النتائج history = model.fit(x_train, y_train, epochs=10) # نحولها لداتافريم hist_df = pd.DataFrame(history.history) # save to csv: hist_csv_file = 'history.csv' with open(hist_csv_file, mode='w') as f: hist_df.to_csv(f)
    1 نقطة
  47. حسناً سأبدأ بتوضيح فكرة بسيطة (يمكنك تجاوزها إذا لم تكن مهتماً بالتفاصيل). ملفات تنسرفلو تتكون من ملفين رئيسيين هما "Meta graph" و "Checkpoint file" بحيث أن الأول هو عبارة عن بروتوكول ال "buffer" الذي يقوم بحفظ كامل الغراف Graph (أي جميع المتغيرات والعمليات ..إلخ) وهذا الملف يكون بامتداد meta. أما الثاني فهو ملف ثنائي يحتوي على جميع قيم الأوزان وال bias والتدرجات "gradients" وجميع المتغيرات الأخرى المحفوظة. ويكون ملف واحد بامتداد ckpt في الأصدارات التي تسبق الإصدار 0.11 أما في الإصدارات الأحدث فيتم تخزين هذه المعلومات في ملفين: mymodel.data-00000-of-00001 # هذا هو الملف الذي يحوي متغيرات التدريب mymodel.index وإلى جانب هذه الملفات يحتفظ تنسرفلو بملف آخر هو checkpoint يحتفظ بآخر نقاط ال checkpoints التي تم حفظها. أي في حالة النسخ الأقدم يتم تخزين النموذج كالتالي: inception_v1.meta inception_v1.ckpt checkpoint أما الأحدث: mymodel.data-00000-of-00001 mymodel.index inception_v1.meta checkpoint الآن سنبدأ (يمكنك تخطي القسم السابق). أول خطوة ستقوم بها هي أخذ كائن من الكلاس Saver، ويجب أن تقوم بإنشائه داخل الجلسة التي قمت بتعريف نموذجك ومتغيراتك بها لأن المتغيرات والعمليات ووو تكون نشطة (أو موجودة أو حية .. أيَاً يكن التعبير) فقط ضمن الجسلة الخاصة بها: saver = tf.train.Saver() saver.save(sess, 'mymodel') # الوسيط الأول هو اسم الجلسة والثاني اسم الملف الذي نريد حفظه فيه مثال: import tensorflow as tf # على سبيل المثال w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1') w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2') save_ = tf.train.Saver() mysess = tf.Session() sess.run(tf.global_variables_initializer()) save_.save(mysess, 'mymodel') إذا أردنا حفظ النموذج بعد 1000 تكرار، فسنقوم باستدعاء Save وتمرير عدد الخطوات أيضاً : save_.save(mysess, 'mymodel',global_step=1000) إذا أردت أن يتم حفظ النموذج أيضاً بعد كل 3 ساعات مثلاً، ولمرتين فقط يمكنك القيام بالتالي: save_ = tf.train.Saver(max_to_keep=2, keep_checkpoint_every_n_hours=3) #max_to_keep نحدد العدد الأعظمي لعمليات الحفظ # keep_checkpoint_every_n_hours الساعات أيضاً يجب أن تعلم أنه عندما لانقوم بتحديد أي وسيط للكلاس Saver فهذا يعني أننا نريد حفظ كل المتغيرات، وبالتالي إذا أردنا تحديد مايتم حفظه يجب أن نمرره لباني الصف كقائمة أو قاموس: import tensorflow as tf w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1') w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2') # نمرر له مانريد حفظه فقط save_ = tf.train.Saver([w1,w2]) mysess = tf.Session() mysess.run(tf.global_variables_initializer()) save_.save(mysess, 'mymodel') يمكنك إنشاء الشبكة عن طريق كتابة كود بيثون لإنشاء كل طبقة يدوياً كنموذج أصلي. ومع ذلك، إذا فكرت في الأمر، فقد حفظنا الشبكة في ملف meta. والذي يمكننا استخدامه لإعادة إنشاء الشبكة باستخدام: save_ = tf.train.import_meta_graph('mymodel.meta') تذكر أن import_meta_graph تلحق الشبكة المحددة في ملف meta بالغراف الحالي. لذلك، سيؤدي هذا إلى إنشاء الغراف / الشبكة لك ولكننا ما زلنا بحاجة إلى تحميل قيم الأوزان التي دربناها على هذا الغراف. ويمكننا استعادتها بالشكل التالي: with tf.Session() as mysess: new_save_ = tf.train.import_meta_graph(.....meta') new_save_.restore(sess, tf.train.latest_checkpoint('./')) تذكر أيضاً أنها لا يتم حفظ ال placeholders.
    1 نقطة
  48. يشير global_step إلى عدد الباتشات "batches " التي يراها ال Graph . كما نعلم أنه في الشبكات العصبية يتم إدخال البيانات كحزم batches للشبكة (تغذيتها بالبيانات) ثم يتم تنفيذ عملية forward ثم backward propagation بحيث يتم في هذه المرحلة تحديث قيم الأوزان بشكل يؤدي إلى تقليل ال loss أو ال cost. إن مهمة global_step هي تتبع عدد الحزم batches التي شاهدها الغراف حتى الآن. وكلما تم تمريره في قائمة وسيطات minimize ، يتم زيادة المتغير بمقدار واحد. و القيمة 0 هنا تشير إلى القيمة الابتدائية لل global_step .
    1 نقطة
  49. من أجل القيام بتهيئة Xavier في تنسرفلو، عليك القيام بالتالي: initialization = tf.initializers.GlorotUniform() v = tf.Variable(initialization(shape=shape)) v = tf.Variable(tf.initializers.GlorotUniform()(shape=shape)) حيث أن كل من Glorot uniform و Xavier uniform هما اسمان مختلفان من لنفس نوع التهيئة. أو بالشكل التالي، لكن يجب أن تعلم أنه بدءاً من تنسرفلو 2.0 ، تم إهمال كل من *.tf.contrib و tf.get_variable: W = tf.get_variable("W", shape=shape, initializer=tf.contrib.layers.xavier_initializer()) لذا اعتمد على الطريقة الأولى إذا كنت تستخدم إصدار حديث من تنسرفلو.
    1 نقطة
×
×
  • أضف...