Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Библиотеки для создания нейронных сетей

Подскажите, какие существуют готовые библиотеки для разных ЯП, на базе которых можно писать свои нейронные сети.


Ответ

Самые передовые пакеты с большими наработками в нейросетях:
Caffe - C++ (native), Python (native), Java (3rd parties) DLIB - C++ (native), Python (native) OpenCV - C++ (naive), C (native), Java (native), Python (native), .NET (3rd parties) TensorFlow - C++ (naive), C (native), Java (native), Python (native) Keras - Python (native)
Все пакеты с открытым кодом, имеют хорошую документацию и множество примеров, открыты для расширений. Есть и другие пакеты.

Как отменить последний push?

Допустим сделал push, но теперь нужно отменить этот последний пуш из-за ошибки. Как это правильно сделать? Ветка master
P.S. по просьбе выложил ответ от команды git reflog, названия коммитов вымышленные, т.к. на задачу большого значения не влияют
$ git reflog 4e212ca (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: commit: мой последний коммит e12ea6d HEAD@{1}: reset: moving to HEAD^ 132ae6f HEAD@{2}: commit: ещё один коммит e43ea6d HEAD@{3}: commit: ещё один коммит 2234538 HEAD@{4}: pull: Fast-forward 89543c9 HEAD@{5}: commit: fix search


Ответ

Откатывать запушенные на сервер файлы во многих командах не рекомендуется, так как их могли уже забрать с сервера. Также настоятельно рекомендуется сделать резервную копию, скачав всё содержимое папки в какое-либо другое место.
В принципе, если вы работали из командной строки и ещё не успели её закрыть – то можете просто посмотреть, какой коммит был последним:
git commit -m "asdf" [master 6703d65] asdf 1 file changed, 3 insertions(+), 3 deletions(-)
git push Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 407 bytes | 407.00 KiB/s, done. Total 4 (delta 2), reused 0 (delta 0) To git.mydomain.tld:folder/repo.git 743acea..6703d65 master -> master
Последняя строчка говорит, что ДО push'а последний коммит был 743acea, а стал 6703d65 - вот и вернитесь к 743acea:
git reset --hard 743acea git push --force
Также если вы закрыли консоль (либо у вас UI в котором не видны действия), но вы уверены, что ничего после push не делали - вам помогут команды:
git reset --hard HEAD~1 git push --force
Вообще же лучше всего прочитать рефлог (git reflog) и откатиться к нужному коммиту через HEAD@{1} (уточните цифру сколько действий нужно отменить именно в вашем случае):
git reset --hard HEAD@{1} git push --force
Открываем reflog:
$ git reflog
6703d65 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: commit: asdf 743acea HEAD@{1}: commit: asdf 1a4e976 HEAD@{2}: commit: something
...
Ваша задача — найти в этом логе тот пункт, к которому вы хотите вернуться:
$ git reset --hard HEAD@{1}

Как в .NET Core установить другой уровень ведения логов

Не могу понять — вроде делаю всё правильно. Но почему то в логи .NET Core пишет сообщения уровня Information. Хотя я явно указал в настройках писать только Error. Вот часть Program.cs
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup() .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); }) .Build();
Конфиг appsettings.json выглядит так:
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Error" } }
Что я делаю не правильно?


Ответ

Разобрался... Причина была в том, что в директории приложения был файл appsettings.Development.json и настройки логгирования брались из него а не из appsettings.json, причем этот фал в обозревателе VisualStudio не было видно, а я и не догадался сам сходить в директорию приложения и посмотреть что там есть.
Откуда этот файл и кто его создал непонятно.

Стоит ли применять паттерн итератор

Доброго времени суток.
Вопрос следующий: имеется двумерный массив объектов. Несколько модулей в программе регулярно запрашивают какую-то часть этого массива и последовательно перебирают её элементы. Для некоторых модулей порядок обхода не важен, но для некоторых это критично. Так например один модуль запрашивает "прямоугольный" кусок этого двумерного массива и ему нужно дважды пробежаться по каждой строке начиная с верхней. Так вот, уместно ли применять паттерн итератор в случае, если порядок обхода для его клиентов критически важен и каждому клиенту может понадобиться установить свой порядок обхода, при этом придется реализовывать несколько итераторов с разным интерфейсом? И если нет, подскажите пожалуйста, стоит ли тогда передовать клиентам непосредственно сам двумерный массив с учетом, что может понадобиться изменить способ хранения данных? Какое архитектурное решение лучше подойдет в данном случаи?


Ответ

Общие рекомендации
Стоит сделать либо один класс с несколькими методами, предоставляющими выборки, либо несколько классов, по одному на вид выборки, и раздать их потребителям.
Каждый метод выборки должен возвращать специализированный итератор. Но интерфейсы у итераторов будут одинаковыми: это обычный Java-интерфейс Iterator
По поводу выборки прямоугольной области и двойных итераций по строкам:
Стоит сделать так: метод выборки возвращает итератор по объектам типа Row (добавьте какой-либо свой префикс), реализующий интерфейс Iterable. Каждый такой объект имеет ссылку на строку данных и поля first и length, и из него можно получить итератор по такому "слайсу". Таким образом можно итерироваться и по строкам и по элементам:
Iterable rows = someQuerier.getRect(left, top, width, height); for (RectRow row : rows) { // многократный проход по одной и той же строке for (int rowPassCount = 0; rowPassCount < maxRowPassCount; rowPassCount += 1) { for (YourItem item : row) { // Ваши действия с элементом } } }

Влияет ли блок try на производительность кода в С++, если исключений не возникает?

Прошу прощения если я задаю глупый вопрос, но мне нужно знать точно. Если я пишу подобный код на С++:
int main() try { ..... } catch (const std::bad_alloc& e) { ... } ... catch (...) { cout << "Was throw exception" << endl; system("pause"); }
Будет ли скомпилированный в блоке try код отличным от такого же кода без блока try? Может ли блок try оказывать какое либо влияние на производительность помимо ситуаций когда происходят исключения?


Ответ

Откровенно говоря, не очень понятно, как именно провести эксперимент... Так что это не более чем иллюстрация, по которой трудно делать выводы.
На такой функции-пустышке на VC++ 2017 попробовал -
int main(int argc, const char * argv[]) { { muTimer mt; for(int i = 0; i < 1000000; ++i) { try { f(i); } catch(...) {} } cout << mt.stop().duration() << endl; } { muTimer mt; for(int i = 0; i < 1000000; ++i) { f(i); } cout << mt.stop().duration() << endl; } }
int total;
void f(int i) { total += i; }
Получилось примерно 4 миллисекунды на 0.6. Но, думаю, что при серьезных функциях соотношение будет куда ближе к 1:1 :)

Как вызвать непереопределенную версию метода внутри родительского класса?

Можно ли переделать в классе "А" метод "function1" так, чтобы получить вывод "AA"?
package javatest;
public class JavaTest {
public static void main(String[] args) throws Exception { new B().function1(); } }
class A { public void function1() { System.out.println("A"); function2(); } protected void function2() { System.out.println("A"); } } class B extends A { public void function1() { super.function1(); } public void function2() { System.out.println("B"); } }
На PHP это можно было бы написать так:
class A { public function function1() { echo("A"); self::function2(); } protected function function2() { echo("A"); } } class B extends A { public function function1() { parent::function1(); } public function function2() { echo("B"); } } $b = new B(); $b->function1();


Ответ

В Java так сделать не получится, т.к. все методы виртуальны и, насколько мне известно, нет синтаксического сахара для обращения к конкретной реализации.
Соответственно, если вызывается метод с модификатором protected, то ожидается, что поведение этого метода может быть переопределено наследниками. В этом весь смысл виртуальных методов.
Для того чтобы внутреннее поведение метода нельзя было переопределить в наследниках, можно использовать методы private, которые наследникам недоступны.
Например, так:
class A { public void function1() { System.out.println("A"); function3(); } protected void function2() { function3(); }
private void function3() { System.out.println("A"); } }
Т.о. общий код function1 и function2 вынесен в отдельный метод function3. При этом классы-наследники могут переопределить поведение function2 без вреда для function1

Язык Rust: почему внешняя с++-функция выполняется в другом потоке?

Впечатление, что если в Rust подключить внешнюю функцию С++, то она выполняется в другом потоке, отличном от того, в котором находится вызывающий код.
Почему так происходит? Разве так задумано? Это описано где-нибудь?
Вот тестовая программа на Rust:
extern crate libc; use libc::{c_int};
#[link(name = "Project1", kind="static")] extern { pub fn lib_fun(i: c_int) -> c_int; }
fn main() { unsafe { lib_fun(2); } println!("from Rust: {}", 2); }
Вняшняя функция lib_fun на С++ выглядит так:
#include
extern "C" { int lib_fun(int t) { printf("from C++: %d
", t); return t; } }
Ожидаю, что программа должна вывести:
from C++: 2 from Rust: 2
Однако при запуске она выводит в обратной последовательности:
from Rust: 2 from C++: 2
Получается, внешняя функция lib_fun выполняется в другом потоке. Или я не прав?
Система Windows 7x64


Ответ

Она пишет в стандартный вывод через свой буфер. Вставка в С++-функции fflush(stdout); после printf решило проблему.