Новости

Viewing posts for the category habrahabr

Ищем пневмонию на рентгеновских снимках с Fast.ai

https://habr.com/ru/post/471282/
  • Python
  • Машинное обучение
  • Искусственный интеллект


Наткнулся на статью в блоге компании Школа Данных и решил проверить, на что способна библиотека Fast.ai на том же датасете, который упоминается в статье. Здесь вы не найдете рассуждений о том, как важно своевременно и правильно диагностировать пневмонию, будут ли нужны врачи-рентгенологи в условиях развития технологий, можно ли считать предсказание нейронной сети медицинским диагнозом и т.д. Основная цель — показать, что машинное обучение в современных библиотеках может быть довольно простым (буквально требует немного строчек кода) и дает отличные результаты. Запомним пока результат из статьи (precision = 0.84, recall = 0.96) и посмотрим, что получится у нас.
Берем данные для обучения отсюда. Данные представляют собой 5856 рентгеновских снимков, распределенных по двум классам — с признаками пневмонии и без. Задача нейронной сети — дать нам качественный бинарный классификатор рентгеновских снимков для определения признаков пневмонии.
Начинаем с импортирования библиотек и некоторых стандартных настроек:
%reload_ext autoreload
%autoreload 2
%matplotlib inline
from fastai.vision import *
from fastai.metrics import error_rate
import os

Далее определяем batch size. При обучении на GPU важно его подобрать таким образом, чтобы у вас не переполнялась память. При необходимости его можно уменьшить в два раза.
bs = 64

Важный Update:
Как справедливо заметили в комментариях ниже, важно четко отслеживать данные, на которой мы будем проверять эффективность модели. Обучать модель будем по изображениям в папках train и val, а валидировать по изображениям в папке test, аналогично тому, как делал вот этот товарищ.
Определяем пути к нашим данным
path = Path('storage/chest_xray')
path.ls()

и проверяем, что все папки на месте (папку val перенесли в train):
Out:
[PosixPath('storage/chest_xray/train'),
 PosixPath('storage/chest_xray/test')]

Готовим наши данные для «загрузки» в нейросеть. Важно отметить, что в Fast.ai есть несколько методов сопоставления изображения метке. Метод from_folder говорит нам о том, что метки нужно брать из имени папки, в которой находится изображение.
Параметр size означает, что мы ресайзим все изображения до размера 299х299 (наши алгоритмы работают с квадратными изображениями). Функция get_transforms дает нам аугментацию изображений для увеличения объема данных для обучения (мы оставляем здесь дефолтные настройки).
np.random.seed(5)
data = ImageDataBunch.from_folder(path, train = 'train', valid = 'test', size=299, bs=bs, ds_tfms=get_transforms()).normalize(imagenet_stats)

Заглянем в данные:
data.show_batch(rows=3, figsize=(6,6))


Для проверки смотрим, какие классы у нас получились и какое количественное распределение изображений между train и validation:
data.classes, data.c, len(data.train_ds), len(data.valid_ds)

Out:
(['NORMAL', 'PNEUMONIA'], 2, 5232, 624)

Определяем модель обучения на архитектуре Resnet50:
learn = cnn_learner(data, models.resnet50, metrics=error_rate)
и начинаем обучение на 8 эпох, основываясь на One Cycle Policy:
learn.fit_one_cycle(8)


Видим, что мы уже получили точность в 89% на валидационной выборке. Запишем пока веса нашей модели и попробуем улучшить результат.
learn.save('step-1-50')

«Размораживаем» всю модель, т.к. до этого мы обучали модель только на последней группе слоев, а веса остальных были взяты из предобученной на Imagenet модели и «заморожены»:
learn.unfreeze()

Ищем оптимальный learning rate для продолжения обучения:
learn.lr_find()
learn.recorder.plot()


Запускаем обучение на 10 эпох с различными learning rate для каждой группы слоев.
learn.fit_one_cycle(10, max_lr=slice(1e-6, 1e-4))


Видим, что точность нашей модели немного повысилась до 89,4% на валидационной выборке.
Запишем веса.
learn.save('stage-2-50')

Строим Confusion Matrix:

В этом месте мы вспомним, что сам по себе параметр точности (accuracy) недостаточен, особенно для несбалансированных классов. Например, если в реальной жизни пневмония будет встречаться только у 0,1% тех, кто проходит рентген исследование, система может просто выдавать отсутствие пневмонии во всех случаях и ее точность будет на уровне 99,9% с абсолютно нулевой полезностью.
Здесь и вступают в игру метрики Precision и Recall:
  • TP — истино-положительное предсказание;
  • TN — истино-отрицательное предсказание;
  • FP — ложно-положительное предсказание;
  • FN — ложно-отрицательное предсказание.

$Precision = TP / (TP + FP) = 385 / 446 = 0,863$

Empire ERP. Занимательная бухгалтерия: главная книга, счета, баланс

https://habr.com/ru/post/471304/
  • Python
  • Анализ и проектирование систем
  • TDD
  • ERP-системы


В данной статье мы осуществим попытку проникновения в самое сердце "кровавого энтерпрайза" — в бухгалтерию. Вначале мы проведем исследование главной книги, счетов и баланса, выявим присущие им свойства и алгоритмы. Используем Python и технологию Test Driven Development. Здесь мы займемся прототипированием, поэтому вместо базы данных будем использовать базовые контейнеры: списки, словари и кортежи. Проект разрабатывается в соответствии с требованиями к проекту Empire ERP: https://github.com/nomhoi/empire-erp/blob/master/requirements.md.

10 советов и приемов, которые помогут вам стать лучшим разработчиком на VueJS

https://habr.com/ru/post/471212/
  • Разработка веб-сайтов
  • JavaScript
  • VueJS


Перед вами вольный перевод статьи 10 Tips & Tricks to make you a better VueJS Developer с сайта Dev.to. Автор расскажет нам об интересных и полезных вариантах применения привычных нам средств VueJS.

Для чего был создан новый javascript framework htmlix

https://habr.com/ru/post/471246/
  • JavaScript


Добрый день в данной cтатье попытаюсь рассказать для чего был создан новый js frontend framework Htmlix. В общем возможно кто-то скажет что это очередной велосипед, но не суть, попытка вникнуть в работу большинства js фреймворков осталась безуспешной. Потому как требовала слишком большого времени и сил на их освоение, ну и слишком большая избыточность кода не дает полный контроль над инструментом который я хотел освоить для работы. Поэтому попробовав написать что-то на каждом из них, я так и не определился на конкретном тем-более, что постоянно придумывают что-то новое и не факт, что сегодня выучив один, завтра не прейдется учить новый более модный фреймворк.

Из недостатков существующих решений это отсутствие серверного рендеринга на php и возможности работать в связке с такими серверными решениями как например wordpress поэтому была поставлена задача создать что-то что встраивается в уже отданную сервером статическую страницу на каком бы языке она не была написана без необходимости серверного рендеринга на js и дублирования части кода и файлов фреймворка на сервер. Что-то на подобе jquery но с более структурированным кодом и возможностью делать как большый так и маленькие приложения, а также меню и всякую мелочь для сайтов, чтото универсальное что будет подходить для всех основных задачъ фронтенд разработки.

Поэтому было решено написать свой собственный микро фреймворк, который возможно полностью контролировать, чтобы он был не слишком большой и прост в понимании и освоении.

Скачать Htmlix а также сопутствующие примеры приложений можно здесь

Суть фреймворка в том что в уже отданной сервером странице он ищет все свойства которые затем необходимо будет изменить. Для этого мы разбиваем приложение на массивы, контейнеры и свойства. Массивы это обычные div элементы которые могут содержать в себе контейнеры, контейнеры это также div элементы с набором различных свойств таких как обработчики событий, текст, классы, атрибуты и пользовательские события для обновления интерфейса.

Разница в том что массивы и свойства мы объявляем не в js коде а в html поэтому они уже готовы и нет необходимости ждать когда код построит страницу, она уже отдается такой какая должна быть согласно данному url адресу, а затем фреймворк просто ищет соответствующие массивы и контейнеры и создает к ним ссылки для будущего обновления интерфейса при наступлении событий.

Например если мы хотим добавить обработчик событий то в html коде мы добавляем data свойство с именем обработчика и типом свойства в кавычках например создадим кнопку с обработчиком события click и параграф с текстом который изменится после клика на кнопку <button data-todoinput-clickone=«click» ...>

здесь первым идет название контейнера(todoinput — контейнер это div элемент который содержит в себе все свойства он выступает в роли хранилища для свойств), затем название свойства (clickone) а далее тип события «click». Второе свойство у нас не является событием, это просто текст который нужно будет изменить после клика по кнопке.

Тип свойства указывается для того чтобы фреймворк мог определить каким образом с ним работать если это событие, то указывается название события, таким образом фреймворк автоматически добавит обработчик события click нам необходимо будет только добывить функцию для обработки в js коде.

Html код данного приложения будет выглядеть так:

Исследуем утверждение центральной предельной теоремы с помощью экспоненциального распределения

https://habr.com/ru/post/471198/
  • Python
  • Математика


Вместо введения


В статье описывается исследование, проведенное с целью проверки утверждения центральной предельной теоремы о том, что сумма N независимых и одинаково распределенных случайных величин, отобранных практически из любого распределения, имеет распределение, близкое к нормальному. Однако, прежде чем мы перейдем к описанию исследования и более подробному раскрытию смысла центральной предельной теоремы, не лишним будет сообщить, зачем вообще проводилось исследование и кому может быть полезна статья.

В первую очередь, статья может быть полезна всем начинающим постигать основы машинного обучения, в особенности если уважаемый читатель еще и на первом курсе специализации «Машинное обучение и анализ данных». Именно подобного рода исследование требуется провести на заключительной неделе первого курса, указанной выше специализации, чтобы получить заветный сертификат.

Подход к проведению исследования


Итак, вернемся к вопросу исследования. О чем говорит нам центральная предельная теорема. А говорит она вот о чем. Если есть случайная величина X из практически любого распределения, и из этого распределения случайным образом сформирована выборка объемом N, то выборочное среднее, определенное на основании выборки, можно приблизить нормальным распределением со средним значением, которое совпадает с математическим ожиданием исходной совокупности.

Для проведения эксперимента нам потребуется выбрать распределение, из которого случайным образом будет формироваться выборка. В нашем случае мы воспользуемся экспоненциальным распределением.

Итак, мы знаем, что плотность вероятности экспоненциального распределения случайной величины X имеет вид:

$$display$$f(x) = \lambda \varepsilon^{-\lambda x}$$display$$

Recent Posts

Archive

2019
2018
2017
2016
2015
2014

Categories

Authors

Feeds

RSS / Atom