Как сделать свой фит

Обновлено: 08.07.2024

Используя пакет Keras на этих занятиях, мы с вами много раз обучали модель путем вызова метода fit(). Пришло время подробнее с ним познакомиться, увидеть его возможности и особенности.

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

Теперь, для запуска процесса обучения, необходимо определить оптимизатор и функцию потерь:

И, собственно, вызвать метод fit(), например, так:

Это мы делали с вами уже много раз и здесь вам, в целом, должно быть все знакомо.

У метода fit() много вспомогательных параметров, которые полезно знать для обеспечения контроля за процессом обучения нейросети. Рассмотрим наиболее значимые из них. Вначале увидим, как можно определять выборку валидации, по которой мы контролируем процесс переобучения.

Выборка валидации с массивами NumPy

Если обучающий набор данных представлен в виде NumPy-массивов, то мы можем указать долю, которая будет использована в качестве проверочной выборки. Это делается с помощью параметра:

validation_split = вещественное число (от 0 до 1)

Например, если указать:

то будут взяты последние 30% наблюденийиз массивов x_train и y_train (до их перемешивания), которые мы указываем в этом же методе для обучения. По умолчанию, метод fit() перетасовывает наблюдения выборок на каждой эпохе. Так вот, 30% наблюдений отбираются до перемешивания, а остальные 70% участвуют в обучении.

Если нас не устраивает такой встроенный механизм разбиения обучающих данных, то мы можем это сделать самостоятельно. Для простоты, возьмем первые 20% наблюдений для валидации, а остальные 80% превратим в набор обучающих данных. Вначале вычислим индекс для разбиения выборки:

А, затем, разделим наборы данных по этому индексу:

После этого, в методе fit() достаточно указать выборку для обучения и для проверки:

Как видите, здесь используется параметр validation_data для указания проверочной выборки.

Выборка валидации с tf.data.Dataset

Наборы данных для обучения модели могут быть представлены и в виде тензоров непосредственно пакета Tensorflow. Часто для этого используется специальный набор утилит в ветке:

Подробная документация по ним доступна по адресу:

В частности, можно сформировать выборку на основе уже имеющихся данных, используя метод from_tensor_slices() класса Dataset:

На выходе получим экземпляр этого класса с выборкой (x_train, y_train). Далее, мы можем перемешать наблюдения в выборке с помощью метода shuffle и разбить их по мини-батчам, например, размером 64 элемента:

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

Теперь, достаточно первым параметром передать объект Dataset в метод fit() и дополнительно указать число эпох:

При этом аргумент batch_size уже не имеет смысла, так как мы сделали эту разбивку ранее. Также на каждой эпохе данные будут браться с самого начала (сбрасываются), поэтому сеть будет учиться на одних и тех же наблюдениях от эпохи к эпохе (параметр shuffleздесь не применяется).

Выборка валидации с таким набором данных может быть добавлена только через параметр validation_data. Другой параметр validation_split здесь игнорируется:

Параметры steps_per_epoch и validation_steps

Если мы хотим, чтобы обучающие данные от эпохи к эпохе не сбрасывались, а последовательно проходили по мини-батчам от начала до конца, то для этого можно воспользоваться параметром

который устанавливает число батчей на эпоху, например, так:

Но, при слишком большом значении steps_per_epoch, например, 300 пакетов будет недостаточно для пяти эпох и Keras сгенерирует предупреждение с остановом процесса обучения.

Как правило, обучение запускают без этого параметра, но если вдруг потребуется более тонкая настройка для исследования процесса обучения, то полезно знать возможности метода fit().

Второй похожий параметр validation_steps задает число мини-батчей, используемых в проверочной выборке. Например, указав число пять:

в конце каждой эпохи будет использовано пять мини-батчей из выборки валидации для оценки качества работы модели на текущем этапе обучения.

Параметры class_weight и sample_weight

Как известно, входная выборка данных должна быть сбалансированной, то есть, каждый класс должен представляться примерно одинаковым числом наблюдений. Иногда это условие не выполняется, а, следовательно, обучение может пойти не самым лучшим образом. Для исправления такой ситуации в Keras можно дополнительно указывать веса для выходных значений, которые будут учитываться при вычислении функций потерь. Например, представим, что у нас есть нейросеть с N входами и M выходами:


Если обучающая выборка сбалансирована, то веса у всех выходов следует взять равными, обычно, единичными. Опишем это с помощью следующего словаря:

Здесь полагается, что M=10 (выходы с 0 до 9 – десять значений). В этом случае прогнозное значение тензора сети для функций потерь будет вычисляться как:


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

В программе мы можем указать эти веса, передавая словарь одноименному параметру class_weight метода fit():

Наверное, вы уже догадались, что если веса взять неравномерными (допустим, для первого выхода зададим вес в 1000, а остальные оставим прежними), то сеть будет обучаться, в основном, на распознавание цифры 0. И для нашей сбалансированной выборки общее качество классификации снизится до 87,7%. Поэтому такой подход полезен именно для несбалансированных выборок, где классам следует присваивать разные веса (чем меньше наблюдений, тем выше вес).

Другой параметр sample_weight позволяет устанавливать вес для отдельных наблюдений выборки. Например, написание некоторых единичек может быть похоже на написание семерок:


В нашем примере мы сделаем более простую манипуляцию – всем изображениям единичек присвоим вес 5.0, а остальным изображениям – вес 1.0. Через NumPy сделать это достаточно просто:

А, затем, в методе fit() указать этот параметр со сформированной коллекцией весов:

Обратите внимание, что веса наблюдений можно устанавливать только для массивов NumPy.

Статистика обучения

Метод fit() возвращает объект, в котором хранятся значения функций потерь для тренировочной и проверочной выборок, а также вычисляемые показатели метрик:

После выполнения программы в консоли увидим:

'accuracy': [0.9209374785423279, 0.9661250114440918, 0.9769583344459534],
'val_loss': [0.14193743467330933, 0.11101816594600677, 0.10447544604539871],
'val_accuracy': [0.9585000276565552, 0.9664999842643738, 0.9704166650772095]>

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

Использование генератора выборки keras.utils.Sequence

С помощью класса keras.utils.Sequence можно реализовать свой собственный генератор последовательности для обучающей выборки. Давайте посмотрим на конкретном примере как это можно сделать.

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

  • __len__() – возвращает число мини-батчей обучающей выборки;
  • __getitem__() – возвращает мини-батч по индексу idx.

После этого, достаточно создать экземпляр этого класса и указать его первым аргументом в метод fit():

  • многопроцессорность;
  • параметр shuffle=True в методе fit().

Наконец, если требуется менять выборку после каждой эпохи в процессе обучения, то достаточно в классе дополнительно реализовать метод on_epoch_end:

Здесь мы выполняем перетасовку наблюдений выборки после каждой эпохи (фактически, повторяем работу параметра shuffle=True).

Использование обратных вызовов (callbacks)

В заключение этого занятия кратко рассмотрим возможности реализаций обратных вызовов функций в процессе обучения модели сети. Конечно, первый вопрос, что это такое и зачем они нужны?Представьте, что мы бы хотели останавливать досрочно процесс обучения, если показатель качества (функция потерь) снижается очень медленно. Возможно, мы оказались на каком-то высоком плато и алгоритм backpropagationне может выйти с этого уровня на более низкий и достичь лучших показателей при обучении. В частности, такое действие можно реализовать с помощью встроенного класса callbackEarlyStopping, следующим образом:

Смотрите, мы вначале определили коллекцию из экземпляров обратных вызовов и передали ее в метод fit через параметр callbacks. В результате, после каждой эпохи будет отслеживаться параметр loss (значение функции потерь) и если его изменение окажется меньше, чем 0,5 на протяжении одной эпохи, то процесс обучения досрочно прервется. Конечно, я здесь специально поставил такое большое значение (в 0,5), чтобы показать как сработает этот callback. В реальности, параметр min_delta составляет от 0,01 и проверяется на протяжении, как минимум, двух эпох. Здесь же приведены тестовые значения параметров.

После запуска увидим строчку:

Epoch 00002: early stopping

Это означает, что процесс обучения был прерван после второй эпохи.

  • BaseLogger – для сбора средних значений по показателям метрик;
  • History – для записи какого-либо события в историю (статистику) во время обучения сети;
  • ModelCheckpoint – для сохранения модели (или весов) с некоторой регулярностью;
  • TerminateOnNaN – для досрочной остановки процесса обучения, если значение функции потерь станет не числовым (NaN).

Существуют и другие стандартные классы для callbacks, о которых подробно можно почитать на странице документации:

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

В качестве примера запишем класс ModelCheckpoint, со следующими параметрами:

  • filepath – путь к папке с данными (вместо будет подставлен номер текущей эпохи);
  • save_best_only – флаг, указывающий производить сохранение, если только показатель качества улучшится;
  • monitor – отслеживаемый показатель качества.

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

Создание пользовательских классов вызовов

  • on_(train|test|predict)_begin(self, logs=None) – вызывается при запуске обучения, тестирования или прогнозирования;
  • on_(train|test|predict)_end(self, logs=None) – вызывается в конце соответствующих методов;
  • on_(train|test|predict)_batch_begin(self, batch, logs=None) – вызывается вначале обработки мини-батча;
  • on_(train|test|predict)_batch_end(self, batch, logs=None) – вызывается в после обработки очередного мини-батча;
  • on_epoch_begin(self, epoch, logs=None) – вызывается вначале каждой эпохи;
  • on_epoch_end(self, epoch, logs=None) – вызывается в конце каждой эпохи.

Подробное описание по существующим методам и написанию собственных классов callback’ов смотрите в документации:

Для примера приведу класс, который сохраняет данные функции потерь по каждому мини-батчу и в конце обучения выводит информацию в консоль по первым пяти из них:

Затем, создаем список из callback’ов:

и запускаем процесс обучения:

После обучения увидим в консоли значения функции потерь для первых пяти мини-батчей.

Как видите, это достаточно полезный, простой и вместе с тем, гибкий инструмент для гибкого контроля за процессом обучения и эксплуатации нейронных сетей. На следующем занятии мы продолжим тему тонкой настройки обучения моделей и поговорим о методе compile().

Видео по теме
















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

Тренировки в домашних условиях

Программа тренировок в домашних условиях

Выберите ваш пол

Программа тренировок в домашних условиях

Программа тренировок в домашних условиях

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

В этой статье мы не будем рассматривать мусорные программы из Google Play, а конкретно шаг за шагом разберем, как сделать свой кастомный циферблат на ПК с помощью программы Mi Band WF Builder.

Я отходил около года с Mi Band 4, однако стандартные циферблаты меня не устраивали. Деятельность народных умельцев тоже хотелось немного "доработать напильником". Так я и научился методом проб и ошибок (то есть методом тыка), сам создавать "обложки" и редактировать имеющиеся. Нигде в интернете я не встречал подробного гайда, поэтому решил написать его собственноручно. Тем более, что Mi Band 4 является одним из самых популярных браслетов в России, с огромной базой пользователей.

реклама


Для начала, скачиваем программу WF Builder и распаковываем архив. Теперь нам нужен любой циферблат для примера, я дам вам ссылку на один из моих. Кладём этот bin-файл в ту же папку, куда мы распаковали программу.

Кликаем на само приложение, затем "открыть BIN" и указываем файл циферблата:


реклама

Программа распакует всё содержимое bin-файла в одноимённую папку, а затем откроет циферблат для просмотра. Должно получиться примерно так:


Здесь появляется огромный простор для творчества: заходите в папку с циферблатом и редактируете нужные картинки, как вам заблагорассудится. Разобраться, какая картинка к чему относится, я думаю, труда не составит - всё интуитивно понятно. Например, файлы 0001 - 0010 отвечают за цифры "часов", а 0011 - 0020 - за "минуты":


реклама

Редактировать их можно в любом графическом продукте, я использую Photoshop. Главное, не забывайте, что сохранять файлы нужно обязательно в PNG.

На первое время, рекомендую выбрать наиболее близкую вам "рыбу" циферблата, которую вы отредактируете по своему усмотрению. Огромное количество "вочфейсов" можно найти в специализированной теме на форуме 4PDA. Я сам выкладывал там свои творения.

Затем переходим к редактированию непосредственно в программе. С помощью нижней части регулируем нужные нам параметры, переключаясь между вкладками. Здесь что-то разжёвывать не вижу смысла, потыкаете и разберетесь сами:


реклама

Для нашего примера я поменял местами дату и день недели, просто изменив их координаты по оси Y, на экране изменения отображаются мгновенно:


Когда вы завершили редактирование, встаёт вопрос: а как, собственно, теперь эту папку с кучей PNG-файлов упаковать обратно в BIN? Тут два варианта, палитра (Palette) и RAW (как есть):


Чем же эти типы сборки отличаются?

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

В любом случае, я не рекомендую превышать объем файла bin в 250-300 Кб. Из-за особенностей браслета, его слабое железо начинает тормозить при обработке сложных "обложек".

Окей, наш циферблат мы собираем "палитрой". Помимо основного файла, программа также создаёт для него статичное и анимированное превью:


И как же теперь загрузить его на браслет? Сначала скидываем на телефон получившиеся файлы через USB-кабель.

Затем устанавливаем приложение "MiBand4 - Циферблаты" из Google Play. Скорее всего, оно у вас уже имеется. В "аппе" нажимаем слева кнопку меню, затем "установить свой циферблат".


Указываете путь к bin-файлу и вуаля! Циферблат появляется в MiFit (во вкладке администратор):


Теперь можно заливать его на браслет. На этом всё, желаю удачи в создании своих кастомных "вочфейсов"!

Подпишитесь на наш канал в Яндекс.Дзен или telegram-канал @overclockers_news - это удобные способы следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.


Mi Band 5 – главный фитнес-браслет 2020 года. Xiaomi решила не менять и без того успешный продукт, улучшив его в мелочах: добавили удобную магнитную зарядку и увеличили дисплей, для которого сами разработчики уже выпустили немало качественных циферблатов.

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

Что такое циферблаты и зачем они нужны

Циферблат – это заставка, которая отображается на главном экране фитнес-браслета. Она включает в себя все элементы интерфейса: картинку, текст, иконки, различные показатели (время, шаги, пульс) и т.д.


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

Как поменять циферблат на Mi Band 5

Xiaomi подготовила для браслета немало стандартных циферблатов: их уже доступно около 100 шт в приложении Mi Fit, и количество заставок регулярно увеличивается. Чтобы установить одну из официальных тем необходимо:


После этого пройдет 5-10 секунд синхронизации и заставка начнет отображаться на экране гаджета.

Количество циферблатов в Mi Fit зависит от того, на каком языке работает ваш смартфон. Например, установив в качестве системного языка английский или китайский, можно получить доступ к заставкам, не доступным в России.

В Mi Band 5 есть встроенная память, где хранится 6 последних циферблатов, которые можно менять непосредственно на браслете. Чтобы сделать это нажмите на главный экран и удерживайте палец до момента, пока не откроется меню выбора циферблата. Там есть 3 стандартных варианта, включая циферблат в виде аналоговых часов, а также 3 последние заставки, которые установлены через Mi Fit.


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

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

Где скачать циферблаты для Mi Band 5

Сторонние циферблаты скачиваются в формате .bin и требуют правильной установки. На Android делать это удобнее всего с помощью утилиты Mi Band 5 WatchFaces (вот ссылка на Google Play).

Как установить кастомный циферблат на Xiaomi Mi Band 5:

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

Вот лучшие приложения с циферблатами для Mi Band 5:


MiBand5 — Циферблаты для Xiaomi Mi Band 5. Ссылку на это программу мы давали чуть выше, помимо возможности установки .bin файлов, в ней собрано немало заставок с удобной каталогизацией, фильтрами и поиском. Кроме того, есть циферблаты на русском языке, которых в Mi Fit очень мало.

Mi Band 5 Faces (ссылка). По функционалу это практически идентичное приложение, но в нем собраны другие заставки.


Mi Band 5 WatchFaces (ссылка). Приложение на английском языке, но разобраться в нем сможет любой пользователей. Здесь также имеются категории, как и в предыдущих приложениях, а набор циферблатов заметно отличается.


AmazFaces (ссылка). Изначально программа предназначена для девайсов Amazfit, но в ней есть вкладка с немалым количеством качественных и ярких циферблатов для Mi Band 5.


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

Как сделать свой циферблат для Xiaomi Mi Band 5

Создавать свои циферблаты для Ми Бэнд 5 можно прямо в Mi Fit. Алгоритм действий крайне простой:

Как вы поняли, поставить новый циферблат на Mi Band 5 – дело нескольких минут. Эта функция на всех браслетах Сяоми полностью бесплатная, поэтому надоевшие заставки можно менять буквально каждый день.

Подписывайтесь на наш Яндекс.Дзен, чтобы не пропустить крутые статьи

Telegram-канал с лучшими скидками и оперативным обновлением новостей

Большой выпуск [ПО СТУДИЯМ] с рэпером Ромой Жиганом. Роме не только удалось фитануть со Снуп Догом, но еще и снять фильм BEEF.

В интервью Жиган рассказал про свое отношение к Замаю, Гуфу и Славе КПСС. Показал свой новый трек со Снуп Догом, пластинку Оксимирона, а так же провел экскурсию по студии Октава.

Мы поговорили и о самом фильме BEEF, в частности о сжигании маски Паши Техника, съемках Децла и отношении Шефа (ШеFF) к Бифу. Обсудили бит CVPELLV и давний конфликт с Шоком (Shokk).

Минус за пиар этого АУЕшника.

Эффективный способ открытия консервы


Про аккуратное мытьё вульвы

Про аккуратное мытьё вульвы Комментарии, Комментарии на Пикабу, Мат, Скриншот, Юмор


Логично

Логично


За чей счёт банкет?)

За чей счёт банкет?) Скриншот, Вино, Рафаэлло, Идеальный мужчина, Мужчины и женщины

Многие не видели этого видео просто потому, что тогда ещё не родились.

В Самаре дети мигрантов толпой избили второклассницу

Сообщается, что девочку затолкали в сугроб и отпинали ногами — у ребенка позже диагностировали синяки по всему телу, ушибы мягких тканей груди, живота и бедер (притом, что на школьнице был толстый слой верхней одежды). В учебном заведении подтвердили факт избиения и пообещали провести проверку.

Победа

Сидим вчера с женой на кухне, чаи гоняем.

Жена: У нас же скоро годовщина. Как отметим?
Я: Подожди, мы же отмечали уже в октябре.
Жена: Так мы отмечали годовщину наших отношений. А это годовщина нашей росписи в ЗАГСе
Я: А разница-то какая? Зачем два раза в год в принципе одно и тоже отмечать?
Жена: Ну в октябре это твоя ПОБЕДА, а в январе моя.

Ну в принципе логично :)

П.С. Жену люблю, вместе 13 лет, женаты 4 года :)


Традиция

Традиция

Не пойму, в каком месте меня обманули?

Шевелить плотву

Шевелить плотву Комментарии, Юмор, Порноактеры и порноактрисы, Косплей, Purple bitch

Ставки сделаны господа, ставок больше нет

Ставки сделаны господа, ставок больше нет Политика, Скриншот, Украина, Посольство


Не мамонты

Не мамонты


Когда сделал правильный выбор:-))

Когда сделал правильный выбор:-)) Авто, Квартира, Цены, Скриншот, Комментарии, Комментарии на Пикабу, Недвижимость, Пикабу, Автосалон


Сила маркетинга

Сила маркетинга

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

Джерома Клапки Джерома " Трое в лодке не считая собаки" 1889 год.


Сон

Всегда важно оставаться человеком

Всегда важно оставаться человеком Картинка с текстом, Скриншот, Переписка, Перепутали, СМС, Мошенничество

Топлес

Это я сейчас знаю, что такое топлес. А тогда. 1994 год, мне16 лет
Июль, жара, иду вдоль Оби. Веду Монголку, лошадь деда (работал конюхом). Рано для лета, 11 часов, вся молодежь спит (после ночной дискотеки).
Вдруг вижу, девушка на песке, загорает. Топлес. Для 1994 года это просто агонь. Меня увидела, повернулась и с улыбкой говорит:

- Привет, тебя как зовут?)
- Sibirskix
- Твоя лошадка?
- Моя
- Прокатишь?)

Познакомились. Из Москвы, приехала к бабушке ( Сартыкова бабка, вредная и злобная старуха по кличке " Салтычиха")
Это было мое лучшее лето. Гуляли, ходили на танцы, она мне читала свои стихи ( плохие, но с выражением), целовались ( без продолжения).
Пропала как и появилась, неожиданно. Пришел, а её нет. Бабка Салтычиха вышла:
- Домой она уехала, просила тебе не говорить, пока в самолет не сядет.

Вот такая первая любовь. из детства
Ехал на мотоцикле ( юпитер-5), потом сидел на берегу Оби, жег костер, плакал. Никто же не увидит, можно.

Читайте также: