Estuve pensando en cómo hacer que durante el entrenamiento nacieran nuevas neuronas en los lugares adecuados, pero tras estudiar los algoritmos llegué a la conclusión de que no tendrían una formalización común, prácticamente no hay puntos de intersección. Por eso me negué y me concentré en construir una red vertical. Tipo:
Datos --> neurona --> red neuronal encapsulada --> red neuronal contenedora
Es posible hacer que los AG sean amorfos. El genoma humano no siempre ha estado formado por 28.000 genes.
class IEvolvable // интерфейс для подключения эволюционных алгоритмов
{
public:
virtualvoid GetWeightsAsVector(double& weights[]) const; // получаем все изменяемые веса собранные в одном векторе для генетикиvirtualvoid ApplyWeightsVector(double weights[]); // применяем подобранные генетикой веса к сетиvirtualvoid FeedInput(double inData[]); // подаем входvirtualvoid PropagateSignal(); // прогоняем входной сигналvirtualvoid GetOutput(double& outData[]) const; // берем выход
};
class ISerializable // сохранение
{
public:
virtualbool LoadFromFile(string filePath);
virtualbool SaveToFile(string filePath) const;
};
class IBasicNet
: public IEvolvable
, public ISerializable
{
public:
virtualvoid FeedInput(double inData[]); // вход можно брать из коллекции или отдельно. Подразумевается, что коллекция включает в себя обработку входов, поэтому отдельные входы надо преобразовывать коллекциейvirtualvoid FeedInput(int index);
virtualvoid PropagateSignal();
virtualvoid GetOutput(double& outData[]) const;
virtualvoid Init(); // инициализация. Инициализатор можно подавать в конструкторе, можно в функцию, посмотрим как будет удобно
}
class ISupervised // сеть с учителем
: public IBasicNet
{
public:
virtualvoid SetPatternCollection(PatternCollection* collection); // у сетей с учителем обязательно каждому входному образу соответствует выходной поэтому лучше их сразу организовывать по парам
virtualvoid CountError(); // подсчет ошибки. сюда например будет входить ОРО для MLPvirtualvoid Learn(); // изменение весов. никаких итераций внутри, чтобы можно было на каждом шаге просмотреть состояние
};
class IUnsupervised // сеть без учителя
: public IBasicNet
{
public:
virtualvoid SetInputCollection(InputCollection* collection); // у сетей без учителя только входыvirtualvoid Learn();
};
class IInitializer // инициализатор
{
public:
virtualvoid Init(double& value);
virtualvoid Init(double& value[]);
virtualvoid Init(Matrix& value);
};
TheXpert: Oh, estás en línea. Respuesta sobre la topología.
Para mí, la gestión de la topología puede y debe considerarse como una programación genética. Aquí no soy muy fuerte - es una vasta área de conocimiento aparte. Pero, si es necesario, retomaré esta cuestión de cerca. Es un AG en el que la longitud del cromosoma puede cambiar dinámicamente. En mi AG, la longitud del cromosoma es fija. Aunque es posible sortear esto introduciendo banderas adicionales para congelar genes individuales y tomar la longitud del cromosoma con una reserva.
Urain: Este es el siguiente paso y no está directamente relacionado con el motor, su implementación es a través de un GA externo que crea diferentes topologías, esas inicializan objetos de diferentes motores.
Y sí, probablemente deberías usar más de un AG. Uno para la topología y otro para ajustar todos los pesos de todas las redes. Entonces el segundo AG sólo congelaría algunos de los genes dependiendo de la topología actual.
Propongo que el primero implemente el eco o el SOM a lo largo del camino y las interfaces pueden ser finalizadas.
Vamos, ¿qué está más cerca de ti?
La más sencilla sería MLP.
Vamos, ¿qué está más cerca de ti?
Eco más cercano, SOM más ligero. Probablemente sea mejor que SOM, porque se puede hacer con o sin profesor.
SOM es así.
1. inicialización de la malla
2. carrera de trabajo de la malla
3. malla didáctica
¿Quién hace qué?
¿O tal vez deberíamos ajustar primero la jerarquía de clases?
Estuve pensando en cómo hacer que durante el entrenamiento nacieran nuevas neuronas en los lugares adecuados, pero tras estudiar los algoritmos llegué a la conclusión de que no tendrían una formalización común, prácticamente no hay puntos de intersección. Por eso me negué y me concentré en construir una red vertical. Tipo:
Datos --> neurona --> red neuronal encapsulada --> red neuronal contenedora
Es posible hacer que los AG sean amorfos. El genoma humano no siempre ha estado formado por 28.000 genes.
Ouch...
Primeras estimaciones
Oh, estás en línea. Respuesta sobre la topología.
Primeras estimaciones
Ese es el "oops" que es.
Este es el siguiente paso y no está directamente relacionado con el motor, su implementación es a través de un GA externo que crea diferentes topologías, esas inicializan objetos de diferentes motores.
Y sí, probablemente deberías usar más de un AG. Uno para la topología y otro para ajustar todos los pesos de todas las redes. Entonces el segundo AG sólo congelaría algunos de los genes dependiendo de la topología actual.