Estoy tratando de crear un mosaico de múltiples imágenes , para parecerse al patrón pero ser lo más pequeño posible (en bytes totales). Pensé que sería una buena tarea para una red neuronal.
Imaginé que según las entradas (información sobre el brillo, el color promedio de la imagen y la imagen de destino), la red neuronal recorrerá todo el conjunto de imágenes (siempre 4 imágenes del mosaico que estén más cerca unas de otras) y decidirá si intercambiar algunos de ellos.
Entonces tengo un cursor que se mueve gradualmente a través de las líneas del mosaico:
12----> -12---> --12--> ... 34 |34 | 34 | | | VVV
Y en algunos casos, la red neuronal me dirá que es necesario cambiar, por ejemplo, 1 con 2 o así sucesivamente. Puedo usar esta red durante 10 escaneos de mosaico completos y luego puedo evaluar la imagen resultante (por lo que no puedo evaluar dicha red inmediatamente después del cálculo, sino solo después de varios ciclos de cálculos). El resultado son dos números: el el primero quiero maximizar (similitud) y el segundo minimizar (relación de tamaño).
Traté de crear una red neuronal que tuviera la cantidad requerida de entradas y salidas. La función que compara la imagen de origen con el mosaico se proporciona de antemano (para mí, es un cuadro negro y devuelve un valor entre 0 y 1, que es cierto grado de similitud). El tamaño de todo el mosaico se determinará al crear la imagen (guardar en .png con compresión completa) y se puede comparar con el tamaño de todas las piezas (siempre debe ser más pequeño, para que pueda convertir incluso esto en un valor entre 0-1) . Y ahora tengo un problema sobre cómo entrenar dicha red.
Yo uso tensorflow en node.js. Pseudo parte del código:
import * as tf from '@tensorflow/tfjs-node'; const m = tf.sequential(); m.add(tf.layers.dense({ inputShape: [4 * 4], units: 17, activation: 'relu', })); ... m.add(tf.layers.dense({ name: 'output', units: 6, activation: 'sigmoid', dtype: 'int32', })); ... m.compile({ optimizer: 'sgd', loss: minimizeEntropy, }); ... const md = prepareMosaicData(); ... for(move cursor in rows na columns) { const actions = m.predict(md); if (action[0] > 0.5) { switch(0, 1); } if (action[1] > 0.5) { switch(0, 2); } ... } ... savePng(); ... results = evaluatePng(); ...
No sé qué podría hacer ahora. No sé si es posible usar GAN, porque el discriminador no es una red neuronal, sino solo dos funciones y cómo podría hacerlo. Y cómo escribir una función de entrenamiento que intente maximizar y minimizar dos resultados "externos".