Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

Скрыть консоль без использования FreeConsole()

Есть ли возможность как-то по другому скрыть консоль?


Ответ

Ну для начала вы можете и не создавать консоль используя только функцию winmain
В случае если у вас Visual Studio, в настройках линковки Project->Properties->Linker->System->Subsystem указываете подсистему Windows (/SUBSYSTEM:WINDOWS). Консоль исчезла, а нагрузка будет минимальная.

Какие могут быть пути улучшения обобщающей способности ИНС на базе Keras?

Несколько дней назад я создавал тему с похожим вопросом: Проблема с обучением сети в Keras: нет обобщающей способности сети, и там получил резонное замечание и совет. Решив попробовать поработать с данными, в которых информация не утрачена (нежели в прошлом топике), я собрал подобную ИНС, предварительно нормализовав данные (использование StandardScaler оказалось лучше MinMax).
Дано: База из 71 осциллограммы с 3002 отсчетами. Диапазон данных: от 0 до 10Е6. Данные векторы разбиты на обучающую выборку и тестовую (36 и 35).
Задача: входным векторам присваивать значения на выходе в виде определенного числа (от 30 до 100).
Ограничения: нет возможности получить огромный датасет (из тысяч векторов) и возможный максимум - сотня-полторы векторов.
Текущая конфигурация сети довольно неплохо обучается (в сравнении с предыдущей), однако проблема с обобщением результатов все также существует. Хоть результат и лучше он все еще не устраивает меня. Меняя конфигурации многослойного персептрона (число нейронов в слое, число слоев) мне не удавалось сильно изменять выходной результат (разве что, кроме времени обучения, что логично). Возможно я не подобрался к самой оптимальной структуре ИНС, но пока есть только это. Кстати да, функцию обучения выбирал методом научного тыка. Перепробовал разные методы и данный показал себя лучше всего.
Итак, отсюда у меня вопросы: Какие возможные пути изменения ИНС для улучшения результата? К сожалению я все еще новичок в этой области и знаком только с персептронами. Быть может вы сможете посоветовать какие-то другие типы сетей? Если после нормализации у меня диапазон значений вектора от -2 до 6, то как это влияет? На сколько мне известно, то на вход сети следует подавать данные в диапазоне [0 1] или [-1 1].
Код сети:
#загружаем файл с образами TRAIN_FILE="TRAIN30_100km.csv" TEST_FILE="TEST30_100km.csv"
# размер вектора img_rows, img_cols = 1, 3002
# Загружаем данные для обучения train_dataset = np.loadtxt(TRAIN_FILE, skiprows=0, dtype='int', delimiter=",") test_dataset = np.loadtxt(TEST_FILE, skiprows=0, dtype='int', delimiter=",")
# Выделяем данные для обучения X_train = train_dataset[:, 1:] X_test = test_dataset[:, 1:]
# нормализуем данные scaler = StandardScaler() x_train=scaler.fit_transform(X_train) x_test=scaler.fit_transform(X_test)
# Выделяем правильные ответы y_train = train_dataset[:,0] y_test = test_dataset[:,0]
# рисуем график нормализованного вектора и оригинального y10 = x_train[6, :] y11=X_train[6, :] plt.figure(figsize=(8, 8)) plt.plot(y10) plt.show() plt.figure(figsize=(8, 8)) plt.plot(y11) plt.show()
# Выделяем правильные ответы y_train = train_dataset[:,0] y_test = test_dataset[:,0]
model = Sequential()
model.add(Dense(10, input_dim=3002, activation="relu",kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(15, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(5, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(5, activation='relu')) model.add(Dense(1)) model.compile( optimizer='Adagrad', loss="mse", metrics=['mae'])
print(model.summary()) model.fit(x_train, y_train, epochs=30, batch_size=1, verbose=2,validation_data=(x_test, y_test))
Epoch 30/30 - 0s - loss: 0.9548 - mean_absolute_error: 0.1053 - val_loss: 102.0822 - val_mean_absolute_error: 7.7214
mse, mae = model.evaluate(x_test, y_test, verbose=0) predictions=model.predict(x_test) print(predictions) # ответы (правильные 31 33 35 37) [20.31354 ] [18.931906] [21.085878] [20.537167]
Ссылка на датасет


Ответ

Немного подумав, решил упростить НС по-максимуму и получил лучшие показатели.
Архитектура:
model = Sequential() model.add(Dense(128, input_dim=3002, activation="relu", kernel_regularizer=l2(0.01))) model.add(BatchNormalization()) model.add(Dense(1)) model.compile( optimizer='Adagrad', loss="mse", metrics=['mae', 'mse']) hist = model.fit(x_train, y_train, epochs=300, batch_size=3, verbose=2,validation_data=(x_test, y_test), callbacks=callbacks)
вывод:
Epoch 00147: val_mean_squared_error did not improve from 13.76798 Epoch 148/300 - 0s - loss: 183.8615 - mean_absolute_error: 10.9775 - mean_squared_error: 180.3115 - val_loss: 23.7155 - val_mean_absolute_error: 3.2763 - val_mean _squared_error: 20.1659
Epoch 00148: val_mean_squared_error did not improve from 13.76798 Epoch 00148: early stopping
оценка:
In [206]: model = load_model(model_fn)
In [207]: model.evaluate(x_test, y_test, verbose=1) 18/18 [==============================] - 2s 135ms/step Out[207]: [17.30735206604004, 3.1715924739837646, 13.767986297607422]
сравнение тестового набора с предсказанными значениями:
In [208]: from sklearn.metrics import mean_absolute_error, mean_squared_error
In [209]: df = pd.DataFrame({'y_test':y_test.ravel(), 'y_pred':model.predict(x_test).ravel()})
In [210]: mean_squared_error(df['y_test'], df['y_pred']) Out[210]: 13.76798614917061
In [211]: mean_absolute_error(df['y_test'], df['y_pred']) Out[211]: 3.171592500474718
In [212]: df['abs_err'] = np.abs(df['y_test'] - df['y_pred'])
In [213]: df Out[213]: y_test y_pred abs_err 0 39.0 41.414223 2.414223 1 41.0 38.207268 2.792732 2 43.0 49.000561 6.000561 3 73.0 73.476303 0.476303 4 33.0 32.048149 0.951851 5 78.0 76.682877 1.317123 6 53.0 57.643074 4.643074 7 54.0 58.276382 4.276382 8 67.0 63.092651 3.907349 9 49.0 53.009842 4.009842 10 89.0 87.252930 1.747070 11 65.0 62.399197 2.600803 12 63.0 68.281502 5.281502 13 58.0 55.078934 2.921066 14 48.0 43.649544 4.350456 15 80.0 72.487808 7.512192 16 60.0 60.331455 0.331455 17 47.0 45.445320 1.554680
In [217]: df[['y_test','y_pred']].plot() Out[217]:

Запись данных в xml

Есть список словарей вида: [{"first_name":"Ivan", "last_name":"Ivanov", "city":"Moscow"}, {"first_name":"Sergey", "last_name":"Sidorov", "city":"Sochi"}...] Мне нужно этот список записать в xml формат вида:
Ivan Ivanov Moscow ... ...
Как это реализовать, используя стандартные библиотеки python? Вот мой код:
import xml.etree.ElementTree as ET root = ET.Element('root') person = ET.SubElement(root,'person') a=[] # тот список for key in a: ET.SubElement(person,'first_name').text = key['first_name'] ET.SubElement(person,'last_name').text = key['last_name'] ET.SubElement(person,'city').text = key['city'] tree = ET.ElementTree(root) tree.write('xmlf.xml')
Но этот цикл неправильный, выход такой:
Ivan Ivanov Moscow Sergey Sidorov Sochi ...
Как его исправить?


Ответ

Исправил код в вопросе:
items = [ {"first_name": "Ivan", "last_name": "Ivanov", "city": "Moscow"}, {"first_name": "Sergey", "last_name": "Sidorov", "city": "Sochi"}, ]
import xml.etree.ElementTree as ET root = ET.Element('root')
for i, item in enumerate(items, 1): person = ET.SubElement(root, 'person' + str(i)) ET.SubElement(person, 'first_name').text = item['first_name'] ET.SubElement(person, 'last_name').text = item['last_name'] ET.SubElement(person, 'city').text = item['city']
tree = ET.ElementTree(root) tree.write('xmlf.xml')
Результат (с добавлением отступов):
Ivan Ivanov Moscow Sergey Sidorov Sochi

регулярка 0-9 и один +

Каким образом указать, что знак + может быть только один и только в начале строки?
preg_match('#^([+{1}0-9]*)$#ui', $_POST['tel'])


Ответ

Внутри символьного класса большинство символов не являются специальными символами. Это касается и квантификаторов. [+{1}] находит +, {, 1 или }
Чтобы шаблон ^([+{1}0-9]*)$ находил + только в начале строки, его необходимо вынести за скобки, удалить квантификатор {1} (это поведение по умолчанию) и экранировать его. Модификаторы ui тут не нужны, так как в шаблоне нет букв.
preg_match('#^(\+[0-9]*)?$#', $_POST['tel'])
См. демо регулярного выражения
Необязательная захватываемая группа (...)? добавлена для того, чтобы находилась также пустая строка (как в оригинальном случае).
Если знак + необязателен, добавьте квантификатор ?
preg_match('#^\+?[0-9]*$#', $_POST['tel']) ^
См. демо регулярного выражения

Почему значение undefined?

После всех элементов в html файле располагаю скрипт. В объекте page есть объект obj со значением $(".container_main"). В следующем объекте обращаюсь к obj, но браузер выдаёт ошибку.
Пример кода:

Если не использовать объект obj, а напрямую обращаться к $(".container_main"), всё в порядке.
Пример кода, который работает:

В чем проблема?


Ответ

var page = { obj: $(".container_main"), height: this.obj.height(), // this в этом месте это глобальный объект window, а не объект, который Вы создаете, - его еще нет width: this.height * 9/16 }
Сделайте так:
var page = { obj: $(".container_main"), height: function() { return this.obj.height(); }, width: function() { return this.height() * 9/16; } } console.log(page.height(), page.width());

Почему java воспринмает интерфейс comparator как функциональный

Недавно ознакомился с лямбда-выражениями и узнал, что с их помощью можно реализовать Comparator. Но мне не даёт покоя то, что в этом интерфейсе объявлено два не статических и не реализованных по умолчанию метода: compare() и equals(). И несмотря на это, интерфейс считается функциональным, и метод compare() может быть реализован с помощью лябда-выражений.
Как так? Почему метод equals() не воспринимается?


Ответ

Интерфейс Comparator функциональный, потому что equals() - относится к public-методу класcа Object.
Интерфейсы объявляют абстрактные методы относящиеся к public методам Object, но обычно делают это неявным образом и эти методы не учитываются.

SVG Замена стилей для клонов объекта находящегося в symbol?

Есть такая задача => Дана некая svg картинка, предположим кот, которая прорисована в разных цветовых оттенках (имеет разные размеры масштабирования, положения на холсте и т.д..) Возможно ли как-то через css переназначить цвет для других частей повторяющегося элемента? Приведу пример
body { margin: 0; padding: 0; background-color: #000; } #preloader_cats { position: absolute; top: 50%; left: 50%; width: 60vh; height: 60vh; transform: translate(-50%, -50%) rotate(0deg); transform-origin: 50% 50%; border: 1px solid #f00; } .cat_body { fill: #ea8023 } .cat_body:nth-of-type(2) { fill: #ff0 }
Можно ли как-то переназначить "цвет тела" второму, третьему и тд коту, а так же цвет глаз если помещать это всё в ОДИН тег символ (ну или другой элемент)? Вопрос больше про минимизацию кода, поскольку я понимаю что можно каждую часть повторяемых элементов завернуть в символы и уже их менять


Ответ

При использовании команды элемент svg попадает в "теневой дом". Поэтому обычные приемы стилизации не работают. Так как при каждом вызове иконки это одна и та же копия одного элемента и свойства fill не наследуется.
Решением данной проблемы является использование переменных CSS
Мы будем использовать атрибут fill для каждой части в определении нашей SVG-иконки кота и зададим им разные CSS-переменные. Затем мы назначим им разные цвета.
.cat-colors { --color-0: #ea8023; --color-1: black; --color-2: green; --color-3: yellowgreen; --color-4: dodgerblue; }
Для второй копии кота назначаем второй цветовой набор частей тела:
.cat-colors2 { --color-0: #4D4B4B; --color-1: dodgerblue; --color-2: gold; --color-3: #ea8023; --color-4: greenyellow; }
При таком использовании css переменных, допускается сколько угодно цветовых схем клонов кота. Масштабирование, перемещение не будет влиять на окраску, так как она применяется после вызова клона и всех трансформаций.
Ниже, немного измененный код автора вопроса с добавлением CSS переменных.
body { margin: 0; padding: 0; background-color: black; } #preloader_cats { position: absolute; top: 50%; left: 50%; width: 60vh; height: 60vh; transform: translate(-50%, -50%) rotate(0deg); transform-origin: 50% 50%; border: 1px solid #f00; } .cat-colors { --color-0: #ea8023; --color-1: black; --color-2: green; --color-3: yellowgreen; --color-4: dodgerblue; } .cat-colors2 { --color-0: #4D4B4B; --color-1: dodgerblue; --color-2: gold; --color-3: #ea8023; --color-4: greenyellow; }