Django. Увеличения значения поля в модели
Застрял вроде на таком простом моменте, но тем не менее. В гугле ничего не нашел. Ситуация такая, нужно чтобы пользователь вводил некое число и это значение, что он ввел прибавлялось к уже имеющему значению некоторому полю в модели.
Из кода, что приведен ниже необходимо, что когда пользователь вводит в поля development и testing цифры, эти цифры не обновлялись, а прибавлялись к уже имеющим значениям в базе, которые были до них.
Пример: в базе в полях development и testing хранятся значения 10 и 15, пользователь вводит в одно поля 5, в другое 3, и тогда в базе обновляются значения до 15 и 18 соответственно.
Скажем, так, вот модель:

Class Project(models.Model):

    company = models.ForeignKey('projects.Company', on_delete=models.PROTECT, related_name='projects')

    title = models.CharField('Project title', max_length=128)

    development = models.DecimalField('development hours', default=0, decimal_places=2, max_digits=6)

    testing = models.DecimalField('testing hours', default=0, decimal_places=2, max_digits=6)

Вот форма:

class ProjectForm(ModelForm):

    class Meta:
        model = Project
        fields = ['development', 'testing']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'UPDATE'))

View:

class ProjectUpdateView(LoginRequiredMixin, UpdateView):
    model = Project
    form_class = ProjectForm
    success_url = reverse_lazy('home')

html

<div class="row justify-content-center">
    <div class="col-md-8">
        <div class="card bg-light">
            <div class="card-body">
                {% crispy form %}
            </div>
        </div>
    </div>

Спасибо.

Вам нужно переопределить один из методов в
UpdateView. Наверное это должен быть
form_valid(). То есть на этапе, когда форма валидная, мы берем существующие данные из объекта и добавляем их в соответствующие поля экземпляра формы.
Я не проверял работает код или нет, но вы хотя бы будете знать в каком направлении двигаться.

class ProjectUpdateView(LoginRequiredMixin, UpdateView):
    model = Project
    form_class = ProjectForm
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        form.instance.development += self.object.development
        form.instance.testing += self.object.testing

        return super().form_valid(form)


Как максимально улучшить архитектуру нейронной сети?
Архитектура сети

max_features = len(lexicon)
num_classes = len(labels_lexicon)

    early_stop = EarlyStopping(monitor='val_acc', min_delta=0.001,
                               patience=3, verbose=1, mode='auto')
    chkpt = ModelCheckpoint('architecture.hdf5',
                            monitor='val_loss',
                            verbose=1,
                            save_best_only=True,
                            mode='auto')
    callbacks = [early_stop, chkpt]

    model = Sequential()
    model.add(Embedding(max_features, 32))
    model.add(SpatialDropout1D(0.2))
    model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
    model.add(Dense(num_classes, activation="softmax"))
    model.compile(loss='categorical_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])
    model.fit(x_train, y_train, batch_size=128, epochs=50,
              validation_data=(x_test, y_test), verbose=1, callbacks=callbacks)
    scores = model.evaluate(x_test, y_test, batch_size=128)

Данные по текущей архитектуре сети
val_acc - 86%
val_loss - 0.3
acc - 89%
кол-во эпох обучения: 10 (после 10ой эпохи начинается переобучение)
Подключение модулей и создание словоря категорий

import sklearn
import numpy as np
from collections import Counter
from sklearn.model_selection import train_test_split as tts
from keras.preprocessing import sequence
from keras import utils  as ku
from nltk.stem.snowball import SnowballStemmer
from keras.models import Sequential
from keras.layers import Dense, Activation, Embedding
from keras.layers import LSTM, SpatialDropout1D
import re
from nltk.stem.snowball import SnowballStemmer
from keras.models import load_model
from keras.callbacks import EarlyStopping, ModelCheckpoint

np.random.seed(42)

labels_lexicon =  []
for i in range(0, 33):
  labels_lexicon.append("_label_"+str(i))

Загрузка данных из файла

def get_data_from_the_file():
  labels, descriptions, lexicon, lexicon_base = [], [], [], []

  for i,  line in enumerate(open('testtext.txt', 'r', encoding='utf8', errors='ignore')):
    content = line.split()
    labels.append(content[0].replace(u'\ufeff', ''))
    descriptions.append(content[1:])
    lexicon_base += content[1:]

  count_lexicon = Counter(lexicon_base).most_common()
  for count_item in count_lexicon:
    if count_item[1] >= 10:
      lexicon.append(count_item[0])

  return labels, descriptions, lexicon

labels, descriptions, lexicon = get_data_from_the_file()

Токенизация обучающих текстов(функция)

def get_descriptions_to_index(lexicon): #функция для преоброзования слов в индесы(для описаний)
    cache = {}
    word2index = {}
    for i,word in enumerate(lexicon):
        if cache.get(word) == None:
            cache[word] = i
            word2index[word] = i
    return word2index
word2index = get_descriptions_to_index(lexicon)

Токенизация label(функция)

def get_labels_to_index(labels_lexicon):
    cache = {}
    labels2index = {}
    for i,word in enumerate(labels_lexicon):
        if cache.get(word) == None:
            cache[word] = i
            labels2index[word] = i
    return labels2index
labels2index = get_labels_to_index(labels_lexicon)

Токенизация обучающих текстов и label к ним

list_of_tokenize_descriptions = []
list_of_tokenize_labels = []

for description_item in descriptions: # преоброзование описаний тендеров из текста в индексы
    prepare_list_of_tokenize_descriptions = []
    for descriptions_piece in description_item:
        if word2index.get(descriptions_piece) != None:
            prepare_list_of_tokenize_descriptions.append(word2index[descriptions_piece])
    list_of_tokenize_descriptions.append(prepare_list_of_tokenize_descriptions)

for label in labels: # преоброзование категорий тендеров из текста в индексы
    if labels2index.get(label) != None:
        list_of_tokenize_labels.append(labels2index[label])

Разделение на тестовую и обучающую части

x_train, x_test, y_train, y_test = tts(list_of_tokenize_descriptions, list_of_tokenize_labels,  test_size=0.1, random_state=42) # разделения на тренироввые и тренировачны части

Привидение label к категориальному виду:

y_test = ku.to_categorical(y_test, num_classes=len(labels_lexicon))
y_train = ku.to_categorical(y_train, num_classes=len(labels_lexicon))

Привидение всех описаний к одной длине

MaxDescriptionLen = 0
for count_description_item in descriptions:
  if len(count_description_item) > MaxDescriptionLen:
    MaxDescriptionLen = len(count_description_item)

#преведение всех  описаний к одинаковой длине
x_train = sequence.pad_sequences(x_train, maxlen=MaxDescriptionLen)
x_test = sequence.pad_sequences(x_test, maxlen=MaxDescriptionLen)

Ссылки: dataset, полный код
Задача
Максимально улучшить архитектуру данной сети.


Составил код, но не могу вывести числа. Числа в обратном порядке
Мой код разбивает число. Например введём число 450, он должен вывести 4 5 0, но выводит 0 5 4. Код считает всё верно, но выводит цифры не в правильном порядке. Что нужно записать в Print???
<code>
a=input()
b=len(a)
a=int(a)
c=a
d=a
for i in range(b):
    c=d%10
    print(c, end=' ')
    d=d//10
</code>

Сохраняйте цифры в массив и возвращайте массив в реверсивном виде (задом наперёд)
Пример:
<code>
def digitalize(num):
    num = abs(num)
    res = []
    while num > 0:
        res.append(num % 10)
        num = num // 10
    return list(reversed(res))

In [4]: digitalize(12345)
Out[4]: [1, 2, 3, 4, 5]

In [5]: digitalize(450)
Out[5]: [4, 5, 0]
</code>


Преобразование данных ImageDataGenerator
Имеется код:
<code>
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense
datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = datagen.flow_from_directory(
    'train',
    target_size=(32, 32),
    batch_size=32,
    class_mode='categorical')
val_generator = datagen.flow_from_directory(
    'val',
    target_size=(32, 32),
    batch_size=32,
    class_mode='categorical')

model = Sequential()
model.add(Conv2D(64, (3, 3), input_shape=(32, 32, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.3))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(7))
model.add(Activation('sigmoid'))

model.compile(loss='categorical_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])
model.fit_generator(
     train_generator,
     steps_per_epoch=3000// 32,
     epochs=3,
     validation_data=val_generator,
     validation_steps=1500// 32)
</code>
И он хорошо работает, но для моей задачи требуется изначально плоская нейронная сеть(Все нейроны сети должны быть типа Dense), подскажите как это реализовать. Прошу не кидать камнями с нейронными сетями я на вы)

В указанной в вопросе архитектуре несовместимые параметры:

model.add(Dense(7))
model.add(Activation('sigmoid'))   #  <---- здесь бы подошла функция 'softmax'
model.compile(loss='categorical_crossentropy', ...)

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

model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', ...)

Если же у вас мультиклассовая задача, т.е. присутствует более двух классов классификации, то в качестве функции активации используют
softmax, а в качестве функции потери используют
categorical_crossentropy:

model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', ...)


Правильная подборка количества слоев в сверточной нейросети
Всех приветствую.
Такой вопрос:
К примеру, есть нейронка с 2 слоями свертки:
<code>
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
             activation='relu',
             input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
</code>
Но также я встречал нейронки и по 7 сверточных слоев.
Отсюда вопрос:
На что влияет количество слоев?
Как я понимаю, влияет именно на точность или же качество распознавания чего либо.
Но тогда почему бы не сделать, к примеру, 50 слоев сразу?
Как вообще подбирается количество слоев и количество нейронов в них?

Вы угадали - одна из очень популярных CNN архитектур - ResNet50 состоит из 50 скрытых слоев.
Также существуют другие популярные сверточные сети с гораздо большим числом слоев, например
DenseNet-250 с 250-ю слоями.
Количество слоев влияет на сложность (абстрактность) образов рассматриваемых НС. На начальных слоях распознаются простые примитивы, например прямые под различными углами, дальше могут идти дуги, сектора и т.д. Чем глубже слой тем более сложные / абстрактные примитивы он рассматривает - например глаз или клюв, или если копнуть еще глубже - человек, птица или машина. Дальше можно, например, различать чем занят человек на картинке - сидит, лежит, едет на велосипеде, на скейте и т.д.

Как вообще подбирается количество слоев и количество нейронов в них?

Это целое искусство - подобрать удачную архитектуру, которая будет:

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

На практике люди изучают последние теоретические и практические наработки и очень много эксперементируют


Распаковка списков и словарей в строку
есть такой простой пример

def test(x, y, z):
    print(x, y, z)

l = [1, 2, 3]
d = {'x': 1, 'y': 2, 'z': 3}

print(*l)
print(*d)

тут все распаковывается на ура, но если попробовать получить значение из словаря

print(**d)

уже не пашет

Попробуйте распаковать
d.values()

print(*d.values())


Как посмотреть сколько ОЗУ занимает процесс?
Как с помощью Python посмотреть сколько ОЗУ занимает любой процесс (например
chrome.exe и т.п.)?

Пример:
<code>
import psutil

In [171]: [(proc.name(), proc.memory_info().rss)
           for proc in psutil.process_iter()
           if 'firefox' in proc.name().lower()]
Out[171]:
[('firefox.exe', 446230528),
 ('firefox.exe', 93122560),
 ('firefox.exe', 450588672),
 ('firefox.exe', 216768512),
 ('firefox.exe', 546209792),
 ('AppleFirefoxHost.exe', 22958080),
 ('firefox.exe', 371126272),
 ('firefox.exe', 401686528),
 ('firefox.exe', 118554624)]
</code>


django не видит шаблоны на боевом сервере
Всем очень добрый день!
Столкнулся с такой проблемой. При загрузке сайта на боевом сервере линукс джанго стал ругаться на отсутствие шаблона: TemplateDoesNotExist at /home
main/index.html.
web/site.ru/mainApp/views.py in home
    return render(request, 'main/index.html', {'form':form}, locals())
Хотя на локальном сервере все работало. Я подозреваю, что это из-за различий относительных путей на винде и линуксе (разработка проекта ведется на локальной машине под виндой)
settings.py

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join('templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},

]

TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),)

views.py

def home(request):
form = RequestForm(request.POST or None)

if request.method == 'POST' and form.is_valid():
    new_form = form.save()
    messages.success(request, 'Ваш запрос успешно отправлен')
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

return render(request, 'main/index.html', {'form':form}, locals())

Решил проблему добавлением BASE_DIR в начало settings.py и в DIRS:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

...

'DIRS': [os.path.join(BASE_DIR, 'templates')],


Как получить конкретное имя ключа в словаре Python?
Имеется программа, определяющая наименьшее отклонение среднемесячной температуры от средней годовой. Вот сама программа:

min=1000
slovar={a:[] for a in range(1,13)} ### Создаём пустой словарь, состоящий из 12-ти ключей (от 1 до 12)
for i in range(366):
  data, temp=input().split() ### Вводим dd.mm t (день.месяц температура) (например 13.09 -11)
  data=int(data[3:5]) ### Мне не нужны дни, их обрезаем
  temp=float(temp)
  slovar[data].append(temp) ### Заполняем словарь по ключу "data" значением "temp"
for i in range(1,13):
  slovar.update({i:round(sum(slovar[i])/len(slovar[i]), 1)}) ### Находим среднемесячную температуру каждого месяца, заменяем температуру дней на среднюю температуру месяца
avg_y=round(sum(slovar.values())/12, 1) ### Находим среднее за год
for i in range(1,13):
  if abs(abs(avg_y)-abs(slovar[i]))<min: min=abs(abs(avg_y)-abs(slovar[i]) ### Находим минимальное значение отклонения (ВАЖНО! Поиск минимума сделан так колхозно (не используется операция min), т.к. данная задача формата ЕГЭ (27 номер) и там не очень приветствуются min, avg и тд)
print(avg_y)
mounth=list(slovar.keys()) ### Создаётся список mounth, значения в котором - это ключи словаря slovar (номера месяцев)
for i in range(1, 13):
  if abs(abs(avg_y)-abs(slovar[i]))==min: ### Если отклонение месяца равно минимальному отклонению, то мы его выводим
    print('%02d'%mounth[i-1], '%g'%slovar.get(i), min) ### Выводим номер месяца, температуру, отклонение (Например 09, 10, 5)

Возник вопрос, как можно нормально сделать вывод ключа словаря (последние 4 строчки)? Такое ощущение, что можно сделать куда проще. Также можно ли написать
min=abs(abs(avg_y)-abs(slovar[i]) как-то "по-культурнее"? Если есть какие-либо другие советы касательно программы - прошу поделиться. Заранее - всем откликнувшимся огромное спасибо!

У словарей есть метод
items(), который возвращает последовательность, состоящую из пар ключ-значение.

slovar = {1: 3, 2: 10, 3: 4}

print(type(slovar.items()))
print(slovar.items())

#  <class 'dict_items'>
#  dict_items([(1, 3), (2, 10), (3, 4)])

Это примерно то же самое, что список из кортежей:

lst = [(1, 3), (2, 4)]

for a, b in lst:
    print('{} - {}'.format(a, b))

Можно использовать это в коде:

min_value = 10
avg_y = 20
slovar = {1: 3, 2: 10, 3: 4}

for key, value in slovar.items():
    if abs(abs(avg_y) - abs(value)) == min_value:
        print('%02d' % key, '%g' % value, min_value)

        # Результат: 02 10 10

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

>>> min(1, 2)
1
>>> min = 10
>>> min(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable


Как разделить список кортежей двух элементов на два отдельных списк? ("unzip")
Есть список вида
[(1,2), (3,4), (5,6)]. Как его изящно разделить на два вот таких списка?:

[1,3,5]
[2,4,6]

Вопрос не в том как это сделать, а есть ли готовая функция которая разделит их(что то типа "unzip")
Ну и на всяких случай код, как это делаю я:

tlist = [(1, 2), (3, 4), (5, 6)]

list1 = [a for a, _ in tlist]
list2 = [b for _, b in tlist]

print(list1, list2)

Хотелось бы вот так сделать:

list1, list2 = unzip(tlist, valuecount=2)


Реверсивный ManyToManyField
Могут ли два объекта с ManyToManyField использовать одну промежуточную таблицу?
<code>
class ObjectOne(models.Model):
    bars = ManyToManyField('ObjectTwo', db_table=object_one_to_object_two)

class ObjectTwo(models.Model):
    bars = ManyToManyField(ObjectOne , db_table=object_one_to_object_two)
</code>
При создании файла миграции выходит примерно такая ошибка.
(fields.E340) The field's intermediary table 'objects_one' clashes with the table name of 'object_two'.

Что бы использовать промежуточную таблицу для двух моделей, вам необходима создать для этой таблицы модель, а потом передать ее в параметре through у ManyToManyField
Пример из документации django

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

Если же в промежуточной модели нет дополнительных полей то вам достаточно будет такого варианта:

class ObjectOne(models.Model):
    bars = ManyToManyField('ObjectTwo')

class ObjectTwo(models.Model):
    ....

Django автоматически создаст таблицу которая свяжет две эти модели


PyQt5 и способ получения в переменную пути к файлу
Хочу просто и легко запускать в
PyQt5 диалоговое окно выбора файла типа такого (старый метод работает идеально кстати):

from tkinter import filedialog
wb_patch = filedialog.askopenfilename()

А вот такой код PyQt5:

from PyQt5 import QtCore, QtWidgets
wb_patch = QtWidgets.QFileDialog.getOpenFileName()

падает с 3 неизвестными ошибками в консоль.
Он вообще должен работать?

А так?
<code>
from PyQt5 import QtCore, QtWidgets

app = QtWidgets.QApplication([])

wb_patch = QtWidgets.QFileDialog.getOpenFileName()[0]
print(wb_patch)

# Не обязательно нужен чтобы только путь получить,
# но при создании виджетов станет обязательным
# app.exec()
</code>


Подсчет количества гласных в предложении
Моя программа должна рассчитать кол-во гласных букв в предложении. Подсчета количества повторов букв смог добиться через ассоциативный массив. Дальше мои знания упираются в тупик..
<code>
from collections import Counter

a = input()
s = a
bukvi = []
i = []
glasnie = [ 'а' , 'у' , 'о' , 'ы' , 'и' , 'э' , 'я' , 'ю' ,
            'ё' , 'е' ,  ]
lst = s.split()
for item in lst:
    R = item
    bukvi += R
print(bukvi)
Q = list(set(bukvi) & set(glasnie))
print(Q)
D = [ x for x in bukvi if bukvi.count(x) > 1 ]
print(D)
t = 0

array = D
c = Counter(array)
print(c)
</code>

Решение в функциональном стиле:

count = sum(map(lambda c: c in 'ауоыиэяюёе', input().lower()))
print(count)

Вариант без лямбды используя
count:

count = sum(map('ауоыиэяюёе'.count, input().lower()))
print(count)

Вариант без лямбды используя магический метод оператора
in (не нужно так делать):

count = sum(map('ауоыиэяюёе'.__contains__, input().lower()))
print(count)


Как пересечь элементы списков?
Допустим, есть список
a, состоящий из:

['Зелёный','грустный','Красный','Весёлый'],['Синий','Оранжевый','Белый','Чёрный','Серый']

Каким образом я могу сделать так, чтобы получился список:

`['зелёный синий', 'зелёный оранжевый', 'зелёный белый', 'зелёный чёрный', 'зелёный серый', 'грустный синий','грустный оранжевый','грустный белый' и т.д]`

?

from itertools import product

a = ['Зелёный', 'Грустный', 'Красный', 'Весёлый']
b = ['Синий', 'Оранжевый', 'Белый', 'Чёрный', 'Серый']

c = [' '.join(i) for i in product(a, b)]

Ну или без импорта

c = ['{} {}'.format(x, y) for x in a for y in b]


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

class Simple(models.Model):
    name = models.CharField(max_length=255,unique=True)
    slug = models.SlugField(max_length=255,unique=True)

Вариант 1

def __str__(self):
    return '%s' % (self.name)

Вариант 2

def __str__(self)
    return '{}'.format(self.name)

Разницы никакой - результат будет один. Это просто разные способы форматирования строк.
format() был введен на замену
%, исправляя какие-то его недостатки.
Начиная с Python 3.6 доступен новый метод форматирования -
f-strings:

def __str__(self)
    return f'{self.name}'