Suite

Quelqu'un a-t-il des conseils pour comprendre pourquoi une couche vectorielle ne s'est pas chargée dans Pyqgis?


C'est une question générale. Je parcoure le code pyqgis et la couche isValid() est toujours False. Je ne vois aucun message d'erreur indiquant une raison pour laquelle il ne se chargerait pas. D'autres similaires se sont chargés sans problème.

J'essaie juste de voir si j'ai besoin de télécharger la source QGIS et de commencer à les parcourir également… ? (J'espère que non)

la première couche se charge sans problème. il fait référence à une table postgis. le second ne le fait pas mais l'autre_table est une vue. peut-être que cela fait une différence mais il n'y a pas de messages d'erreur ou d'exceptions me permettant de savoir ce qui ne va pas…

Rien d'extraordinaire:

#first vLayer self.uri.setDataSource('public','some_table','location',") self.first_layer = QgsVectorLayer(self.uri.uri(), 'Certains emplacements', "postgres") QgsMapLayerRegistry.instance( ).addMapLayer( self.first_layer) #second Layer self.uri.setDataSource('public', 'another_table', 'location',") self.second_layer = QgsVectorLayer(self.uri.uri(), 'Un autre ensemble d'emplacements ', "postgres") QgsMapLayerRegistry.instance().addMapLayer( self.second_layer)

Je pense que vous devez fournir un nom de champ à utiliser comme clé primaire par QGIS :

self.uri.setDataSource('public', 'another_table', 'location',", 'key_field')

Bien sûr, assurez-vous'champ_clé'existe dans votre vue et est un champ unique, ou bien créez un champ avec de telles caractéristiques dans votre vue.

Si cela ne fonctionne pas, consultez Comment déboguer « La couche n'est pas une erreur valide » à partir du plug-in Python ? et essayez de passer le SQL qui définit votre vue directement àsetDataSource, comme ça:

query = 'SELECT key_field, location,… FROM… WHERE… ' self.uri.setDataSource(", '(' + query + ')', 'location',", 'key_field')

Monter les pentes. Marcher vite ou marcher lentement ?

Cette question me ronge la tête depuis un certain temps maintenant.

Je marche souvent et la plupart des randonnées consistent à grimper jusqu'à un sommet ou quelque chose de similaire. Je porte généralement de lourdes charges d'environ 13 à 15 kg sur le dos et j'ai toujours trouvé que gravir les pentes d'une colline/montagne à un rythme plus soutenu est plus facile avec les charges plus lourdes. Je grimpe vite, me repose une minute ou deux et repart à vive allure. Cependant, j'ai rencontré des randonneurs qui m'ont dit que ce n'est pas une bonne pratique et qu'il vaut mieux garder un rythme lent en montant les pentes. J'ai essayé cela plusieurs fois, mais un rythme plus lent me fatigue plus rapidement tout en portant des charges plus lourdes.

D'où, ce qui est mieux en montant les pistes? Rythme le plus lent ou le plus rapide? Ou est-ce juste une question de choix et rien de plus ? (Mieux en termes de facilité de la montée et d'éviter les blessures sur une période de plusieurs années)

J'apprécierais à la fois les préférences personnelles ainsi que les réponses scientifiques à la question.

Remarque : je ne parle pas des ascensions à haute altitude soit plus de 3000m (à des altitudes plus élevées, le rythme lent est le seul conseillé en raison de l'acclimatation). De plus, les pentes auxquelles je fais référence ont des pentes de 30 à 50 degrés.

Veuillez noter que je ne m'inquiète pas du maintien de la structure de groupe d'un groupe de trekking ou du temps pris pour une marche lente par rapport à une marche rapide. Je m'inquiète des blessures que l'on pourrait encourir et de la facilité de la montée.


Comment aligner des centaines d'images ?

J'ai plusieurs collections d'environ 400 photos que j'ai prises en utilisant la prise de vue par intervalles. Parfois, la caméra bouge très légèrement pendant la prise de vue. Mon objectif est d'aligner toutes les images en pleine résolution afin de pouvoir les combiner en une seule image. (La combinaison se fera dans un logiciel que j'ai écrit moi-même.)

Habituellement, j'utilise la fonction d'alignement automatique de Photoshop pour aligner les images, ce qui produit d'excellents résultats, mais avec autant d'images, cela semble ne pas fonctionner ou être extrêmement lent. Photoshop a cessé de répondre et prenait toujours 100% de CPU quelques jours plus tard lorsque je l'ai tué. J'ai essayé de le changer en perspective transformer uniquement (plutôt qu'auto), mais cela n'a pas semblé aider.

D'après une recherche sur Google, certaines personnes disent que vous pouvez effectuer l'alignement dans Photoshop par lots. Cependant, pour autant que je sache, ce n'est pas possible. Si j'aligne les vingt premières images séparément des vingt suivantes, les deux ensembles d'images ne seront pas alignés l'un avec l'autre. À moins qu'il n'existe un moyen d'accélérer la fonction d'alignement automatique de Photoshop, je recherche un logiciel conçu pour aligner autant d'images.

Une option que j'ai essayée est align_image_stack , qui fait partie de Hugin. Cependant, cela avait ses propres problèmes. Lors de mon dernier essai, il a fallu des jours pour s'exécuter et n'a pas correctement aligné les images, il enregistre également les fichiers dans un format peu pratique. (Voir l'historique des modifications pour plus de détails.) Je soupçonne que Hugin et Photoshop sont optimisés pour aligner quelques dizaines d'images au maximum et ne sont pas vraiment conçus pour les gros lots.

Ce sont des fichiers RAW tout droit sortis de mon Pentax K50 et ils font environ 14-15 Mo chacun, donc c'est beaucoup de données quand vous les mettez tous ensemble - ils ne peuvent pas tous tenir dans la mémoire, et je suis à la recherche d'un outil conçu dans cet esprit.


3 réponses 3

Sans aucun doute, j'exclurais les déclencheurs et resterais strictement avec les transactions.

Les déclencheurs sont, par nature, des procédures stockées. Leurs actions sont pratiquement difficiles à faire reculer. Même si toutes les tables sous-jacentes sont InnoDB, vous rencontrerez un volume proportionnel de verrous de ligne partagés et une intermittence gênante due aux verrous de ligne exclusifs. Ce serait le cas si les déclencheurs manipulaient des tables avec INSERT et UPDATE stagnant pour effectuer un MVCC intensif à l'intérieur de chaque appel à un déclencheur.

Combinez cela avec le fait que les protocoles de validation de données appropriés ne sont pas implémentés dans le langage de procédure stockée de MySQL. La Business Intelligence peut être contenue dans une base de données à condition que le langage de procédure stockée puisse gérer un environnement transactionnel. En tant que DBA MySQL, je dois honnêtement dire que ce n'est pas le cas avec MySQL. Oracle (PL/SQL), PostgreSQL (PL/pgSQL) et SQL Server (T-SQL) ont cet avantage sur MySQL.

Concernant les transactions, MySQL a InnoDB comme principal moteur de stockage compatible ACID (moteur de stockage par défaut dans MySQL 5.5). Il a une excellente récupération après incident et obéit aux protocoles de conformité ACID.

Je choisirais les transactions plutôt que les déclencheurs à chaque fois.

Je suis d'accord avec l'évaluation de Rolando. Votre logique métier doit résider dans votre application et doit apporter des modifications à la base de données de manière transactionnelle.

La mise à l'échelle jusqu'à 100 000 utilisateurs, bien sûr, dépend de votre application et du trafic de base de données qu'elle génère. Avec MySQL soumis à une lourde charge d'écriture transactionnelle, vous pourriez bientôt être confronté à la charge de partitionner et/ou de répliquer votre ensemble de données afin de maintenir une réponse d'application acceptable.

Cependant, il existe des alternatives au partage de MySQL. L'un d'eux est Cluster (mon employeur) qui est un système de base de données SQL à instance unique et évolutif en parallèle. C'est un système de base de données en cluster qui se présente comme un seul serveur MySQL. La mise à l'échelle de la base de données décrite dans ce fil de discussion à 100 000 utilisateurs sur une seule instance de Clustrix ne nécessiterait aucun sharding et aucune logique d'application supplémentaire.

De plus, les déclencheurs ne doivent pas être utilisés pour la logique, car quelques déclencheurs interdépendants plus tard, les choses deviendront rapidement confuses. Un bel ensemble d'instructions dans une procédure stockée ou une procédure côté client peut faire passer la logique métier plus clairement qu'un tas de logique cachée dans la base de données. Il existe également des limitations sur les déclencheurs en ce qui concerne la table à partir de laquelle ils sont déclenchés - vous pouvez donc vous retrouver à diviser votre logique en deux endroits différents.

De plus, vous pouvez trouver des moyens d'optimiser à quel moment ces calculs se produisent dans votre serveur de logique métier, alors qu'un déclencheur se déclenchera à chaque fois. Vous vous retrouverez à désactiver le déclencheur, à mettre à jour la table, puis à réactiver le déclencheur - ce qui signifie également que vous devez mettre la logique de déclenchement dans ce code.

De plus, vous n'avez pas besoin d'avoir toute la logique dans la partie logique métier du code, vous souhaiterez peut-être appliquer l'intégrité de la table à l'aide de procédures stockées. Cela peut démarrer une transaction, effectuer vos multiples mises à jour et faire reculer les choses en cas d'échec. De cette façon, quelqu'un qui consulte la base de données peut voir la logique d'insertion d'une commande, par exemple. C'est moins important dans le monde d'aujourd'hui puisque les services Web peuvent être l'interface d'accès unique à la base de données, mais dans le cas où plusieurs exécutables ont accès à la base de données, cela peut être énorme.

De plus - vous allez avoir des transactions de toute façon - vous n'allez pas exécuter vos déclencheurs sans un. droite? Il est donc bon de savoir comment démarrer une transaction, faire certaines choses, puis terminer une transaction. Si vous voyez ce modèle dans votre code, un autre morceau de code qui l'utilise sera léger sur la charge cognitive. Un déclencheur, si vous vous souvenez qu'il est là, vous obligera à penser différemment pour les transactions affectées par le déclencheur, en particulier si d'autres tables sont extraites qui peuvent également avoir des déclencheurs.

Fondamentalement, entre une tâche cron régulièrement planifiée (ou une tâche d'agent de base de données) et de bonnes procédures stockées, vous pouvez accomplir 99% de ce que vous voulez. Les 1% repensent le projet.


7 réponses 7

La source la plus probable de ces informations est l'implémentation WebRTC de votre navigateur.

Vous pouvez le voir dans le code source de ip-api.com.

De https://github.com/diafygi/webrtc-ips, qui fournit également une démo de cette technique :

Firefox et Chrome ont implémenté WebRTC qui permet de faire des requêtes aux serveurs STUN qui renverront le adresses IP locales et publiques pour l'utilisateur. Ces résultats de requêtes sont disponibles en javascript, vous pouvez donc désormais obtenir les adresses IP locales et publiques des utilisateurs en javascript.

Il a été récemment noté que le New York Times utilisait cette technique pour aider à distinguer les vrais visiteurs des robots (c'est-à-dire que si l'API WebRTC est disponible et renvoie des informations valides, il s'agit probablement d'un vrai navigateur).

Il existe quelques extensions Chrome qui prétendent bloquer cette API, mais elles ne semblent pas être efficaces pour le moment. C'est peut-être parce qu'il n'y a pas encore les crochets dans le navigateur, comme le GitHub README y fait allusion :

De plus, ces requêtes STUN sont effectuées en dehors de la procédure XMLHttpRequest normale, elles ne sont donc pas visibles dans la console développeur ou ne peuvent pas être bloquées par des plugins tels que AdBlockPlus ou Ghostery.

Une méthode courante pour obtenir l'adresse IP interne consiste à utiliser RTCPeerConnection en JavaScript.

http://ip-api.com/ par exemple, appelle une fonction javascript nommée "gi" qui contient le code suivant :

Techniquement, cela se fait en définissant un rappel sur la connexion RTC (objet o) avec "onicecandidate" et en obtenant l'attribut candidat.candidate de l'événement. Cela listera toutes les adresses IP locales de vos interfaces réseau.

Le script JavaScript peut renvoyer ces informations à un serveur Internet, mais http://ip-api.com/, par exemple, les affiche simplement au client.

WebRTC n'est qu'un moyen parmi d'autres de découvrir les adresses IP LAN.

Il y a eu une belle conférence Black Hat 2012 sur ce sujet, intitulée Blended Threats and JavaScript: A Plan For Permanent Network Compromise, dans laquelle Phil Purviance et Josh Brashars ont présenté une méthode automatisée pour trouver et effacer votre routeur wifi domestique en un seul clic sur un site Internet.

Cela était antérieur à WebRTC, ils devaient donc découvrir l'adresse IP de votre routeur d'une autre manière. Cela peut être fait avec des scanners JavaScript comme jslanscanner, JSScan, JS-Recon, mais une collection simple (mais importante) d'objets intégrés qui ne font que deviner l'adresse du routeur (par exemple, en incorporant une image de routeur attendue et en notant quand il se charge avec succès). Une fois que vous avez l'adresse, vous pouvez deviner le mot de passe (en commençant par la valeur par défaut attendue) en utilisant RouterPasswords.com ou même en contournant l'authentification via Routerpwn.com.

Comme preuve de concept, leur démonstration a découvert l'adresse IP du routeur, recherché son mot de passe par défaut, s'est connecté et a automatiquement installé le micrologiciel de remplacement (DD-WRT). Une véritable attaque pourrait avoir un certain nombre de capacités malveillantes sur le nouveau micrologiciel et pourrait facilement le faire apparaître comme le système de routeur d'origine non modifié.

(Certes, cela identifie l'adresse IP LAN de votre routeur wifi domestique plutôt que votre adresse IP LAN locale, mais c'est assez proche et sans doute plus alarmant.)


7 réponses 7

De toute façon, vous devez vous attendre à ce que votre programme se termine pour plus de raisons qu'une simple exception non gérée, comme une panne de courant ou un processus d'arrière-plan différent qui fait planter tout le système. Par conséquent, je recommanderais de terminer et de redémarrer l'application, mais avec quelques mesures pour atténuer les conséquences d'un tel redémarrage et minimiser la perte de données possible.

Commencez par analyser les points suivants :

Combien de données peuvent réellement être perdues en cas d'arrêt du programme ?

Quelle est la gravité d'une telle perte pour l'utilisateur ? Les données perdues peuvent-elles être reconstruites en moins de 5 minutes, ou parlons-nous de perdre une journée de travail ?

Quel est l'effort nécessaire pour mettre en œuvre une stratégie de « sauvegarde intermédiaire » ? N'excluez pas cela parce que "l'utilisateur devra saisir un motif de modification" sur une opération de sauvegarde régulière, comme vous l'avez écrit dans un commentaire. Mieux vaut penser à quelque chose comme un fichier ou un état temporaire, qui peut être rechargé automatiquement après un plantage du programme. De nombreux types de logiciels de productivité le font (par exemple, MS Office et LibreOffice ont tous deux une fonction « enregistrement automatique » et une récupération après incident).

En cas de données erronées ou corrompues, l'utilisateur peut-il le voir facilement (peut-être après un redémarrage du programme) ? Si oui, vous pouvez offrir une option permettant à l'utilisateur de sauvegarder les données (avec quelques chances qu'elles soient corrompues), puis forcez un redémarrage, rechargez-les et laissez l'utilisateur vérifier si les données semblent correctes. Assurez-vous de ne pas écraser la dernière version qui a été enregistrée régulièrement (écrivez plutôt dans un emplacement/fichier temporaire) pour éviter de corrompre l'ancienne version.

Si une telle stratégie de "sauvegarde intermédiaire" est une option judicieuse, cela dépend en fin de compte de l'application et de son architecture, ainsi que de la nature et de la structure des données impliquées. Mais si l'utilisateur perd moins de 10 minutes de travail, et qu'un tel plantage se produit une fois par semaine ou même plus rarement, je n'y investirais probablement pas trop de réflexion.

Cela dépend dans une certaine mesure de l'application que vous développez, mais en général, je dirais que si votre application rencontre une exception non gérée, vous devez la terminer.

Car vous ne pouvez plus avoir confiance dans l'état de l'application.

Certainement, fournir un utile message à l'utilisateur, mais vous devez finalement mettre fin à l'application.

Compte tenu de votre contexte, je voudrais certainement que l'application se termine. Vous ne voulez pas qu'un logiciel exécuté dans un laboratoire produise une sortie corrompue et puisque vous n'avez pas pensé à gérer l'exception, vous n'avez aucune idée de la raison pour laquelle elle a été levée et de ce qui se passe.

Considérant qu'il s'agit d'un laboratoire de chimie et que votre application ne contrôle pas les instruments directement mais via d'autres services :

Forcer l'arrêt après avoir affiché le message. Après une exception non gérée, votre application est dans un état inconnu. Il pourrait envoyer des commandes erronées. Il peut même invoquer des démons nasaux. Une une commande erronée pourrait potentiellement gaspiller des réactifs coûteux ou mettre en danger l'équipement ou les personnes.

Mais tu peux faire autre chose : récupérer normalement après le redémarrage. Je suppose que votre application ne supprime pas ces services d'arrière-plan avec elle-même lorsqu'elle se bloque. Dans ce cas, vous pouvez facilement récupérer l'état d'eux. Ou, si vous avez plus d'état, envisagez de le sauvegarder. Dans un stockage qui a des dispositions pour l'atomicité et l'intégrité des données (SQLite peut-être ?).

Comme indiqué dans les commentaires, le processus que vous contrôlez peut nécessiter des modifications suffisamment rapides pour que l'utilisateur n'ait pas le temps de réagir. Dans ce cas, vous devriez envisager de redémarrer silencieusement l'application en plus d'une récupération d'état gracieuse.

Essayer de répondre de manière générale à cette question au plus haut niveau du programme n'est pas un jeu intelligent.

Si quelque chose s'est produit et qu'à aucun moment dans l'architecture de l'application quelqu'un n'a envisagé ce cas, vous n'avez aucune généralisation à faire sur les actions qui sont ou ne sont pas sûres à entreprendre.

Donc, non, ce n'est certainement pas une conception généralement acceptable de permettre à l'utilisateur de choisir si l'application essaie ou non de récupérer, car l'application et les développeurs n'ont manifestement pas fait la diligence raisonnable nécessaire pour savoir si c'est possible ou même sage .

Cependant, si l'application a des parties de grande valeur de sa logique ou de son comportement qui ont été conçues avec ce type de reprise après incident à l'esprit, et qu'il est possible de les exploiter dans ce cas, alors, par tous les moyens, faites-le - Dans ce cas , il peut être acceptable d'inviter l'utilisateur à voir s'il souhaite tenter une récupération ou s'il souhaite simplement arrêter et recommencer.

Ce type de récupération n'est généralement pas nécessaire ou conseillé pour tous (ou même la plupart) des programmes, mais, si vous travaillez sur un programme pour lequel ce degré d'intégrité opérationnelle est requis, cela peut être une circonstance dans laquelle présenter ce type de inviter un utilisateur serait une chose sensée à faire.

En leiu de toute logique de récupération d'échec spéciale - Non, ne faites pas cela. Vous n'avez littéralement aucune idée de ce qui se passera, si vous l'aviez fait, vous auriez détecté l'exception plus bas et l'aurais gérée.

Le problème avec les "exceptions exceptionnelles", c'est-à-dire les exceptions que vous n'avez pas prévues, est que vous ne savez pas dans quel état se trouve le programme. Par exemple, essayer de sauvegarder les données de l'utilisateur pourrait en fait détruire encore plus de données.

Pour cette raison, vous devez mettre fin à l'application.

Il y a une idée très intéressante appelée Logiciel en cas de panne uniquement par George Candea et Armando Fox. L'idée est que si vous concevez votre logiciel de telle manière que la seule façon de le fermer soit de le planter et que la seule façon de le démarrer soit de récupérer après un plantage, alors votre logiciel sera plus résilient et la récupération d'erreurs les chemins de code seront testés et exercés de manière beaucoup plus approfondie.

Ils ont eu cette idée après avoir remarqué que certains systèmes avaient démarré plus rapide après un crash qu'après un arrêt ordonné.

Un bon exemple, bien qu'il ne soit plus pertinent, sont certaines anciennes versions de Firefox qui démarrent non seulement plus rapidement lors de la récupération d'un plantage, mais aussi avoir une meilleure expérience de démarrage de cette façon! Dans ces versions, si vous arrêtez Firefox normalement, il fermera tous les onglets ouverts et démarrera avec un seul onglet vide. Alors que lors de la récupération d'un crash, il restaurait les onglets ouverts au moment du crash. (Et c'était le seul moyen de fermer Firefox sans perdre votre contexte de navigation actuel.) Alors, qu'ont fait les gens ? Ils n'ont tout simplement jamais fermé Firefox et à la place, ils l'ont toujours pkill -KILL firefox l'ont modifié.

Il y a un bel article sur les logiciels contre les pannes par Valerie Aurora sur Linux Weekly News. Les commentaires valent également la peine d'être lus. Par exemple, quelqu'un dans les commentaires souligne à juste titre que ces idées ne sont pas nouvelles et sont en fait plus ou moins équivalentes aux principes de conception des applications basées sur Erlang/OTP. Et, bien sûr, en regardant cela aujourd'hui, encore 10 ans après Valerie et 15 ans après l'article original, nous pourrions remarquer que le battage médiatique actuel sur les microservices réinvente encore une fois ces mêmes idées. La conception moderne du centre de données à l'échelle du cloud est également un exemple de granularité plus grossière. (N'importe quel ordinateur peut planter à tout moment sans affecter le système.)

Il ne suffit cependant pas de laisser votre logiciel planter. Il doit être conçu pour cela. Idéalement, votre logiciel serait divisé en petits composants indépendants que chacun peut planter indépendamment. De plus, le « mécanisme de blocage » doit se trouver à l'extérieur du composant qui est bloqué.


Je me rends compte que cette question a reçu une réponse, mais je ne pense pas que la réponse existante engage vraiment la question au-delà de pointer vers un lien généralement lié au sujet de la question. En particulier, le lien décrit une technique de configuration de réseau par programmation, mais ce n'est pas un "[une] méthode standard et acceptée" pour la configuration du réseau.

En suivant un petit ensemble de règles claires, on peut définir par programmation une architecture de réseau compétente (c'est-à-dire le nombre et le type de couches neuronales et le nombre de neurones composant chaque couche). En suivant ce schéma, cela vous donnera une architecture compétente mais probablement pas optimale.

Mais une fois ce réseau initialisé, vous pouvez régler itérativement la configuration pendant la formation en utilisant un certain nombre d'algorithmes auxiliaires une famille de ces travaux en taille nœuds basés sur (petites) valeurs du vecteur de poids après un certain nombre d'époques d'apprentissage - en d'autres termes, éliminant les nœuds inutiles/redondants (plus de détails ci-dessous).

Ainsi, chaque NN a trois types de couches : saisir, caché, et production.

Créer l'architecture NN signifie donc proposer des valeurs pour le nombre de couches de chaque type et le nombre de nœuds dans chacune de ces couches.

La couche d'entrée

Simple - chaque NN a exactement l'un d'entre eux - aucune exception à ma connaissance.

En ce qui concerne le nombre de neurones composant cette couche, ce paramètre est complètement et uniquement déterminé une fois que vous connaissez la forme de vos données d'entraînement. Spécifiquement, le nombre de neurones composant cette couche est égal au nombre d'entités (colonnes) dans vos données. Certaines configurations NN ajoutent un nœud supplémentaire pour un terme de biais.

La couche de sortie

Comme la couche d'entrée, chaque NN a exactement un couche de sortie. La détermination de sa taille (nombre de neurones) est simple, elle est entièrement déterminée par la configuration du modèle choisi.

Est-ce que votre NN va courir Machine Mode ou Régression Mode (la convention ML consistant à utiliser un terme qui est également utilisé dans les statistiques mais qui lui attribue un sens différent est très déroutante). Mode machine : renvoie une étiquette de classe (par exemple, « Compte Premium »/« Compte de base »). Le mode de régression renvoie une valeur (par exemple, le prix).

Si le NN est un régresseur, alors la couche de sortie a un seul nœud.

Si le NN est un classificateur, alors il a aussi un seul nœud à moins que softmax est utilisé, auquel cas la couche de sortie a un nœud par étiquette de classe dans votre modèle.

Les couches cachées

Ainsi, ces quelques règles définissent le nombre de couches et la taille (neurones/couche) pour les couches d'entrée et de sortie. Cela laisse les couches cachées.

Combien de couches cachées ? Eh bien, si vos données sont linéairement séparables (ce que vous savez souvent au moment où vous commencez à coder un NN), vous n'avez pas du tout besoin de couches cachées. Bien sûr, vous n'avez pas non plus besoin d'un NN pour résoudre vos données, mais il fera toujours le travail.

Au-delà de cela, comme vous le savez probablement, il y a une montagne de commentaires sur la question de la configuration des couches cachées dans les NN (voir la FAQ NN incroyablement complète et perspicace pour un excellent résumé de ce commentaire). Un problème au sein de ce sujet sur lequel il existe un consensus est la différence de performances par rapport à l'ajout de couches cachées supplémentaires : les situations dans lesquelles les performances s'améliorent avec une deuxième (ou troisième, etc.) couche cachée sont très peu nombreuses. Une couche cachée suffit pour la grande majorité des problèmes.

Alors qu'en est-il de la taille de la (des) couche(s) cachée(s) – combien de neurones ? Il existe des règles empiriques empiriques, parmi lesquelles la plus couramment invoquée est 'la taille optimale de la couche cachée se situe généralement entre la taille des couches d'entrée et la taille des couches de sortie'. Jeff Heaton, auteur de Introduction to Neural Networks in Java en propose quelques autres.

En résumé, pour la plupart des problèmes, on pourrait probablement obtenir des performances décentes (même sans une deuxième étape d'optimisation) en définissant la configuration de la couche cachée en utilisant seulement deux règles : (i) le nombre de couches cachées est égal à un et (ii) le nombre de neurones dans cette couche est la moyenne des neurones dans les couches d'entrée et de sortie.

Optimisation de la configuration réseau

Taille décrit un ensemble de techniques pour réduire la taille du réseau (par des nœuds et non par des couches) afin d'améliorer les performances de calcul et parfois les performances de résolution. L'essentiel de ces techniques consiste à supprimer des nœuds du réseau pendant la formation en identifiant les nœuds qui, s'ils étaient supprimés du réseau, n'affecteraient pas sensiblement les performances du réseau (c'est-à-dire la résolution des données). (Même sans utiliser une technique d'élagage formelle, vous pouvez avoir une idée approximative des nœuds qui ne sont pas importants en examinant votre matrice de poids après l'entraînement. pendant l'élagage.) Évidemment, si vous utilisez un algorithme d'élagage pendant la formation, commencez par une configuration de réseau qui est plus susceptible d'avoir des nœuds en excès (c'est-à-dire « élagables ») - en d'autres termes, lorsque vous décidez d'une architecture de réseau, faites erreur sur du côté de plusieurs neurones, si vous ajoutez une étape d'élagage.

En d'autres termes, en appliquant un algorithme d'élagage à votre réseau pendant l'entraînement, vous pouvez vous approcher d'une configuration de réseau optimale si vous pouvez le faire dans un seul « avance » (comme un algorithme basé sur un algorithme génétique) Je ne sais pas , même si je sais que pour l'instant, cette optimisation en deux étapes est plus courante.


Quickie : Captures d'écran WMV et GIF animés

De temps en temps, je fais des captures d'écran. Â J'utilise le Microsoft Expression Encoder. Ce n'est pas joli, mais je pense que c'est gratuit. Â La sortie, par défaut, est un fichier WMV (Windows Media Video).

YouTube est parfaitement compatible avec les fichiers WMV. Â Cependant, pour qu'une animation apparaisse sur Twitter, il doit s'agir d'un GIF animé avec une limite de 5 Mo.

Cela a pris un GIF animé de 14-20 Mo (non compressé) à 1,36 Mo. Â Ce qui est bien, car alors je peux montrer des gemmes comme ceci :

Quelque chose me dit que ce n'est pas la bonne façon de faire. pic.twitter.com/dxtf6HGbpP

&mdash Andrew Rohne (@okiAndrew) 11 août 2016


5 réponses 5

Ne touchez pas à Linux. Je déteste la façon dont les gens se lancent directement dans « Go with Linux » dès que vous rencontrez des problèmes avec une machine Windows. Il n'y a rien de mal avec Linux, mais l'apprendre en l'installant en remplacement d'un serveur de messagerie de production n'est pas le moyen de l'apprendre.

À moins que vous ne soyez à l'aise à 100% avec Linux, ce sera juste une douleur plus grande que sa valeur et vos utilisateurs doivent abandonner le groupware d'Exchange. Étant donné que vous êtes à but non lucratif, je soupçonne que vos utilisateurs sont très peu techniques et que rester avec Exchange/Outlook sera mieux pour eux, comme vous l'avez dit vous-même. Je suppose qu'ils n'aimeront pas autant Gmail, car la version gratuite (du moins celle que j'utilise pour un compte de domaine personnalisé) inclut de la publicité et vous devez ensuite y déplacer tous les e-mails. Étant donné que vous avez déjà Exchange et toutes les licences, je resterais avec cela et je réorganiserais simplement votre matériel. Vous et vos utilisateurs serez plus heureux.

En ce qui concerne les spécifications, 11 utilisateurs (et les 30 précédents) n'auront aucun problème avec l'un ou l'autre. Pour référence, j'ai exécuté un serveur Exchange de 100 utilisateurs, avec 40 utilisateurs actifs à la fois sur un ancien ordinateur de bureau AMD avec 512 Mo de RAM et un lecteur IDE. C'était un serveur temporaire pendant que je reconstruisais celui de production. Personne n'a fait attention à la vitesse, a fonctionné très bien pendant 4 semaines jusqu'à ce que je le remette sur le vrai serveur.

Faites tourner la station de travail OptiPlex, configurez Windows et Exchange dessus.

Déplacez toutes les boîtes aux lettres là-bas, assurez-vous que tous les utilisateurs sont actifs et référencent le nouveau serveur (si vous les laissez tous les deux en ligne cela se fera automatiquement lors de leur connexion)

Une fois cela fait, désinstallez Exchange de PowerEdge, en le désinstallant, cela le supprimera proprement de l'organisation Exchange.

Supprimez le PowerEdge du domaine.

Reformatez le PowerEdge, faites du lecteur SCSI un grand C :

Joignez-le au domaine, réinstallez Exchange dessus.

Remettez les boîtes aux lettres sur le serveur PowerEdge.

Désinstallez Exchange de l'OptiPlex, tout le monde est sur le nouveau PowerEdge

Supprimer l'OptiPlex du domaine

À ce stade, si les boîtes aux lettres sont suffisamment petites, vous pouvez les laisser ainsi. Mais si vous le pouvez, cela pourrait être vos prochaines étapes.

Mettez l'IDE de 80 Go dans le PowerEdge (je ne me souviens pas si les 1400 ont un IDE intégré ou non, s'ils le font, c'est facile alors)

Formatez le nouveau lecteur 80 Go, puis déplacez la banque de boîtes aux lettres vers le lecteur 80 Go.

Une fois cela fait, vous disposez maintenant d'un lecteur système de 20 Go et d'un lecteur de données de 80 Go.

Configurez une sauvegarde automatique de la banque de boîtes aux lettres sur un autre ordinateur en cas de défaillance de votre lecteur de données.

Compte tenu de l'argent et de l'équipement limités dont vous disposez, cela pourrait être votre meilleure voie à suivre.

Si vous avez des $, ajoutez une carte RAID 1 au 1400 et ajoutez 2 disques 250gig, au lieu de l'ancien SCSI, ce serait l'étape 4 de la première partie. Le reste du 1400 durera éternellement, les disques durs sont les points faibles. La vitesse et la mémoire du 1400 seront capables de gérer ce dont vous avez besoin. J'ai un serveur HP de 10 ans qui fonctionne toujours comme un champion, j'y ai laissé tomber quelques nouveaux disques durs et il est toujours aussi solide. De plus, c'était dans un lieu à but non lucratif, donc je peux comprendre le budget limité.

Regardez le coût total de possession lorsque vous réfléchissez à ce qu'il faut faire. Voici un exemple de base faisant des hypothèses pour les nombres.

Si vous prenez 12 heures pour faire tout le dépannage avec Windows, disons 20 $ de l'heure, cela coûtera 240 $ à votre organisme de bienfaisance. Même si vous êtes un employé, vous devez compter votre temps comme un coût.

Maintenant, si vous passez à Linux (un système d'exploitation que vous ne connaissez pas, ajoutez donc la courbe d'apprentissage), vous devez également y réfléchir. Supposons donc que vous êtes bon et qu'il faudra 24 heures pour que tout soit déplacé vers une boîte Linux et complètement en ligne (n'oubliez pas d'ExMerge toutes les boîtes aux lettres également). C'est environ 480 $ à ce stade. Mais ajoutez également toute nouvelle formation des utilisateurs pour le nouveau client Web que vous utiliserez, ainsi que la configuration IMAP sur Outlook pour eux. Ce sera probablement plus, disons ajouter 1 heure par personne x 10 personnes @ 15 $ par heure, c'est 150 $ de plus dont vous devez tenir compte. En plus de cela, ajoutez plus de temps par semaine pour vos opérations quotidiennes puisque vous continuerez être à l'aise avec ça. Tout ce temps que vous y consacrez est du temps que vous ne consacrez pas à vos autres emplois à l'association caritative, c'est donc un coût.

Si vous obtenez des prix caritatifs de MS, alors dites que le coût de la licence + votre temps est inférieur au coût de l'apprentissage de Linux, il est alors plus logique d'acheter une nouvelle licence pour Windows 2008 (vous pouvez utiliser Windows 2003 qui fonctionnera toujours sur ce matériel).

Donc, en fin de compte, appelez CDW pour obtenir le prix de la charité pour la licence ouverte, puis vous avez jusqu'en juillet 2010 pour que l'association économise suffisamment d'argent pour l'acheter, et à long terme, vous trouverez cela beaucoup moins cher puis aller avec Linux. J'ai déjà fait l'évaluation, Windows Charity + Mon temps est toujours moins cher que Linux + Learning Curve + Risk.

Je ne connais pas assez Linux (j'aurais aimé le savoir), donc si je l'avais sur un serveur et qu'il plantait plus tard, j'appellerais un gourou Linux beaucoup plus par heure que je n'en gagne et l'organisme de bienfaisance prendrait un sérieux touché (risque inconnu). Je n'ai pas encore rencontré de problème Windows que je n'ai pas résolu ou, dans le pire des cas, 260 $, je peux ouvrir un ticket avec MS (risque connu).

Et si vous avez le temps, apprenez Linux, démarrez-le dans un rôle non critique, donc s'il tombe en panne sur vous, vous n'avez pas besoin de dépenser de l'argent pour que quelqu'un le relance. J'exécute un serveur Linux qui est un serveur de fichiers de sauvegarde, pas le principal utilisé par les utilisateurs. Donc, s'il tombe en panne, le primaire est toujours en ligne et je peux passer le temps à le découvrir. Une fois que je suis à l'aise avec cela, je vais probablement le déplacer vers le serveur de fichiers de production afin que je puisse libérer cette licence Windows pour autre chose. But until I'm comfortable with it, I can't risk it going down and me not knowing my way around the server. If the IT is a secondary role for you it will be hard for you to spend enough time with Linux on company time, unless you spend time on your learning it. Never a bad idea, but I've been there and I don't like losing that much of my home life to the computer.


There is no other way but UNE (not so fast boy)

After extensive consultations with our space hab design engineer @John and him investigating papers on motion sickness (comment section for links and refs) it became apparent that even if B case may have some advantages from a structural perspective(so as problems), it has some disadvantages for human content of the space habitat. As a vector of apparent gravity will oscillate around a vertical axis, and it causing some unwanted consequences, like motion sickness, because the threshold is quite low,

So people have to adapt, but it is not known which other consequences it may have to humans living 24.7.365 in such conditions. Have seen an infant living on a yacht in Atlantics, just recently on yt, seems doing fine enough, so as there are some historical tribes which live on floating means, so as there are people living half-year at sea, but still, it is a problem which has to be considered, especially on the scale millions or more of different people living in such conditions. 33% of children below age 12, are more sensitive to the problem, for lesser ages it can be as high as half of them. people adapt, but yeah the problem has to be investigated specifically before the B case is rated for humans.

  • Good news for treemans - they do not have to have wind for their branches to grow healthy and strong, maybe.

Alors B case has problems as well.


Voir la vidéo: QGIS Python PyQGIS - Loading and symbolizing vector layers (Octobre 2021).