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

Ali Haidar Ahmad

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

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

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

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

    43

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

  1. أيضاً هناك برنامج وسيط افتراضي جديد middleware يسمى Directory لل directory listings. لديه الكثير من الخيارات ويحتوي على مربع بحث من جانب العميل client-side: var express = require('express') , app = express.createServer(); app.configure(function() { var hourMs = 1000*60*60; app.use(express.static(__dirname + '/public', { maxAge: hourMs })); app.use(express.directory(__dirname + '/public')); app.use(express.errorHandler()); }); app.listen(8080);
  2. يدعم 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))
  3. إضافة للإجابة السابقة، باستخدام Express 4.x ، يمكنك استخدام req.acceptsLanguages (lang [، ...]) للتحقق من قبول لغات معينة: var express = require('express'); app.get('/translation', function(request, response) { var lang = request.acceptsLanguages('fr', 'es', 'en'); if (lang) { console.log('The first accepted of [fr, es, en] is: ' + lang); ... } else { console.log('None of [fr, es, en] is accepted'); ... } }); للحصول على قائمة بجميع اللغات المقبولة ، باستخدام Express 4.x ، يمكنك استخدام الموديول accepts: var express = require('express'), accepts = require('accepts'); app.get('/translation', function(request, response) { console.log(accepts(request).languages()); ... });
  4. يخزن Express-session معرف الجلسة في ملف تعريف الارتباط بينما توجد بيانات الجلسة الفعلية في مخزن الجلسة الخلفية مثل connect-redis ، حيث تتيح لك جلسة ملف تعريف الارتباط cookie-session تخزين بيانات الجلسة في ملف تعريف ارتباط (جانب العميل). الاقتباس التالي هو مقتطف من وثائق جلسة ملفات تعريف الارتباط cookie-session: "يمكن تخزين جلسة المستخدم بطريقتين رئيسيتين مع ملفات تعريف الارتباط: على الخادم أو على العميل. تخزن هذه الوحدة بيانات الجلسة على العميل داخل ملف تعريف ارتباط ، بينما تخزن وحدة مثل الجلسة السريعة فقط معرف جلسة على العميل داخل ملف تعريف ارتباط وتخزن بيانات الجلسة على الخادم ، عادةً في قاعدة بيانات.". الميزة الرئيسية لاستخدام ملف تعريف الارتباط cookie-session هي عندما يكون لديك تطبيق node.js مجمع ، فلن تضطر إلى الاعتماد على مشاركة بيانات الجلسة بين العمليات المتشعبة.
  5. يمكنك استخدام request.build_absolute_uri للقيام بذلك: FULL_URL_WITH_QUERY_STRING: request.build_absolute_uri() FULL_URL: request.build_absolute_uri('?') ABSOLUTE_ROOT: request.build_absolute_uri('/')[:-1].strip("/") ABSOLUTE_ROOT_URL: request.build_absolute_uri('/').strip("/") أفضل طريقة لاستخدام عناوين URL المطلقة في Django، حيث يمكنك إنشاء معالجات سياق context_processors أو برمجيات وسيطة middleware والعثور على ال ABSOLUTE_URL وإعادته بحيث يمكنك استخدام أي مكان في Django. مثال: def absolute(request): urls = { 'ABSOLUTE_ROOT': request.build_absolute_uri('/')[:-1].strip("/"), 'ABSOLUTE_ROOT_URL': request.build_absolute_uri('/').strip("/"), } return urls وبعد ذلك يمكنك استخدام {{ABSOLUTE_ROOT}} في أي مكان تريد فيه نموذج django.
  6. في 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())
  7. أيضاً يمكنك القيام بذلك كالتالي: var options = { url: 'http://url', timeout: 120000 } request(options, function(err, resp, body) {});
  8. للقيام بذلك بطريقة آمنة: 1.قم بتنفيذ: python manage.py dumpdata > datadump.json 2. قم بتغيير settings.py إلى ملف mysql الخاص بك. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_api_test', # database name 'USER': 'root', # database username 'PASSWORD': 'admin', # database password } 3. تأكد من أنه يمكنك الاتصال ب MySQL (أذونات ، إلخ). 4. قم بتنفيذ: python manage.py migrate --run-syncdb 5.استبعاد بيانات ال contentype في ال shell : python manage.py shell from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit() 6.وأخيراً: python manage.py loaddata datadump.json
  9. أولاً سأبدأ بهذه الملاحظة: اعتباراً من الإصدار 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
  10. يتعامل الموديول Request مع استجابة gzip. من أجل جعل الموديول request يقوم بفك تشفير وسيطة الجسم body argument في وظيفة رد الاتصال callback function، يتعين علينا ضبط "gzip" على true في الخيارات. مثال: var opts = { uri: 'some uri which return gzip data', gzip: true } request(opts, function (err, res, body) { //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال }) أيضاً هناك مشكلة مماثلة نواجهاها عادةً أثناء العمل مع request module وهي JSON parsing، تحليل JSON. إذا كنت تريد من request module أن يقوم بتحليل ال body تلقائياً وتزويدك بمحتوى JSON في ال body argument. يجب عليك ضبط "json" على true في الخيارات: var opts = { uri:'some uri that provides json data', json: true } request(opts, function (err, res, body) { //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال })
  11. سنقوم بإدخال محتويات ملف CSV في مصفوفة ونقسم محتوى المصفوفة بناءً على المحدد delimiter. سيتم تحويل جميع صفوف CSV إلى كائنات JSON والتي ستتم إضافتها إلى المصفوفة الناتجة والتي سيتم تحويلها بعد ذلك إلى JSON وسيتم إنشاء ملف إخراج JSON مطابق: // fs npm باستخدام حزمة csv نقرأ ملف const fs = require("fs"); csv = fs.readFileSync("CSV_file.csv") // تحويل البيانات إلى سلاسل نصية وتقسيمها في مصفوفة var array = csv.toString().split("\r"); //والتي ستتم إضافتها لتنتج مصفوفة json إلى كائنات csv سيتم تحويل جميع صفوف let result = []; //headers لذا نقوم بتخزينها في مصفوفة ال header على جميع أعمدة ال array[0] تحتوي let headers = array[0].split(", ") //المتبقية n-1 نظرًا لأن الرؤوس مفصولة نحتاج إلى المرور على الصفوف for (let i = 1; i < array.length - 1; i++) { let obj = {} // str إنشاء كائن فارغ لإضافة قيم الصف الحالي إليه لاحقًا. ونقوم بتعريف السلسلة //s كقيمة مصفوفة حالية لتغيير المحدد وتخزين السلسلة التي تم إنشاؤها في سلسلة جديدة let str = array[i] let s = '' // بشكل افتراضي ، نحصل على القيم المفصولة بفواصل لخلية بين علامتي اقتباس "" لذلك نستخدم //(") علامة لتتبع علامات الاقتباس ونقسم السلسلة وفقًا لذلك إذا واجهنا علامة اقتباس افتتاحية //فإننا نحتفظ بالفواصل كما هي ، وإلا فإننا نستبدلها بـ أنبوب | نستمر //s في إضافة الأحرف التي ننتقل إليها إلى سلسلة let flag = 0 for (let ch of str) { if (ch === '"' && flag === 0) { flag = 1 } else if (ch === '"' && flag == 1) flag = 0 if (ch === ', ' && flag === 0) ch = '|' if (ch !== '"') s += ch } // نقوم بتقسيم السلسلة باستخدام محدد الأنبوب وتخزين القيم في مصفوفة خصائص let properties = s.split("|") // لكل رأس ، إذا كانت القيمة تحتوي على بيانات متعددة مفصولة بفواصل ، فإننا // نقوم بتخزينها في شكل مصفوفة وإلا يتم تخزين القيمة مباشرة for (let j in headers) { if (properties[j].includes(", ")) { obj[headers[j]] = properties[j] .split(", ").map(item => item.trim()) } else obj[headers[j]] = properties[j] } // نضيف الكائن الذي تم إنشاؤه إلى مصفوفة النتائج الخاصة بنا result.push(obj) } //JSON تحويل المصفوفة الناتجة إلى let json = JSON.stringify(result); fs.writeFileSync('output.json', json); // والتخزين يتم ضمن الملف الذي نحدده
  12. يمكنك أيضاً استخدام ميزات القيود UniqueConstraint وهو خيار أفضل من unique_together، لأنه يوفر لك خيارات أكثر + سيتم إلغاءه في الإصدارات القادمة من جانغو (المصدر "التوثيق الرسمي للمكتبة"). مثال: class Volume(models.Model): id = models.AutoField(primary_key=True) short_link_id = models.ForeignKey(_id, db_column='jid', null=True, verbose_name="_id") post_slug = models.CharField('post_slug', max_length=100) comments = models.TextField('Comments', max_length=4000, blank=True) class Meta: constraints = [ models.UniqueConstraint(fields=['short_link_id', 'post_slug '], name='name of constraint') ] أو يمكنك استخدام unique_together كما تمت الإشارة إليه في الإجابة السابقة: # مثال class MyModel(models.Model): field1 = models.CharField(max_length=50) field2 = models.CharField(max_length=50) class Meta: unique_together = ('field1', 'field2',) # في حالتك class Volume(models.Model): id = models.AutoField(primary_key=True) short_link_id = models.ForeignKey(_id, db_column='jid', null=True, verbose_name = "id") post_slug = models.CharField('postslug', max_length=100) comments = models.TextField('Comments', max_length=4000, blank=True) class Meta: unique_together = ('short_link_id', 'post_slug',)
  13. عند استخدامها مع virtualenv ، سيتم تثبيت الحزم في المسار: <virtualenv_name>/lib/<python_ver>/site-packages وبشكل عام كل مايتم تثبيته من خلال pip يمكنك العثور عليه من خلال: pip show <package name> مثال: (base) C:\Users\Windows.10>pip show cvxopt WARNING: Package(s) not found: cvxopt (base) C:\Users\Windows.10>pip show numpy Name: numpy Version: 1.19.5 Summary: NumPy is the fundamental package for array computing with Python. Home-page: https://www.numpy.org Author: Travis E. Oliphant et al. Author-email: None License: BSD Location: c:\users\windows.10\anaconda3\lib\site-packages Requires: Required-by: transformers, torchvision, torch, thinc, tensorflow, tensorboardX, tensorboard, tables, streamlit, statsmodels, spacy, simpletransformers, seqeval, seaborn, scipy, scikit-learn, PyWavelets, pytest-arraydiff, pydeck, pyarrow, patsy, pandas, opt-einsum, opencv-python, numexpr, numba, mkl-random, mkl-fft, matplotlib, Keras, Keras-Preprocessing, imageio, h5py, gensim, easyocr, datasets, Bottleneck, bokeh, blis, bkcharts, astropy, altair
  14. انظر كيف، لنفرض الكلاس pass، لديه واصفتين x1 و x2، ثم سنعرف باني يقوم بتهيئة قيمهما، ثم سنعرف داخله تابع بولياني يستقبل object من النمط pass ويختبر فيما إذا كانت قيم x1 و x2 في كل من الكائنين متساوية (الكائن الذي يتم تمريره والمستدعي)، ثم في الدالة الرئيسية سنجرب: \\ تعريف كلاس class pass { int x1, x2; # تعريف باني للصف ObjectPassDemo(int a, int b) { x1 = a; x2 = b; } // return true if o is equal to the invoking boolean equalTo(pass o) { return (o.x1 == x1 && o.x2 == x2); } } // الكلاس الرئيسي public class Test { public static void main(String args[]) { pass ob1 = new ObjectPassDemo(20, 10); pass ob2 = new ObjectPassDemo(20, 10); pass ob3 = new ObjectPassDemo(5, 6); System.out.println("ob1 == ob2: " + ob1.equalTo(ob2)); \\ true System.out.println("ob1 == ob3: " + ob1.equalTo(ob3)); \\false } }
  15. OneToOneField يمثل علاقة (one-to-one) ويمثل مفهوم ال composition (التركيب) في الكائنات object، بينما ForeignKey يمثل (one-to-many) ويمثل مفهوم ال agregation أو التجميع للكائنات. OneToOneField هي علاقة واحد لواحد كما ذكرنا وهي مشابهة لحالة ForeignKey مع تحديد قيمة unique على True، ولكن في حالة reverse سيعيد كائناً واحداً مباشرةً. أما ForeignKey فستعيد QuerySet. (one-to-one field )(one-to-one)== (ForeignKey with unique=True)(one-to-many) ForeignKey ="reverse" relation returns a QuerySet. # وستعيد QuerySet one-to-one field = "reverse" يعيد كائن واحد مباشرةً سأعطيك الآن مثال عملي لتفهمهم بشكل أفضل. افترض للحظة أنك تريد إنشاء مدونة في django حيث يمكن للصحفيين كتابة المقالات الإخبارية ونشرها. يريد مالك الصحيفة الإلكترونية أن يسمح لكل من مراسليه بنشر العديد من المقالات التي يريدونها ، لكنه لا يريد أن يعمل مراسلين مختلفين على نفس المقالة. هذا يعني أنه عندما يذهب القراء ويقرأون مقالًا ، فإنهم لن يروا سوى مؤلف واحد في المقالة. على سبيل المثال: مقال بقلم محمد، مقالة بقلم علي، مقالة بقلم إياد. لا يمكنك الحصول على مقال بواسطة محمد & علي لأن المدير لا يريد مؤلفين أو أكثر للعمل على نفس المقالة. كيف يمكننا حل هذه "المشكلة" بمساعدة django؟ مفتاح حل هذه المشكلة هو django ForeignKey. فيما يلي الكود الكامل الذي يمكن استخدامه لتنفيذ فكرة رئيسنا. from django.db import models # أنشئ النموذج أولاً هنا class Reporter(models.Model): first_name = models.CharField(max_length=30) def __unicode__(self): return self.first_name class Article(models.Model): title = models.CharField(max_length=100) reporter = models.ForeignKey(Reporter) def __unicode__(self): return self.title الآن: # يُستخدم لتحديد العلاقات بين شخص وآخر django ForeignKey يوضح لنا هذا المثال العملي التالي أن #لإنشاء علاقات واحد لواحد OneToOneField بينما # إنشاء Reporter object R1 from thepub.models import Reporter, Article R1 = Reporter(first_name='Ali') R1.save() # إنشاء Article object A1. A1 = Article.objects.create(title='TDD In Django', reporter=R1) A1.save() # الحصول على اسم الناشر A1.reporter.first_name 'Ali' # إنشاء آخر R2 = Reporter.objects.create(first_name='Mohamed') R2.save() # الآن حاول إضافته للمقالة السابقة A1.reporter.add(R2) # AttributeError سنحصل على خطأ # كما ترى ، لا يمكن ربط كائن مقال بأكثر من كائن ريبورتير واحد. #r1 الآن لنجرب إرفاق أكثر من مقال ل A2 = Article.objects.create(title='Python News', reporter=R1) R1.article_set.all() # [<Article: Python News>, <Article: TDD In Django>]
  16. يمكنك حفظها يالشكل التالي (هذه الطريقة تخزنها كملف ثنائي وبالتالي غير صالحة للقراءة مباشرةً من الملف): # نحدد المسار #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)
  17. حسناً سأبدأ بتوضيح فكرة بسيطة (يمكنك تجاوزها إذا لم تكن مهتماً بالتفاصيل). ملفات تنسرفلو تتكون من ملفين رئيسيين هما "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.
  18. إليك المثال التالي من التوثيق الرسمي: from django.db import models from django.contrib.auth.models import ( BaseUserManager, AbstractBaseUser ) class MyUserManager(BaseUserManager): def create_user(self, email, date_of_birth, password=None): # ينشئ ويحفظ مستخدمًا بالبريد الإلكتروني المحدد وتاريخ الميلاد وكلمة المرور if not email: raise ValueError('Users must have an email address') user = self.model( email=MyUserManager.normalize_email(email), date_of_birth=date_of_birth, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, date_of_birth, password): #مع البريد الإلكتروني المحدد وتاريخ الميلاد وكلمة المرور superuser يقوم بحفظ وإنشاء u = self.create_user(username, password=password, date_of_birth=date_of_birth ) u.is_admin = True u.save(using=self._db) return u class MyUser(AbstractBaseUser): email = models.EmailField( verbose_name='email address', max_length=255, unique=True, ) date_of_birth = models.DateField() is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) objects = MyUserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['date_of_birth'] def get_full_name(self): # يتم التعرف على المستخدم من خلال عنوان بريده الإلكتروني return self.email def get_short_name(self): # يتم التعرف على المستخدم من خلال عنوان بريده الإلكتروني return self.email def __unicode__(self): return self.email def has_perm(self, perm, obj=None): "هل المستخدم لديه سماحية محددة؟" # أبسط إجابة ممكنة: نعم ، دائمًا return True def has_module_perms(self, app_label): "هل يمتلك المستخدم أذونات لعرض التطبيق" app_label "؟" # أبسط إجابة ممكنة: نعم ، دائمًا return True @property def is_staff(self): "هل المستخدم عضو في فريق العمل؟" # أبسط إجابة ممكنة: جميع المسؤولين هم موظفين return self.is_admin كل ما عليك فعله هو إضافة AUTH_USER_MODEL إلى الإعدادات مع المسار إلى كلاس ال custom user ، والتي تتوسع إما AbstractBaseUser (إصدار أكثر قابلية للتخصيص) أو AbstractUser (يمكنك توسيع فئة المستخدم القديمة بشكل أكبر أو أقل).
  19. يشير global_step إلى عدد الباتشات "batches " التي يراها ال Graph . كما نعلم أنه في الشبكات العصبية يتم إدخال البيانات كحزم batches للشبكة (تغذيتها بالبيانات) ثم يتم تنفيذ عملية forward ثم backward propagation بحيث يتم في هذه المرحلة تحديث قيم الأوزان بشكل يؤدي إلى تقليل ال loss أو ال cost. إن مهمة global_step هي تتبع عدد الحزم batches التي شاهدها الغراف حتى الآن. وكلما تم تمريره في قائمة وسيطات minimize ، يتم زيادة المتغير بمقدار واحد. و القيمة 0 هنا تشير إلى القيمة الابتدائية لل global_step .
  20. إضافة إلى الإجابة التي قدمها أحمد، يمكنك استخدام groupby: import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1) """ A B C 2 foo 1 B 3 bar 1 A """
  21. إضافة للإجابات التي قدمها سامح، يمكنك استخدام: from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0) أو باستخدام Q: from django.db.models import Q Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact='')) أيضاً يمكنك استخدام isempty lookup عام بحيث يمكنك استخدامه مع أي حقل. يمكن استخدامه أيضاً بواسطة django rest_framework أو التطبيقات الأخرى التي تستخدم عمليات بحث django: from distutils.util import strtobool from django.db.models import Field from django.db.models.lookups import BuiltinLookup @Field.register_lookup class IsEmpty(BuiltinLookup): lookup_name = 'isempty' prepare_rhs = False def as_sql(self, compiler, connection): sql, params = compiler.compile(self.lhs) condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs)) if condition: return "%s IS NULL or %s = ''" % (sql, sql), params else: return "%s <> ''" % sql, params # ثم يمكنك استخدامه كالتالي Name.objects.filter(alias__isempty=False)
  22. يمكنك القيام بذلك بالشكل التالي من خلال استخدام الدالة map والدالة concat التي تقوم بعملية الربط بين الجداول: import glob import os import pandas as pd df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "my_files*.csv")))) ومن الأفضل تحديد المسار من خلال os.path.join. أو بالشكل التالي بدون استخدام map: path = r'C:\DRO\DCL_rawdata_files' # قراءة كل الملفات all_files = glob.glob(os.path.join(path, "*.csv")) #Dataframes يحوي كل ال tuple إنشاء df_from_each_file = (pd.read_csv(f) for f in all_files) #concat الآن ربطهما من خلال الدالة concatenated_df = pd.concat(df_from_each_file, ignore_index=True) كما يمكنك استخدام Dask حيث يمكنها قراءة الداتافريم من عدة ملفات: import dask.dataframe as read df = read.read_csv('data*.csv')
  23. إضافة إلى الإجابة التي قدمها سامح، في حال كنت تستخدم لينوكس أو ماك أو Apple يمكنك أيضاً تحديثه من خلال الأمر التالي: $ python -m pip install -U Django # --upgrade أو -U وإذا كنت تريد نسخة محددة يمكنك القيام بالتالي: # win pip install --upgrade django==3.3.1 إذا كنت ترغب في أن تكون قادرًا على تحديث شفرة Django من حين لآخر بأحدث إصلاحات الأخطاء والتحسينات: ######################### Installing the development version ##################### # mac + apple + lenux $ python -m pip install -e django/ # windows py -m pip install -e django\ سيؤدي هذا إلى جعل كود Django قابلاً للاستيراد ، كما سيجعل أمر الأداة المساعدة django-admin متاح. وبعبارة أخرى، ستكون أنت جاهز تماماً. وعندما تريد تحديث نسختك من شفرة مصدر Django، قم بتشغيل الأمر git pull من داخل مجلد django. وعند القيام بذلك، سيقوم Git بتنزيل أي تغييرات.
  24. من أجل القيام بتهيئة 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()) لذا اعتمد على الطريقة الأولى إذا كنت تستخدم إصدار حديث من تنسرفلو.
  25. بشكل عام مع آدم ليس بالضرورة استخدام مفهوم ال learning rate decay لأن آدم يقوم بعملية optimization لل learning rate بشكل تلقائي "هذا ماتقوله المراجع". حيث يقوم ADAM بتحديث أي parameter بمعدل تعلم فردي "individual learning rate". هذا يعني أن كل parameter في الشبكة له معدل تعلم محدد مرتبط به. ولكن يتم حساب معدل التعلم الفردي لكل parameter باستخدام lambda (معدل التعلم الأولي أو الابتدائي) كحد أعلى. هذا يعني أن كل معدل تعلم فردي يمكن أن يختلف من 0 (بدون تحديث) إلى لامدا (الحد الأقصى لعملية التحديث). وبالرغم من أن معدلات التعلم تتكيف مع نفسها أثناء خطوات التدريب ، ولكن إذا كنت تريد التأكد من أن كل خطوة تحديث لا تتجاوز قيمة لامدا ، فيمكنك استخدام قيمة لامدا المنخفضة باستخدام exponential decay أو أي خوارزمية تخفيض أخرى. وهذا يمكن أن يساعد في تقليل التكلفة loss خلال الخطوة الأخيرة من التدريب، وذلك عندما تتوقف ال loss التي تم حسابها من خلال معلمة لامدا المرتبطة بها عن الانخفاض.
×
×
  • أضف...