Здравствуйте, Андрей - с момента выхода лекций кое-что поменялось, пришлось залезсть в документацию Keras и немного поменять код, иначе выдает ошибки - это для тех кто смотрим курс, model=Sequential() # Обязательно в слоях обработки изображения указывайте параметр data_format="channels_last" или data_format="channels_first", чтобы согласовать между слоями #положение переменной количества каналов, т.к. MaxPooling2D может урезать вам не само изображение а количество каналов, что вызовет ошибку # Также следует обновить название для сверточных слоев Conv2D вместо Convolution2D, но это не обязательно model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='valid', input_shape=(32,32,3), activation='relu',data_format="channels_last")) # (2) model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu',data_format="channels_last")) # (3) model.add(MaxPooling2D(pool_size=(2,2), data_format='channels_last')) # (4) model.add(Dropout(0.25)) # Добавим слой регуляризации model.add(Conv2D(64, (3, 3), padding='valid', activation='relu',data_format="channels_last")) # (5) model.add(Conv2D(64, (3, 3), activation='relu',data_format="channels_last")) # (6) model.add(MaxPooling2D(pool_size=(2,2), data_format='channels_last')) # (7) model.add(Dropout(0.25)) # Добавим слой регуляризации model.add(Flatten()) model.add(Dense(512, activation='relu')) # (8) model.add(Dropout(0.5)) # Добавим слой регуляризации model.add(Dense(10, activation='softmax')) # (9)
Можете уточнить , почему значение старого параметра border_name(новый-padding) в старой версии , в новой превратилось в "valid" вместо "same" ? Тем-более если верить сайту TF то valid - дефолтное значение этого параметра
Сегодня 16.06.2019 выполнял этот видеоурок на своей локальной машине на GPU. Вот эту строку "from tensorflow.keras.layers.convolutional import Convolution2D" пришлось заменить на "from tensorflow.keras.layers import Convolution2D, MaxPooling2D", иначе не работало. Также пришлось переделать вот здесь: "model.add(Convolution2D(32,3,2, padding='same', input_shape=(32,32,3), activation="relu")) model.add(Convolution2D(32,3,2, padding='same',activation="relu")) model.add(MaxPooling2D(pool_size=(2,2), padding='same'))". А иначе говорил про какую то проблему, что-то типа "у вас отрицательная размер размерности при вычитании 2 на 1"
Также для тех кто просто скачал архив данных - они там не структурированы, поэтому когда будете их компоновать, то делайте это в соответствие с переменной data_format # Обрати внимание на входные параметры, # filters=количество карт - видов ядер свертки, которые используются # kernel_size=(x1,x2) - размер окна ядра свертки # input_shape=(,y1,y2) - yi-размер изображения, !заранее согласуй с параметром # data_format-характеризует положение переменной количества каналов в кортеже, мб как channels_first - тогда сначала # ставим количество каналов или channels_last - тогда ставим количество каналов в конец кортежа. # !! В соответствии с этой переменной также нужно строить иерархию данных channels_first - сначала разделение по каналам, # а потом уже по строкам и столбцам Предлагаю свой вариант для data_format='channels_first': x_train - набор данных x_train1=[[i[:32*32],i[32*32:2*32*32],i[2*32*32:]] for i in x_train] x_train2=[[[j[k*32:(k+1)*32] for k in range(32)] for j in i] for i in x_train1] x_train2 имеет иерархию размеров (3,32,32)
Здравствуйте! Насколько близкие изображения можно так классифицировать? Подход классификации, например, подходит для отличия больного человека от здорового, для определения возраста дерева и пр.?
Андрей, добрый день! В примере CIFAR-10, в модели, в первом сверточном слое вы вводите параметр - "border_mode=''same'" (в keras 2. - padding). Этого параметра нет в примере MNIST. Объясните пожалуйста его смысловую нагрузку для модели?
Подскажите пожалуйста, когда мы комбинируем слои свёртки, как они налагаются друг на друга? сначала например 10 ядер, то есть получили карту из 10 признаков, потом на следующем слое 13 ядер, вот эти 13 ядер как наложатся на те 10, которые получились на предыдущем слое?
Андрей, здравствуйте. Получается, что надо найти или выбрать набор данных или базу данных при тестировании своей, например CIFAR-100 или Сосо-128? Есть ли базы данных по продукции в супермаркетах? Заранее спасибо
при ошибке "The specified size contains a dimension with value" надо поменять флаг в keras.json "image_data_format": "channels_first" www.itdadao.com/articles/c15a1247458p0.html
Дружище! скажи с чего вообще начать нужно? у меня есть картинки и есть команды макроссов (которые пишу сам) . в какую программу это вставить нужно? какую программу установить нужно? я 90% текста из видео не понимаю, потому что не знаю с чего вообще начали эти тексты, после включения компьютера и запуска виндовса. где вот этот промежуток?
Андрей, добрый день. В этом видео Вы говорите, что первый сверточный слой состоит из "32 карт признаков 3 на 3. Каждая с собственным ядром". Однако в предыдущем видео Вы рассказываете, что в сверточном слое все нейроны имеют одинаковое ядро и что картой признаков называется набор слоев с разными ядрами? Если это так, то как в указанном примере может быть 32 карты признаков и какой размер каждого слоя?.. Спасибо.
Здравствуйте! Подскажите, пожалуйста, разве validation set нужна не для поиска гиперпараметров? Просто в данном примере, где нет поиска гиперпараметров, совсем непонятно, зачем она вообще нужна. Почему нельзя обучить сеть на train set, а проверить качество на test set? Или Вы предварительно с её помощью находили лучшие гиперпараметры?
Да, проверочная выборка нужна для поиска гиперпараметров. В видео об этом действительно не рассказано, это существенный недостаток. Я запланировал перезапись первых лекций по курсу в начале следующего года, чтобы исправить ошибки. Так что пишите, если есть еще замечания или пожелания.
Привет, Андрей. Спасибо за этот курс по НС, очень помогает первому знакомству с темой. Есть пара вопросов по CNN: 1. В чем смысл 2х последовательных сверточных слоев без макспулинга между ними? 2. По количеству карт признаков: Если мы к 3м цветовым каналам применяем 32 свертки, то получаем 32*3 = 96 карты? Дальнейшие 32 свертки применяются опять ко всем картам независимо и получается 96*3 или как-то иначе? А дальше еще идут 2 слоя по 64 свертки. Получается какое-то слишком большое число картинок.
Я ускорил процесс обчуения в 17 раз, мне удалось к этому делу подключить свою видеокарту RX 480 8GB с помощью библиотеки PlaidML и одна эпоха проходит всего за 21 секунду (!)
Привет! А как адаптировать подобную конструцию под другие изображения? Если я, например, хочу научить сеть распознавать конкретный обьект - отвёртку на фотографиях. Как заменить данные cifar10.load_data() на свой вариант?
Скажите пожалуйста можно ли с помощью "python face recognition" создать похожи сервис каким был Findface?? насколько это сложная задача для программистов?
Понимаю что курс для начинающих , но все таки вставлю свои три копейки , очень зря не разбираете (хотя бы вскользь) все те параметры , которые указываете в слоях , например border_name он же padding в новых версиях , в зависимости от его значения размерности массивов после обработки сверточным слоем будут разными (собственно больше примеров не будет )) ибо я обжегся только с этим параметром , остальное вроде бы ясно как белый день )
Добрый день. Неокогнитрон очень похож на современные сверточные сети. Именно в неокогнитроне как раз и были придуманы слои свертки и подвыборки. Но там в слоях подвыборки использовалось усреднение, а сейчас более популярен выбор максимума. Основное отличие неокогнитрона от современных сверточных сетей - в нем не производилось обучение методом обратного распространения ошибки.
Здравствуйте, Андрей! Во время обучения модели возникает ошибка(" AbstractConv2d Theano optimization failed"). На англоязычных форумах писали, что нужно в конфигах к theano нужно указать следующее: theano.config.optimizer="None". Однако это все равно не решает проблему, подскажите, пожалуйста, в чем может быть дело.
Не знаю. Я сейчас уже не использую theano и перевожу курс на TensorFlow. Можно попробовать установить TensorFLow вместо Theano. Вот инструкция, как эт осделать - www.asozykin.ru/deep_learning/2017/09/07/Keras-Installation-TensorFlow.html
7:19 здесь вы сказали, что слой будет иметь 32 карты признаков, но какие именно карты признаков - разве не в зависимости от поставленной цели мы должны выбирать какие именно карты признаков должны быть использованы в Convolutional Layer ? Заранее Спасибо
Спасибо за ответ, только я не понял, как эти карты выбираются автоматически. Скажем если я создам Convolutional layer c одной картой - откуда программа будет знать по какому признаку я хочу классифицировать свою модель. Спасибо.
Это определяется в процессе обучения с учителем. Сначала веса в сверточных слоях назначаются случайным образом. Затем нейронной сети показываются картинки разных классов, для каждой из которых заранее известен правильный ответ. Нейронная сеть меняет коэффициенты в сверточных слоях в зависимост от того, удаьось ли правильно определить класс изображения. Для этого используется алгоритм обратного распространения ошибки.
@@AndreySozykin вы написали - «Нейронная сеть меняет коэффициенты в сверточных слоях». Может подразумевается изменение коэфицентов конкретно в Ядрах свёрточных слоёв или всё же речь о полносвязных (скрытых) слоях которые находятся на выходе за свёрточной сетью, ведь именно их веса регулируются методом обратного распростронения ошибки?
Андрей, огромное спасибо за материал! Вы делаете очень ценный труд! У меня есть вопрос: Я проделала работу по данной лекции, используя GPU NVIDIA GeForce 940MX. Сборка библиотек: python 3.7.0 + CUDA Toolkit 10.0 + cuDNN 7.6.0 + Tensorflow-gpu 2.0.0. У меня с Вашими гиперпараметрами скорость обучения намного выше (порядка 10сек/эпоху), но точность модели порядка 20%. Добиться 40% точности получилось только с такими значениями: число нейронов 800, оптимизатор adam, размер мини-выборки 256, количество эпох 150. При этом налицо переобучение. Правда, в коде я добавила padding='same' для 4го свёрточного и 2го слоя подвыборки (иначе была ошибка размерностей). О чём говорит такой результат? В какую сторону нужно копать, чтобы я могла эффективно заниматься машинным обучением на данной машине? Как вообще быть уверенным в качестве своей работы, если ошибок программа не выдаёт, а результат настолько отличается от работы аналогичной сети в других условиях?
Victoria, Была аналогичная беда. Можно в шапке поменять на следующее: import numpy from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten, Activation from tensorflow.keras.layers import Dropout from tensorflow.keras.layers import Conv2D, MaxPooling2D from tensorflow.keras import utils from tensorflow.keras.optimizers import SGD Как в моём ноутбуке github.com/vasiliyeskin/MachineLearningExperiences/blob/master/cifar10/CIFAR10_for_Colaboratory.ipynb
Здравствуйте, Андрей. Меня интересует вопрос: насколько мощными должны быть вычислительные возможности ПК , на котором запускаются приложения, использующие алгоритмы нейронных сетей? Например, ПК офисного класса смогут их потянуть или нужны получше?
На офисном ПК можно запускать. Примеры из курса точно будут работать. Кроме того, в нейронных сетях много времени занимает обучение. После обучения сеть работает достаточно быстро. Поэтому можно взять уже обученную сеть и использовать ее, даже на слабом компьютере или мобильном устройстве. Уже обученные модели есть, например, в библиотеке Caffe - caffe.berkeleyvision.org/model_zoo.html
Это значение инициализации генератора случайных чисел. Если задаем одинаковый seed, то генератор случайных чисел будет выдавать одну и ту же последовательность таких чисел. Так как для тренировки нейронных сетей используются стохастические методы, то результат обучения будет зависеть от того, какие случайные числе были сгенерированы. Чтобы этого избежать задаем seed. Можно попробовать не задавать seed, запустить обучение несколько раз и посмотреть, какие будут результаты.
Tesor+Keras, пример с github не работает. Во время запуска обучения прекращается работа программы python. Не зеаю что делать и в чём косяк. Помогите пожалуйста
Нужно сеть делать с большим разрешением на входе. Популярная сеть ResNet использует разрешение 224×224, а сеть Inception - 299×299. Размер входных данных в сеть фиксирован. Если хотим обрабатывать изображения разного размера, то их нужно преобразовывать к входному разрешению нейронной сети.
Получил 77% на тренировочном наборе, 72% на тестовом. Возникли следующие проблемы: 1) Изменение двух строчек с макспулингом на model.add(MaxPooling2D(pool_size=(2,2), dim_ordering="th")). 2) Четвертый слой свертки потребовалось дополнить "border_mode='same'", как и в третьем. 3) В первом слое свертки потребовалось заменить input_shape=(3,32,32) на input_shape=(32,32,3). С чем может быть связано такое различие или я что-то делаю неверно?
+Konstantin Isaenkov наверняка вы используете tensorflow в качестве вычислительного бекенда. Примеры рассчитаны на theano. У них разный порядок хранения тензоров.
Нужно будет подготовить обучающий набор для распознавания букв. Сеть сможет распознавать по одной букве. Если нужно распознавать текст, то лучше использовать готовые библиотеки, например - github.com/tesseract-ocr/tesseract
У меня не работала model.add(MaxPooling2D(pool_size=(2, 2),)), изменил на model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th")) и перестала выдавать ошибку, не знаю точно правильно ли так делать
ошибку выдавало потому что "первый сверточный слой" должен иметь input_shape = (32, 32, 3), а не 3, 32, 32. Теперь не нужно использовать dim_ordering="th"
Да, это значит, что в качестве бекенда используется TensorFlow. Я сейчас весь курс перевел с Theano на TensorFlow, переделаю и первые видео, чтобы не было проблем у начинающих.
+Igor Orlov, 1. В seed можно передавать любое число. 2. Для обучения в формате cifar10 нужно взять картинку, уменьшить размер до 32x32, прочитать значения цветов RGB и перевести их в массивы numpy.
Здравствуйте, спасибо за полезный курс!!! В следующей за этой лекцией практической работе висит ссылка на рекламу , вместо работы ((( и по всему блоку курса распознавания тоже такие ссылки есть .
+Leonid Rumatov, карта признаков (feature map по-английски) - это набор слоев, которые используют разные ядра свертки. Сколько должно быть карт признаков на каждрм слое заранее сказать нельзя. Поэтому пробуют несколько вариантов и выбирают лучший.
Здравствуйте, Андрей. По поводу "задаём seed - numpy.ramdom.seed()" - это статический параметр класса для рандомайзера? Т.е. керас использует под капотом нампаевский рандомайзер? Таким образом задавая сид мы определяем однозначно для всего текущего модуля предопределяемость значений рандомайзера, так что при любом вызове рандомайзера будем всегда иметь одну и ту же последовательность чисел, независимо от способа вызова?
Сейчас, когда Keras в составе TenserFlow 2.0, установка seed усложнилась, вот ссылка - www.tensorflow.org/api_docs/python/tf/random/set_seed Видео переделаю.
Здравствуйте, никак не пойму, что необходимо дописать, чтобы заработала модель сверточной сети cifar. Код брал отсюда github.com/sozykin/dlpython_course/blob/master/cifar10/cifar10.py, полностью скопировал. Однако выбивает ошибку ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got array with shape (50000, 1, 10). Ругается на лишнюю размерность... Ничего не понимаю. Вроде размерность под тензор флоу переписывали. Не понимаю откуда она берется. Можете подсказать?
Кому интересно, то решил пересбором тренировочных меток y. У меня в исходном тренировочном наборе откуда то было лишнее измерение: (50000, 32, 32, 3) (50000, 1) (50000, 32, 32, 3) (50000, 1, 10) Прописал так y_train = y_train.reshape(50000,). Заработало... (50000, 32, 32, 3) (50000,) (50000, 32, 32, 3) (50000, 10)
Раз уж зашла речь про скорость работы - возник вопрос. У меня 8-ядерный процессор, но я вижу, что у меня обучение занимает только четыре ядра. (Поставил параллельно два обучения - загрузились 8, всё по честному.) Где можно сконфигурить, чтобы загрузились все 8? Копать в Theano?
Какая модель процессора? Часто бывает, что операционная система показывает 8 ядер, но у процессора 4 физических ядра и каждое ядро может выполнять два потока (например, Intel Hyper Threading). Это полезно, когда небольшая вычислительная нагрузка, например, при работе с базами данных и сетевыми приложениями. Но если обучаем нейронные сети, то нагрузка на процессор большая и два потока на одном физическом ядре не ускоряют работу. Возможно, поэтому используется только 4 ядра.
Процессор intel core i7-6700. да, у него действитиельно 4 "честных" ядра, спасибо. Правда, неясно, почему тогда 2 процесса занимают все, но это уже другой вопрос, в основном ясно.
+Leonid Rumatov, один процесс определяет, сколько физических ядер и запускает на таком количестве. Но между собой процессы никак не координируются. Для этого нужен внешний менеджер ресурсов, например, SLURM.
Вот мне интересно, программисты когда-нибудь разовьются как вид способный объяснять свои проблемы на понятийном уровне. Это как объяснять уравнение y=x^2. Вместо того, чтобы сказать что это парабола, он начинает скурпулёзно вычислять массив координат. Ничего же не понятно. Ну не может он объяснить эту математическую модель. Я не все понял, но эта модель похожа на усложненную модель перцептрона Розенблатта. Перцептрон проверяет образ по принципу совпадения детали и штампа с допустимыми отклонениями. Дырочки должны совпадать с дырочками. Черные клеточки должны совпадать с черными клеточками. Этот метод распознавания работает только на неизменяемых образах таких как символьные переменные одного стиля. Лошадь так невозможно распознать - она спереди и сзади разную форму имеет. Лошадь - это изменяемый образ, его на совпадение штампу не проверить. Перцептрон Розенблатта - добавил еще несколько слоев нейрончиков и принципиально ничего не изменилось - идея та же.
Тут два фактора: 1. если вы рассмотрите разные образы лошадей как точки на графике некоторой "лошадиной" функции, то полносвязная сеть занимается тем, что своими весами аппроксимирует эту функцию (это и есть основное доказанное свойство сети). Т.е., она способна определить, лежит ли предъявленный образ между двумя ранее изученными образцами, или он где-то в стороне от них. Если же у вас фотки "спереди" и "сзади", то, скорее всего, это будет функция из двух кривых, с разрывом - одна для морды, другая для ... :) 2. свёрточный слой занимается фактически тем, что сильно понижает вариативность изображения, трансформируя его в подобие "алфавита". А нейросетка затем вычленяет те буквы этого алфавита, которые дают ей существенные признаки. Этот курс хорош (великолепен!) тем, что он практический, дан простым ясным языком. Есть статьи и видео, где очень хорошо рассказывают теорию, но они до практики либо не доходят, либо уходят в дикие дебри. А тут можно получить реально работающий механизм и дальше улучшать его для себя, читая и применяя.
Спасибо, что попытались объяснить. к сожалению ваши фразы из которых вы сделали предложения - образы как точки на графике, понижает вариативность изображения, вычленяет буквы - не несут для меня полезной информации. Я то ожидал услышать что-то вроде - движение планет есть суперпозиция падения на Солнце благодаря силе притяжения к Солнцу, и движения по инерции по касательной к траектории планеты. Выражаться надо математически, а не литературно.
@@ИванИванович-ы6щ6й да, так бывает, что образного мышления нет. В соответствии с теоремой Цыбенко, отклик обученной нейросети есть вычисление значения аппроксимирующей функции от множества аргументов предъявленного образца. Никакой магии.
да вы не поняли о чем эта теорема. Он примитивную вещь объясняет для аналога перцептрона замысловатыми математическими терминами. И она ничего не говорит про то, как распознать лошадь. Потолкуйте с математиками - они вам ее разжуют.
Так это ведь и есть обычный перцептрон - два полносвязных слоя. Просто перед ним поставили несколько слоёв параллельных фотофильтров, которые подстраиваются через back propagation. А теорема как раз говорит - что ей без разницы, голова там или задница, потому что при достаточной мощности слоя, *всегда* существует набор апроксимирующих коэффициентов для *любого* набора данных с заданной точностью. Нейросеть не оперирует никакими смыслами - это просто сложная непрерывная функция. Роль свёрточных слоёв лишь в том, что после их преобразования требования к мощности перцептрона снижаются. Теоретическая часть свёрточной сети идеально описана прямо в вики.
@@AndreySozykin , возникло несколько вопросов: сколько нейронов в каждой карте признаков на первом сверточном слое ? имеет ли это значение? это как-то автоматически определяется? на что влияет количество карт признаков в слое? должно ли оно чему-то соответствовать?
@@AndreySozykin Очень жду =) Коснитесь пожалуйста тему создания нейросети по своим картинкам с выделением координат найденных объектов. Практически ничего по этой теме нет. Также есть интересный фреймворк ImageAi. По нему тоже ничего нет в сети, кроме пару примеров.
а я буду вашим руководителем) А что за производство то? что мы будем производить из этого набора? самолеты грузовики или может ... лягушек? з.ы. таких "специалистов" коля как ты больше чем ты думаешь)
Ну и где тут распознавание объектов? Что вы тут распознали? Вы просто берёте зарубежные статьи и озвучиваете их как делают все остальные. Где свой набор данных? Как сверточной сетью пометить и вырезать несколько объектов на фото? Вы создаете больше вопросов, чем на них отвечаете. Я полностью канал посмотрел и не увидел именно вашего личного.
потрясающая способность говорить по сути и без воды. Спасибо за полезную информацию
Пожалуйста! Успехов.
Здравствуйте, Андрей - с момента выхода лекций кое-что поменялось, пришлось залезсть в документацию Keras и немного поменять код,
иначе выдает ошибки - это для тех кто смотрим курс,
model=Sequential()
# Обязательно в слоях обработки изображения указывайте параметр data_format="channels_last" или data_format="channels_first", чтобы согласовать между слоями
#положение переменной количества каналов, т.к. MaxPooling2D может урезать вам не само изображение а количество каналов, что вызовет ошибку
# Также следует обновить название для сверточных слоев Conv2D вместо Convolution2D, но это не обязательно
model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='valid', input_shape=(32,32,3),
activation='relu',data_format="channels_last")) # (2)
model.add(Conv2D(filters=32, kernel_size=(3, 3),
activation='relu',data_format="channels_last")) # (3)
model.add(MaxPooling2D(pool_size=(2,2), data_format='channels_last')) # (4)
model.add(Dropout(0.25)) # Добавим слой регуляризации
model.add(Conv2D(64, (3, 3), padding='valid', activation='relu',data_format="channels_last")) # (5)
model.add(Conv2D(64, (3, 3), activation='relu',data_format="channels_last")) # (6)
model.add(MaxPooling2D(pool_size=(2,2), data_format='channels_last')) # (7)
model.add(Dropout(0.25)) # Добавим слой регуляризации
model.add(Flatten())
model.add(Dense(512, activation='relu')) # (8)
model.add(Dropout(0.5)) # Добавим слой регуляризации
model.add(Dense(10, activation='softmax')) # (9)
Да, действительно, изменений много. В ближайшее время планирую перезаписать с работающими командами.
Ну мне кажется это можно воспринять как лишний повод пошевелить мозгами самому) так что так лаже лучше.
Курс для начинающих, обычно не очень удобно разбираться сразу с несколькими вещами: устройством нейронок и нерабоиающим кодом.
Можете уточнить , почему значение старого параметра border_name(новый-padding) в старой версии , в новой превратилось в "valid" вместо "same" ? Тем-более если верить сайту TF то valid - дефолтное значение этого параметра
@@AndreySozykin Когда? Или Уже?)
Огромное спасибо за максимально понятное объяснение, благодаря вам я смог подружиться с keras :}
Отличный результат!
Для тех кто хочет повторить: Пишите padding="same" вместо border_mode='same'
Спасибо за видео
Отличная подача материала, спасибо!
Пожалуйста! Рад, что понравилось!
Сегодня 16.06.2019 выполнял этот видеоурок на своей локальной машине на GPU. Вот эту строку "from tensorflow.keras.layers.convolutional import Convolution2D" пришлось заменить на "from tensorflow.keras.layers import Convolution2D, MaxPooling2D", иначе не работало. Также пришлось переделать вот здесь: "model.add(Convolution2D(32,3,2, padding='same', input_shape=(32,32,3), activation="relu"))
model.add(Convolution2D(32,3,2, padding='same',activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2), padding='same'))". А иначе говорил про какую то проблему, что-то типа "у вас отрицательная размер размерности при вычитании 2 на 1"
Также для тех кто просто скачал архив данных - они там не структурированы, поэтому когда будете их компоновать, то делайте это в соответствие с переменной data_format
# Обрати внимание на входные параметры,
# filters=количество карт - видов ядер свертки, которые используются
# kernel_size=(x1,x2) - размер окна ядра свертки
# input_shape=(,y1,y2) - yi-размер изображения, !заранее согласуй с параметром
# data_format-характеризует положение переменной количества каналов в кортеже, мб как channels_first - тогда сначала
# ставим количество каналов или channels_last - тогда ставим количество каналов в конец кортежа.
# !! В соответствии с этой переменной также нужно строить иерархию данных channels_first - сначала разделение по каналам,
# а потом уже по строкам и столбцам
Предлагаю свой вариант для data_format='channels_first':
x_train - набор данных
x_train1=[[i[:32*32],i[32*32:2*32*32],i[2*32*32:]] for i in x_train]
x_train2=[[[j[k*32:(k+1)*32] for k in range(32)] for j in i] for i in x_train1]
x_train2 имеет иерархию размеров (3,32,32)
Здравствуйте! Насколько близкие изображения можно так классифицировать? Подход классификации, например, подходит для отличия больного человека от здорового, для определения возраста дерева и пр.?
Андрей, добрый день!
В примере CIFAR-10, в модели, в первом сверточном слое вы вводите параметр - "border_mode=''same'" (в keras 2. - padding). Этого параметра нет в примере MNIST. Объясните пожалуйста его смысловую нагрузку для модели?
Андрей, чем обусловленна выбранная Вами архитектура модели для данного урока?
Подскажите пожалуйста, когда мы комбинируем слои свёртки, как они налагаются друг на друга?
сначала например 10 ядер, то есть получили карту из 10 признаков, потом на следующем слое 13 ядер, вот эти 13 ядер как наложатся на те 10, которые получились на предыдущем слое?
Андрей, здравствуйте. Получается, что надо найти или выбрать набор данных или базу данных при тестировании своей, например CIFAR-100 или Сосо-128? Есть ли базы данных по продукции в супермаркетах? Заранее спасибо
при ошибке "The specified size contains a dimension with value"
надо поменять флаг в keras.json
"image_data_format": "channels_first"
www.itdadao.com/articles/c15a1247458p0.html
подскажите а как обычно решается задача установления факта наличия или отсутствия какого то одного класса на фото
Дружище! скажи с чего вообще начать нужно? у меня есть картинки и есть команды макроссов (которые пишу сам) . в какую программу это вставить нужно? какую программу установить нужно? я 90% текста из видео не понимаю, потому что не знаю с чего вообще начали эти тексты, после включения компьютера и запуска виндовса. где вот этот промежуток?
Андрей, добрый день.
В этом видео Вы говорите, что первый сверточный слой состоит из "32 карт признаков 3 на 3. Каждая с собственным ядром". Однако в предыдущем видео Вы рассказываете, что в сверточном слое все нейроны имеют одинаковое ядро и что картой признаков называется набор слоев с разными ядрами? Если это так, то как в указанном примере может быть 32 карты признаков и какой размер каждого слоя?..
Спасибо.
Здравствуйте, пробую перейти на практическую работу, но перебрасывает на сайт Tilda, как открыть ноутбук с практической работой к этому видео?
Актуальная версия курса с упражнениями на платформе OpenEdu - openedu.ru/course/urfu/PYDNN/
Можно бесплатно все делать.
Здравствуйте! Подскажите, пожалуйста, разве validation set нужна не для поиска гиперпараметров?
Просто в данном примере, где нет поиска гиперпараметров, совсем непонятно, зачем она вообще нужна. Почему нельзя обучить сеть на train set, а проверить качество на test set? Или Вы предварительно с её помощью находили лучшие гиперпараметры?
Да, проверочная выборка нужна для поиска гиперпараметров. В видео об этом действительно не рассказано, это существенный недостаток. Я запланировал перезапись первых лекций по курсу в начале следующего года, чтобы исправить ошибки.
Так что пишите, если есть еще замечания или пожелания.
Привет, Андрей. Спасибо за этот курс по НС, очень помогает первому знакомству с темой.
Есть пара вопросов по CNN:
1. В чем смысл 2х последовательных сверточных слоев без макспулинга между ними?
2. По количеству карт признаков: Если мы к 3м цветовым каналам применяем 32 свертки, то получаем 32*3 = 96 карты? Дальнейшие 32 свертки применяются опять ко всем картам независимо и получается 96*3 или как-то иначе?
А дальше еще идут 2 слоя по 64 свертки. Получается какое-то слишком большое число картинок.
Получил точность 0.1 на тренировочных данных, скопировал код с репозитория - то же самое. В чем может быть проблема?
Возможно, проблемы с установкой библиотек.
Подскажите пожалуйста. Не до конца понимаю, мы передаем же 3-х мерный массив, учитывая RGB. Тогда как наш слой (2D) принимает 3D?
Каждый канал ядром свертки обрабатывается отдельно.
Кто-либо может подсказать, по какому принципу указываются значения в каждой из функций ?
Я ускорил процесс обчуения в 17 раз, мне удалось к этому делу подключить свою видеокарту RX 480 8GB с помощью библиотеки PlaidML и одна эпоха проходит всего за 21 секунду (!)
1 эпоха за 5 секунд. нвидэ 1050
Привет! А как адаптировать подобную конструцию под другие изображения? Если я, например, хочу научить сеть распознавать конкретный обьект - отвёртку на фотографиях. Как заменить данные cifar10.load_data() на свой вариант?
Вот видео на эту тему - ruclips.net/video/_bH2oh75Kdo/видео.html
Андрей, большое спасибо!
Скажите пожалуйста можно ли с помощью "python face recognition" создать похожи сервис каким был Findface?? насколько это сложная задача для программистов?
Понимаю что курс для начинающих , но все таки вставлю свои три копейки , очень зря не разбираете (хотя бы вскользь) все те параметры , которые указываете в слоях , например border_name он же padding в новых версиях , в зависимости от его значения размерности массивов после обработки сверточным слоем будут разными (собственно больше примеров не будет )) ибо я обжегся только с этим параметром , остальное вроде бы ясно как белый день )
Добрый день, большое спасибо за ваш курс, очень интересно и доступно,
не планируете в своем курсе разобрать модель "неокогнитрон"?
Добрый день. Неокогнитрон очень похож на современные сверточные сети. Именно в неокогнитроне как раз и были придуманы слои свертки и подвыборки. Но там в слоях подвыборки использовалось усреднение, а сейчас более популярен выбор максимума. Основное отличие неокогнитрона от современных сверточных сетей - в нем не производилось обучение методом обратного распространения ошибки.
Я правильно понимаю, что если исходные данные черно-белые, в input_shape вместо 3 будет 1?
Да
Здравствуйте, Андрей! Во время обучения модели возникает ошибка(" AbstractConv2d Theano optimization failed"). На англоязычных форумах писали, что нужно в конфигах к theano нужно указать следующее: theano.config.optimizer="None".
Однако это все равно не решает проблему, подскажите, пожалуйста, в чем может быть дело.
Не знаю. Я сейчас уже не использую theano и перевожу курс на TensorFlow. Можно попробовать установить TensorFLow вместо Theano. Вот инструкция, как эт осделать - www.asozykin.ru/deep_learning/2017/09/07/Keras-Installation-TensorFlow.html
7:19 здесь вы сказали, что слой будет иметь 32 карты признаков, но какие именно карты признаков - разве не в зависимости от поставленной цели мы должны выбирать какие именно карты признаков должны быть использованы в Convolutional Layer ? Заранее Спасибо
В нейронных сетях карты признаков определяются автоматически в процессе обучения сети. Ничего самим задавать не нужно.
Спасибо за ответ, только я не понял, как эти карты выбираются автоматически. Скажем если я создам Convolutional layer c одной картой - откуда программа будет знать по какому признаку я хочу классифицировать свою модель. Спасибо.
Это определяется в процессе обучения с учителем. Сначала веса в сверточных слоях назначаются случайным образом. Затем нейронной сети показываются картинки разных классов, для каждой из которых заранее известен правильный ответ. Нейронная сеть меняет коэффициенты в сверточных слоях в зависимост от того, удаьось ли правильно определить класс изображения. Для этого используется алгоритм обратного распространения ошибки.
Спасибо.
@@AndreySozykin вы написали - «Нейронная сеть меняет коэффициенты в сверточных слоях». Может подразумевается изменение коэфицентов конкретно в Ядрах свёрточных слоёв или всё же речь о полносвязных (скрытых) слоях которые находятся на выходе за свёрточной сетью, ведь именно их веса регулируются методом обратного распростронения ошибки?
Андрей, огромное спасибо за материал! Вы делаете очень ценный труд!
У меня есть вопрос:
Я проделала работу по данной лекции, используя GPU NVIDIA GeForce 940MX. Сборка библиотек: python 3.7.0 + CUDA Toolkit 10.0 + cuDNN 7.6.0 + Tensorflow-gpu 2.0.0.
У меня с Вашими гиперпараметрами скорость обучения намного выше (порядка 10сек/эпоху), но точность модели порядка 20%.
Добиться 40% точности получилось только с такими значениями: число нейронов 800, оптимизатор adam, размер мини-выборки 256, количество эпох 150. При этом налицо переобучение.
Правда, в коде я добавила padding='same' для 4го свёрточного и 2го слоя подвыборки (иначе была ошибка размерностей).
О чём говорит такой результат? В какую сторону нужно копать, чтобы я могла эффективно заниматься машинным обучением на данной машине? Как вообще быть уверенным в качестве своей работы, если ошибок программа не выдаёт, а результат настолько отличается от работы аналогичной сети в других условиях?
В Tensorflow 2 много поменялось, поэтому результаты могут отличаться существенно.
@@AndreySozykin спасибо
Victoria,
Была аналогичная беда.
Можно в шапке поменять на следующее:
import numpy
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Activation
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import utils
from tensorflow.keras.optimizers import SGD
Как в моём ноутбуке github.com/vasiliyeskin/MachineLearningExperiences/blob/master/cifar10/CIFAR10_for_Colaboratory.ipynb
Здравствуйте, Андрей. Меня интересует вопрос: насколько мощными должны быть вычислительные возможности ПК , на котором запускаются приложения, использующие алгоритмы нейронных сетей? Например, ПК офисного класса смогут их потянуть или нужны получше?
На офисном ПК можно запускать. Примеры из курса точно будут работать.
Кроме того, в нейронных сетях много времени занимает обучение. После обучения сеть работает достаточно быстро. Поэтому можно взять уже обученную сеть и использовать ее, даже на слабом компьютере или мобильном устройстве.
Уже обученные модели есть, например, в библиотеке Caffe - caffe.berkeleyvision.org/model_zoo.html
В офисный пк можно воткнуть видяху с CUDA.
Здравствуйте, Андрей.
Для чего нужно задавать seed? В чем суть этой операции?
Это значение инициализации генератора случайных чисел. Если задаем одинаковый seed, то генератор случайных чисел будет выдавать одну и ту же последовательность таких чисел. Так как для тренировки нейронных сетей используются стохастические методы, то результат обучения будет зависеть от того, какие случайные числе были сгенерированы. Чтобы этого избежать задаем seed.
Можно попробовать не задавать seed, запустить обучение несколько раз и посмотреть, какие будут результаты.
Добрый день! Нужна программа для распознавания объектов и подсчет их на изображении, могли бы вы это сделать как с вами связаться?
Добрый день. Мои контакты здесь - www.asozykin.ru/contacts
Tesor+Keras, пример с github не работает. Во время запуска обучения прекращается работа программы python. Не зеаю что делать и в чём косяк. Помогите пожалуйста
еррортрейс дайте пожалуйста
а как сделать, чтобы с большим разррешением можно было распознавать? да и вообще с произвольным
Нужно сеть делать с большим разрешением на входе. Популярная сеть ResNet использует разрешение 224×224, а сеть Inception - 299×299.
Размер входных данных в сеть фиксирован. Если хотим обрабатывать изображения разного размера, то их нужно преобразовывать к входному разрешению нейронной сети.
@@AndreySozykin спасибо огромное!
Получил 77% на тренировочном наборе, 72% на тестовом.
Возникли следующие проблемы:
1) Изменение двух строчек с макспулингом на model.add(MaxPooling2D(pool_size=(2,2), dim_ordering="th")).
2) Четвертый слой свертки потребовалось дополнить "border_mode='same'", как и в третьем.
3) В первом слое свертки потребовалось заменить input_shape=(3,32,32) на input_shape=(32,32,3).
С чем может быть связано такое различие или я что-то делаю неверно?
+Konstantin Isaenkov наверняка вы используете tensorflow в качестве вычислительного бекенда. Примеры рассчитаны на theano. У них разный порядок хранения тензоров.
Данная реализация будет работать при распознавании с картинок рукописных букв???
Нужно будет подготовить обучающий набор для распознавания букв. Сеть сможет распознавать по одной букве.
Если нужно распознавать текст, то лучше использовать готовые библиотеки, например - github.com/tesseract-ocr/tesseract
У меня не работала model.add(MaxPooling2D(pool_size=(2, 2),)), изменил на model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th")) и перестала выдавать ошибку, не знаю точно правильно ли так делать
ошибку выдавало потому что "первый сверточный слой" должен иметь input_shape = (32, 32, 3), а не 3, 32, 32. Теперь не нужно использовать dim_ordering="th"
Да, это значит, что в качестве бекенда используется TensorFlow. Я сейчас весь курс перевел с Theano на TensorFlow, переделаю и первые видео, чтобы не было проблем у начинающих.
Здравствуйте!
А как можно посмотреть сколько часов осталось работы в Coloboratory?
1.почему в seed передаётся именно 42 ?
2. как самостоятельно создавать данные для обучения в формате cifar ?
+Igor Orlov,
1. В seed можно передавать любое число.
2. Для обучения в формате cifar10 нужно взять картинку, уменьшить размер до 32x32, прочитать значения цветов RGB и перевести их в массивы numpy.
ясно, спасибо
Здравствуйте, спасибо за полезный курс!!! В следующей за этой лекцией практической работе висит ссылка на рекламу , вместо работы ((( и по всему блоку курса распознавания тоже такие ссылки есть .
вот такая joxi.ru/ZrJoGZxfM30KWm
Поясните пожалуйста, что такое "карта признаков" и почему в первых свёрточных слоях их именно 32.
+Leonid Rumatov, карта признаков (feature map по-английски) - это набор слоев, которые используют разные ядра свертки. Сколько должно быть карт признаков на каждрм слое заранее сказать нельзя. Поэтому пробуют несколько вариантов и выбирают лучший.
Спасибо. До конца неясно, но уже понятно, куда копать.
Подскажите как мне заставить ее считывать цифры с фотки.
Здравствуйте, Андрей. По поводу "задаём seed - numpy.ramdom.seed()" - это статический параметр класса для рандомайзера? Т.е. керас использует под капотом нампаевский рандомайзер? Таким образом задавая сид мы определяем однозначно для всего текущего модуля предопределяемость значений рандомайзера, так что при любом вызове рандомайзера будем всегда иметь одну и ту же последовательность чисел, независимо от способа вызова?
Сейчас, когда Keras в составе TenserFlow 2.0, установка seed усложнилась, вот ссылка - www.tensorflow.org/api_docs/python/tf/random/set_seed
Видео переделаю.
@@AndreySozykin Спасибо!
Здравствуйте Андрей, подскажите, можно ли вместо cifar10 использовать свою базу изображений? Как можно это реализовать?
+Ruslan Ruslanov, да, можно. Следующее видео будет как раз на эту тему. Я уже его записал, осталось смонтировать.
Здравствуйте, никак не пойму, что необходимо дописать, чтобы заработала модель сверточной сети cifar. Код брал отсюда github.com/sozykin/dlpython_course/blob/master/cifar10/cifar10.py, полностью скопировал. Однако выбивает ошибку ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got array with shape (50000, 1, 10). Ругается на лишнюю размерность... Ничего не понимаю. Вроде размерность под тензор флоу переписывали. Не понимаю откуда она берется. Можете подсказать?
Andrey Sozykin жду с нетерпением :)
Кому интересно, то решил пересбором тренировочных меток y. У меня в исходном тренировочном наборе откуда то было лишнее измерение:
(50000, 32, 32, 3)
(50000, 1)
(50000, 32, 32, 3)
(50000, 1, 10)
Прописал так y_train = y_train.reshape(50000,). Заработало...
(50000, 32, 32, 3)
(50000,)
(50000, 32, 32, 3)
(50000, 10)
+Ruslan Ruslanov, к сожалению, у меня сломался ноутбук, на котором было несмонтированное видео. Придется пепезаписывать :-(
Раз уж зашла речь про скорость работы - возник вопрос. У меня 8-ядерный процессор, но я вижу, что у меня обучение занимает только четыре ядра. (Поставил параллельно два обучения - загрузились 8, всё по честному.) Где можно сконфигурить, чтобы загрузились все 8? Копать в Theano?
Какая модель процессора? Часто бывает, что операционная система показывает 8 ядер, но у процессора 4 физических ядра и каждое ядро может выполнять два потока (например, Intel Hyper Threading). Это полезно, когда небольшая вычислительная нагрузка, например, при работе с базами данных и сетевыми приложениями. Но если обучаем нейронные сети, то нагрузка на процессор большая и два потока на одном физическом ядре не ускоряют работу. Возможно, поэтому используется только 4 ядра.
Процессор intel core i7-6700. да, у него действитиельно 4 "честных" ядра, спасибо. Правда, неясно, почему тогда 2 процесса занимают все, но это уже другой вопрос, в основном ясно.
+Leonid Rumatov, один процесс определяет, сколько физических ядер и запускает на таком количестве. Но между собой процессы никак не координируются. Для этого нужен внешний менеджер ресурсов, например, SLURM.
Да, я не в смысле "процесс ОС". Процесс обучения.
а можно, пожалуйста, ссылку на урок по распознаванию рукописных цифр
Он в плейлистах на этом канале
Здравствуйте, а почему в предпоследнем слое именно 512 нейронов ?
Нет особенной причины. Можно попробовать 256 или 1024 и посмотреть, что получится.
Вот мне интересно, программисты когда-нибудь разовьются как вид способный объяснять свои проблемы на понятийном уровне. Это как объяснять уравнение y=x^2. Вместо того, чтобы сказать что это парабола, он начинает скурпулёзно вычислять массив координат. Ничего же не понятно. Ну не может он объяснить эту математическую модель. Я не все понял, но эта модель похожа на усложненную модель перцептрона Розенблатта. Перцептрон проверяет образ по принципу совпадения детали и штампа с допустимыми отклонениями. Дырочки должны совпадать с дырочками. Черные клеточки должны совпадать с черными клеточками. Этот метод распознавания работает только на неизменяемых образах таких как символьные переменные одного стиля. Лошадь так невозможно распознать - она спереди и сзади разную форму имеет. Лошадь - это изменяемый образ, его на совпадение штампу не проверить. Перцептрон Розенблатта - добавил еще несколько слоев нейрончиков и принципиально ничего не изменилось - идея та же.
Тут два фактора:
1. если вы рассмотрите разные образы лошадей как точки на графике некоторой "лошадиной" функции, то полносвязная сеть занимается тем, что своими весами аппроксимирует эту функцию (это и есть основное доказанное свойство сети). Т.е., она способна определить, лежит ли предъявленный образ между двумя ранее изученными образцами, или он где-то в стороне от них. Если же у вас фотки "спереди" и "сзади", то, скорее всего, это будет функция из двух кривых, с разрывом - одна для морды, другая для ... :)
2. свёрточный слой занимается фактически тем, что сильно понижает вариативность изображения, трансформируя его в подобие "алфавита". А нейросетка затем вычленяет те буквы этого алфавита, которые дают ей существенные признаки.
Этот курс хорош (великолепен!) тем, что он практический, дан простым ясным языком. Есть статьи и видео, где очень хорошо рассказывают теорию, но они до практики либо не доходят, либо уходят в дикие дебри. А тут можно получить реально работающий механизм и дальше улучшать его для себя, читая и применяя.
Спасибо, что попытались объяснить.
к сожалению ваши фразы из которых вы сделали предложения - образы как точки на графике, понижает вариативность изображения, вычленяет буквы - не несут для меня полезной информации.
Я то ожидал услышать что-то вроде - движение планет есть суперпозиция падения на Солнце благодаря силе притяжения к Солнцу, и движения по инерции по касательной к траектории планеты.
Выражаться надо математически, а не литературно.
@@ИванИванович-ы6щ6й да, так бывает, что образного мышления нет.
В соответствии с теоремой Цыбенко, отклик обученной нейросети есть вычисление значения аппроксимирующей функции от множества аргументов предъявленного образца. Никакой магии.
да вы не поняли о чем эта теорема. Он примитивную вещь объясняет для аналога перцептрона замысловатыми математическими терминами. И она ничего не говорит про то, как распознать лошадь.
Потолкуйте с математиками - они вам ее разжуют.
Так это ведь и есть обычный перцептрон - два полносвязных слоя. Просто перед ним поставили несколько слоёв параллельных фотофильтров, которые подстраиваются через back propagation.
А теорема как раз говорит - что ей без разницы, голова там или задница, потому что при достаточной мощности слоя, *всегда* существует набор апроксимирующих коэффициентов для *любого* набора данных с заданной точностью. Нейросеть не оперирует никакими смыслами - это просто сложная непрерывная функция.
Роль свёрточных слоёв лишь в том, что после их преобразования требования к мощности перцептрона снижаются.
Теоретическая часть свёрточной сети идеально описана прямо в вики.
Здравствуйте, почему на первом слое карта признаков 32?
Особых причин нет. Можно попробовать использовать разные значения.
автомобиль управляемый нейросетью с точностью 77%, это как бухим ездить))
Это же курс начального уровня, чтобы понять основы. Вряд ли можно ожидать, что написав две страницы кода можно получить высококачественное решение.
@@AndreySozykin я понимаю) просто прозвучало стебно)
@@AndreySozykin , возникло несколько вопросов:
сколько нейронов в каждой карте признаков на первом сверточном слое ? имеет ли это значение? это как-то автоматически определяется?
на что влияет количество карт признаков в слое? должно ли оно чему-то соответствовать?
IM Integral Music
Ну это же нейронные сети, пару аварий, и прога научится водить лучше трезвого тебя))
Ничего не работает (Python 3.7; Numpy 1.18.3; Keras 2.3.1). Ошибки после
# Создаём модель
model = Sequential()
Для новичка - пустое дело =(
Да, в ближайшее время переделаю все видео на Keras в TensorFlow 2.
@@AndreySozykin Очень жду =) Коснитесь пожалуйста тему создания нейросети по своим картинкам с выделением координат найденных объектов. Практически ничего по этой теме нет. Также есть интересный фреймворк ImageAi. По нему тоже ничего нет в сети, кроме пару примеров.
Хочу создать нечто подобное и продать на производство. Но не програмист, хотя и понимаю алгоритм, пологаю можно заработать, нужен компаньон
Я согласен быть команьоном. Ты в каком классе учешься?
а я буду вашим руководителем)
А что за производство то? что мы будем производить из этого набора? самолеты грузовики или может ... лягушек?
з.ы. таких "специалистов" коля как ты больше чем ты думаешь)
Кто будет повторять используйте GPU. Сэкономите уйму времени. 4сек против 370с на эпоху.
Да, GPU нужно использовать.
Новое исследование команды NickWare представлено на конференции ruclips.net/video/CcgQK3EoxZY/видео.html
Ну и где тут распознавание объектов? Что вы тут распознали? Вы просто берёте зарубежные статьи и озвучиваете их как делают все остальные. Где свой набор данных? Как сверточной сетью пометить и вырезать несколько объектов на фото? Вы создаете больше вопросов, чем на них отвечаете. Я полностью канал посмотрел и не увидел именно вашего личного.
нууу этооо так заатянуута. Зачем картинки читатать ты ж людям показываеш а не своей програми... Очень затянута