Добавление связанных динамических c взвешенных соединений к разным слоям - PullRequest
0 голосов
/ 17 июня 2020

Пишу сеть со своим слоем. слой является входным слоем. Во-первых, он принимает случайный вектор натуральных чисел от 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...