Я пытаюсь создать нейронную сеть с не полностью связанными слоями. Я использовал функциональный API, но производительность ужасна даже при таких простых проблемах, как MNIST. У меня вопрос эффективности: я что-то делаю плохо, мой подход неправильный (возможно, функциональный API - не самый лучший способ), я что-то упустил?
В своем текущем коде я создаю входной слой.
from tensorflow.keras.layers import Input, Lambda, Dense, concatenate
nInp=784 #sets the input size for MNIST 784
inp=Input(shape=(nInp,))
Затем я создал список для хранения своих нейронов скрытого слоя и список, для которого нейроны будут соединяться со входом с нейроном в скрытом слое.
n1=64 #sets the number of neurons in the hidden layer
h=[None for i in range(n1)] #initialize hidden layer storage
inpList=tf.constant([[0],[0]])
Теперь мы нажмите на часть, где происходит БОЛЬШАЯ ЗАДЕРЖКА . В этом для l oop я чередую каждый нейрон скрытого слоя и случайным образом назначаю соединения от входного слоя к скрытому нейрону.
for j in range(n1):
flag=0
for i in range(nInp):
rand=random.randint(0,1)
if rand == 1:
if flag==0:
flag =1
inpList=Lambda(lambda x:x[:,i:i+1])(inp)
else:
inpList=tf.concat([inpList,Lambda(lambda x:x[:,i:i+1])(inp)],1)
h[j]=Dense(1, activation='relu')(inpList)
Затем я объединяю свои нейроны скрытого слоя в один слой и связываю это к выходному слою.
h_layer=concatenate(h)
out=Dense(10, activation='softmax')(h_layer)
model=Model(inp,out)
Обучение на этой модели ПРЕКРАСНО медленное. Для обучения сети 784 -> 64 -> 10 данные MNIST занимают более получаса за эпоху. Должен быть лучший способ, потому что встроенный слой Dropout должен выполнять аналогичную операцию (но произвольно устанавливать соединения при каждом цикле обучения), но она выполняется без заметного временного штрафа.
Спасибо