Рубрики
Без рубрики

ЧЕЛОВЕК НЕ ЧЕЛОВЕК

ЧЕЛОВЕК НЕ ЧЕЛОВЕК Так что, когда я поднимаю ноги на землю, я подумал, что напишу бинарные классы … Помечено машинным обучением, питоном, обработкой изображений, наукой данных.

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

Рубин Ваза

Как это происходит, я недавно установил камеру с фиксированным положением для малинового пия над моим крыльцом. Я написал какой -нибудь код, чтобы написать мне, когда происходит событие движения. А потом приходил текст каждые 20 минут с изображением кошки на нем. Серьезно, мой район переполнен кошками!

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

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

Обработка данных – Тяжелая работа

Большая часть этого упражнения была вводом данных. Существуют более прохладные способы предварительного обучения или проведения неконтролируемого обучения, но существующие наборы данных, как правило, скрывают, сколько работы пошло на их курирование. Удобство mnist.load_data () удивительно! Однако для решения задач, настроенных на конкретный набор данных, требуется использование этого конкретного набора данных. Это было точно так же скучно, как вы думаете. Кроме того, я подсчитывал людей и подсчитал автомобили, чтобы в будущем я мог попробовать несколько других моделей в этом наборе данных. Я тоже начал считать кошек, но было слишком много Так что я остановился (не шутка).

Проверка обучения по строительству и наборов данных тестирования

Критическим выводом, к которому я продолжаю возвращаться, является то, что данные для любой нейронной сети представляют собой матрицу или массив тензоров. Или любым способом, которым вы хотите описать структурированную коллекцию численных значений, с которыми мы собираемся обратиться к. Легко быть связано с примерами, требующими конкретной структуры каталогов или конкретной входной кодировки, но до тех пор, пока вы получите матрицы, тогда все будет в порядке. Есть веские причины, чтобы следовать стандартам, и использование запеченных систем для обучения, таких как SageMaker, потребует определенной структуры ввода, но я бы на самом деле рекомендовал осуществлять преобразование с отправной точки, которой нет:

| data
    | train
    | test

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

dataset = np.ndarray(shape=(len(data), target_height, target_width, channels), dtype=np.float32)
y_dataset = []
i=0

# Set of markers so I can create an lst
for index, row in data.iterrows():
    y_dataset.append(row.human)
    img = load_img(basePath + '/' + row.filename, target_size=(target_height, target_width))
    x = img_to_array(img)
    x = x / 255.0
    dataset[i] = x
    i += 1

Затем я использовал Sklearn train_test_split, чтобы случайным образом генерировать когорты для данных поезда и валидации. Наконец, я разделил проверку пополам для проверки и теста.

x_train, x_val_test, y_train, y_val_test = train_test_split(dataset, y_dataset, test_size=0.4)

validation_length = int(len(x_val))
# Separate validation from test
x_val = x_val_test[:validation_length]
y_val = y_val_test[:validation_length]

x_test = x_val_test[validation_length:]
y_test = y_val_test[validation_length:]

x_train.shape

Модель

Модель – это Привет, мир Модель бинарной классификации с несколькими добавленными настройками, которые казались хорошей идеей в то время. Я могу следовать структуре моделей и понять основополагающую математику, стоящую за ней, но есть мир различий между следованием против игры в джаз. Я очень рекомендую Книга Холета для учебника по градиентному происхождению и правило цепи, которое лежит в основе того, что происходит в модели. Я также изменил размер изображений, поэтому следов памяти понижен. Это сократило время обучения на порядок.

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=x_train[1,:].shape))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

Почему эта модель работает относительно хорошо

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

Пуристы будут упрекать меня, связанные с переосмыслением или другими ошибками целостности данных/предвзятости, но теперь, когда я могу успешно удалить текстовые сообщения CAT, я остаюсь в восторге.

Тренировки и как плавать без графического процессора

В первый раз, когда я запустил это, я тренировался на своем ноутбуке. Это заняло около 4 часов на 4 эпохи. Поэтому я начал изучать Sagemaker и Kaggle. Оба предлагают удивительный сервис, и оба имеют недостатки. Kaggle несколько ограничен в том, как вы можете загрузить свои собственные данные. А SageMaker дает ноутбуки, которые являются мощными, но дорогими, и получение ваших данных в эти медиумы – это то, где находится сложность. У меня есть локальная ноутбука вместе с версией, которую я использовал в SageMaker.

Мой совет остается в соответствии с тем, что я нашел, связанный с AWS … Если вы собираетесь на эту вечеринку, вам лучше выпить всю помощь Kool. Если вы пытаетесь сделать половину шага в мир AWS, вы столкнетесь с каждым краем, который они блокируют. В этом случае я не принял свой собственный совет и в итоге загрузил свои данные на S3 и втянул их в ноутбук Jupyter на SageMaker.

Скорость тренировок была довольно терпимой, и сеть, похоже, не повредила слишком сильно с точки зрения времени, проведенного. Есть более предписанные способы создания тренировочных рабочих мест в SageMaker, но это на другой день. Kaggle работал бы, если бы я был умнее в своей конструкции данных и не требовался загружать весь набор данных в ОЗУ в качестве списка. Но что нужно знать на будущее. Всегда есть что -то новое, чтобы узнать.

batch_size=16
epochs=10

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_val,y_val))
model.save('current_full.h5')

Я тренировался на 797 изображениях для вторых проходов. 171 Изображения валидации и 171 тестовые изображения. Эти когорты были выбраны случайным образом.

Оценка модели

Я использовал тестовые данные, которые я отложил для оценки. Вот результаты высшего уровня.

  • Потеря: 0,5187677096205148
  • ACC: 0,877192983850401

Честно говоря, я все еще чувствую, как интерпретировать результаты, но я дошел до того, чтобы быть анекдотично удовлетворенным результатами, написав объемный сценарий процесса. Этот скрипт копирует файлы в каталоге в классифицированный набор изображений в соответствии с установленным порогом (вероятность человека 80%). Это был хороший способ установить, как проблема может быть использована в будущем.

#!/usr/bin/env python
# coding: utf-8

from keras.models import load_model
from keras.preprocessing.image import img_to_array, load_img

import os
from shutil import copyfile, rmtree
import sys

import numpy as np


def isHuman(filepath):
    img = load_img(filepath, target_size=(target_height, target_width))
    x = img_to_array(img)
    x = x / 255.0

    size = img.size

    dataset = np.ndarray(shape=(1, size[1], size[0], channels),dtype=np.float32)
    dataset[0] = x
    result = model.predict(dataset)
    return result[0][0]

# load the model
model = load_model('../models/human_not_human.h5')

# Base values
target_height = 180
target_width = 320
channels = 3

accept_threshold = 0.8

path = sys.argv[1]
print(path)

if not os.path.exists(path):
    raise Exception('`{}` does not exist or is not a directory'.format(path))


# Initialize the directory and ensure it's only our current version
dstPath = './data/tested/'
if os.path.exists(dstPath):
    rmtree(dstPath)
os.makedirs(dstPath)
os.makedirs(os.path.join(dstPath, '0'))
os.makedirs(os.path.join(dstPath, '1'))
for f in os.listdir(path):
    if f.endswith('.jpg'):
        filepath = os.path.join(path, f)
        human = '1' if isHuman(filepath) > accept_threshold else '0'
        copyfile(filepath, os.path.join(dstPath, human, f))

Собираюсь в производство

Как только у меня была обучена модель. Это довольно тривиально сохранять и загружать с помощью керас. Я создал два Производство сценарии. Тот, который я могу передать URL и получить прогноз. Второй повторяет каталог и копирует их в сортированную структуру каталога. Вот полный сценарий оперативного классификатора.

#!/usr/bin/env python
# coding: utf-8
from keras.models import load_model
from keras.preprocessing.image import img_to_array, load_img

import sys
from urllib.request import urlopen

import numpy as np

model = load_model('full.h5')

url = sys.argv[1]
print(url)

img = load_img(urlopen(url))
x = img_to_array(img)
x = x / 255.0

size = img.size
channels=3

dataset = np.ndarray(shape=(1, size[1], size[0], channels),dtype=np.float32)
dataset[0] = x
result = model.predict(dataset)

print(result[0][0])

Я все еще должен прикрепить это к камере Так что сейчас я все еще получаю уведомления о кошках на своем телефоне. Но я постоянно бегаю python aggen.py http://... с энтузиазмом по поводу основания решения.

Ссылки

Оригинал: “https://dev.to/jeffisadams/human-not-human-3fee”