Всем привет, разрабатываю сейчас нейросеть, но не хватает знаний и навыков. Пишу на python c tf.keras, модель Sequential
Пытаюсь воспроизвести классическую задачу переноса стиля, с некоторыми доп. параметрами.
Конкретнее, на входе я подаю маленькие кусочки большого изображения + позиция изображения на большой картинке + миниатюра большого изображения. На выходе у меня этот же кусочек изображения. Обучаю на 30 больших изображениях.
С изображением небольшого размера (32х32) всё работает отлично, со значением inner_layers = 3 через 500 эпох я получаю более менее приемлемое изображение:
Но вот с 400х300 изображение уходит в loss = 0.009 а предсказания показывают только градиенты.
- learning rate пробовал уменьшать, без результатов.
- изменение loss function на CategoricalCrossentropy "ломает" модель, loss поднимается до 2000, а предсказания - статичная картинка
- аналогично ломается модель, если изменить функцию активации слоёв с relu на sigmoid. Хотя, если не ошибаюсь, то установка друг за другом нескольких relu слоёв одинаковой длины - должна быть бессмысленной.
код модели:inner_layers = 9
model = models.Sequential()
model.add(layers.Dense(input_size, input_dim=input_size))
for i in range(inner_layers):
model.add(layers.Dense(input_size, activation='relu'))
model.add(layers.Dense(int(output_size/8), activation='relu'))
for i in range(inner_layers):
model.add(layers.Dense(output_size, activation='relu'))
model.add(layers.Dense(output_size, activation='linear'))
model.compile(loss='MeanAbsoluteError')
Приму любые советы, как можно улучшить модель или даже какую архитектуру стоит использовать.
Пробовал так же использовать CNN, но я не знаю, как во входные данные дать ему доп. параметры, кроме самого изображения.
Использовать RNN было бы тоже логично, но не совсем понятно, как организовать использование двумерной памяти, чтобы картинка ориентировалась не только на картинку "слева", но и "сверху".
Так же, понятно, что можно использовать готовое решение а-ля это, но там используется не Keras, и к такой реализации я пока не готов. P.S. кроме этого часть входа с кусочками изображения я заменяю пустым значением, чтобы нейросеть не училась воспроизводить изображение по нему 1 к 1, а ориентировалась на миниатюру и позицию. Но здесь, кажется, тоже не все так гладко.
Отличный комментарий!