Синус - функция периодическая, а у вас ни одна функция активации в периоды не умеет.
В матане была кажется теорема о том, что тригонометрические функции нельзя разложить по набору полиномов. Так и здесь, сколько бы нейронов не добавляли, ошибка аппроксимации будет увеличиваться с удалением от нуля.
PS это всё на уровне интуиции, может она и ошибается.
from pyowm.owm import OWM
owm = OWM('your-api-key')
mgr = owm.weather_manager()
observation = mgr.weather_at_place('London,GB') # the observation object is a box
listen_in_background отдельный фоновый поток запускает, а надо слушать в основном потоке. Тогда удастся дождаться завершения одного цикла работы алгоритма и через while True запустить его еще раз. Только надо отделить повторяемую логику от однократной инициализации.
Вы все варианты сообщений приводите к нижнему регистру, после чего сравниваете полученное значение, содержащее только маленькие буквы, с текстом, в котором есть заглавные. Перепишите константы в lowercase и всё заработает.
Скорее всего какие-то из вызовов внутри outgoing() создают новые потоки, соответственно, пока они не завершатся, интерпретатор питона не останавливается, несмотря на то, что основной поток закончил свою работу.
Как именно это интерферирует с multiprocessing - это вопрос глубокой отладки, но я бы сначала попробовал сделать так, чтобы выход из outgoing() завершал процесс питона без мультипроцессинга.
В MySQL есть команда LOAD DATA FROM LOCAL INFILE, в постгресе - похожая. Если там корректный формат CSV, то возможно удастся залить достаточно эффективно. Хотя конечно логи в БД - это не айс.
С одной стороны, если Ваше приложение живет больше 5 секунд, ваши логи все-таки будут работать - можно забить.
С другой стороны, краши однозначно не попадут в логи: для того чтобы попали, необходимо дождаться обработки всех сообщений в очереди
Вы всё равно перебираете все процессы, почему бы не вывести их названия принтом? Наверняка там будет что-то похожее, но немного отличающееся от chrome.exe