Пишу сеть со своим слоем. слой является входным слоем. Во-первых, он принимает случайный вектор натуральных чисел от 0 до 10 размерностью 400. Затем каждое целое число имеет список взвешенных соединений. Итак, 3 будет иметь 400 взвешенных соединений, поскольку следующий слой имеет 400 нейронов, и 7 будет иметь свои собственные 400 взвешенных соединений и так далее. Когда в векторе присутствует целое число, загружаются его собственные взвешенные соединения. Есть еще кое-что, но это то, что сейчас важно. Я хотел бы сопоставить взвешенные связи между слоями. Обратите внимание, НЕ t ie их и не дублируйте их ... но когда есть 3 в первом нейроне входного слоя, который идет с его соединениями для этого слоя, должен быть список "3" соединений, которые загружаются в второй слой в первом нейроне со своими собственными связями, указывающими c на этом слое. Почему я поместил 3 в "", потому что он предназначен только для представления того факта, что эти соединения помещаются там всякий раз, когда есть 3 во входном векторе в первом слоте. Обычно значение, выводимое этим нейроном, скорее всего, не будет 3. Я использовал tf_gather для создания матрицы весов для каждого ввода в самом первом слое, но как мне заставить другие слои унаследовать индексирование, которое я использовал с их шаблоном матрица веса. Я думал, если бы был способ передать входной вектор всем последовательным слоям, это было бы здорово. Также действительно сложной частью было бы адаптировать это для работы со сверточными слоями, я полагаю, мне понадобится 400 фильтров PR-слоя.
Вот мой метод вызова в моем настраиваемом слое:
def call(self, y):
y=y
a=tf.identity(y)
for i in range(399):
y= tf.cast(y, tf.int32)
s=tf.constant([10*(i+1)])
z=tf.identity(tf.math.add(y,s))
indices=np.zeros(i+2)
indices[i+1:i+2]=1
indicesa=np.tile(indices,400)
indices = tf.cast(tf.where(tf.equal(indicesa, 1)), tf.bool)
indices2 = tf.cast(tf.where(tf.equal(indicesa, 1)), tf.int32)
indicesa=tf.reshape(indicesa,[400+400*(i+1),1])
z=tf.reshape(z, [400,1])
a=tf.reshape(a, [400+400*(i)])
a=tf.cast(a,tf.int32)
indicesa=tf.cast(indicesa, tf.bool)
scatter =tf.identity(tf.scatter_nd(indices2,z, shape=tf.shape(indicesa)))
inverse_mask = tf.identity(tf.cast(tf.math.logical_not(indicesa), tf.int32))
indices3 = tf.cast(tf.where(tf.equal(inverse_mask, 1)), tf.int32)
scatter2 =tf.identity(tf.scatter_nd(indices3,a, shape=tf.shape(inverse_mask)))
a = tf.identity(tf.add(scatter2, tf.cast(scatter, tf.int32)))
li3=[]
lop=[]
li3=[tf.split(a,400)]
c=0
for j in li3:
c+=1
li4=tf.roll(j,c,axis=0)
lop.append(li4)
a=tf.stack(lop)
S = tf.reshape((tf.gather((tf.reshape(self.kernels, [-1])),(a))), (400, 400))
_trainable_weights = [S]
y= tf.cast(y, tf.float64)
y=tf.reshape(y,[1,400])
S= tf.cast(S, tf.float64)
return K.dot(y,S)