具有动态权重路由的自定义层在input_shape

时间:2020-03-09 15:22:59

标签: python tensorflow keras

我想在我的神经网络中实现一个自定义层(https://alternativeai.blogspot.com/2020/03/dynamic-weight-matrix-neural-network.html进行更深入的说明),该层将上一层的激活作为输入“调整”加权连接的路由,然后找到输入的点积与调整后的权重矩阵相加,加上偏差和激活函数,然后将结果向前发送。

将发生的事情是,加权连接不是由其连接性或ith,jth格式定义的。来自第i个神经元的加权连接将始终与第i个神经元相关联。但是j定义为第i个神经元的输入所具有的特定小数位。因此,将有一个ith / tens加权连接,​​一个ith / 100的连接和一个ith /十分之一的连接。

这将确定其路由,因为在输出层中将恰好有10个神经元。代表数字0到9。

如果第i个神经元的输入是8.27301 ...,那么ith / tens加权连接将连接到代表十进制数8的输出层中的神经元,因为那是十位的数字。 / p>

类似地,第ith /十分之一加权连接将连接到代表数字2的输出层中的神经元。

ith / hundreths => 7个神经元 ith / thousandths => 3 ....

以此类推

我在喀拉拉邦实现了一个自定义层,在其中创建了模板权重矩阵W2,我再次对其进行了重新保存以反映对路由W所做的调整。 我的输入张量是(9000,100,100,1)。我尝试使用eval()将其转换为numpy数组,以便我可以检索每个数字中每个位置的数字值,但出现错误。

这是我的代码:


class MyLayer(Layer):
    global Input_tensor


    def __init__(self, output_dim=100, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)


    def build(self, input_shape):
        input_dim = input_shape[1]

        self.W2 = K.random_normal((input_dim,100))


        self.trainable_weights = [self.W2]


    def call(self, x):

        self.W = topology(x, self.W2)
        return K.dot(x, self.W)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)


def topology(input_tensor, W2):



    count_t = -1
    count_c = -1
    SW = np.random.rand(10000,100)


    with tf.compat.v1.Session() as sess:
        sess.run(tf.compat.v1.global_variables_initializer())
        x_unpacked = input_tensor.eval()
        print(x_unpacked.shape)
    for t in x_unpacked:
            tf.strings.as_string(t)
            e=tf.unstack(tf.reshape(t,[-1]))

            count_t += 1
            for c in e:

                count_c += 1
                i=0
                c=tf.dtypes.cast(c, tf.int32)
                for v in range(10):
                    W2=W2.numpy()
                    print(W2.shape)
                    SW[count_t: count_c + i*v,:] = W2[count_t:c  +i*v,:]

                    i += 10
    SW = tf.convert_to_tensor(SW)
    return SW

我得到的错误如下:

回溯(最近通话最近):
_do_call中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,行1367
返回fn(* args)
_run_fn中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,行1352
target_list,run_metadata)
在_call_tf_sessionrun中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”第1445行
run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError:您必须使用dtype float和shape [?,10输入占位符张量'input_1'的值 0,100,1]
[[{{node input_1}}]]

在处理上述异常期间,发生了另一个异常:

回溯(最近通话最近):

中的文件“ finalvideo_2.py”,第630行 text()
文件“ finalvideo_2.py”,第498行,为文本
kikiE(EX_dat,EY_dat)
在kikiE中的文件“ finalvideo_2.py”(第338行)
x = MyLayer()(输入张量)
在symbolic_fn_wrapper中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”,第73行,
return func(* args,** kwargs)
调用
中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/engine/base_layer.py”,第489行 输出= self.call(输入,** kwargs)
通话中的文件“ finalvideo_2.py”,第108行,
self.W =拓扑结构(x,self.W2)
拓扑中的文件“ finalvideo_2.py”,第128行,
x_unpacked = input_tensor.eval()
在eval中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py”,行790
返回_eval_using_default_session(self,feed_dict,self.graph,session)
_eval_using_default_session中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py”,第5312行
返回session.run(张量,feed_dict) 在运行中,文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,第960行
run_metadata_ptr)
文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,行1183,在_run
feed_dict_tensor,选项,run_metadata)
_do_run中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,行1361
run_metadata)
_do_call中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py”,行1386
提高类型(e)(node_def,op,消息)
tensorflow.python.framework.errors_impl.InvalidArgumentError:您必须使用dtype float和shape [?,10来输入占位符张量'input_1'的值 0,100,1]
[[节点输入_1(在/home/usergpu/venv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:676中定义)]]

“ input_1”的原始堆栈跟踪:

中的文件“ finalvideo_2.py”,第630行 text()
文件“ finalvideo_2.py”,第498行,为文本
kikiE(EX_dat,EY_dat)
在kikiE中,文件“ finalvideo_2.py”,第333行,
input_tensor = Input(shape = X_D [0] .shape)
输入文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/engine/input_layer.py”,第178行,
input_tensor = tensor)
包装中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/legacy/interfaces.py”,第91行,
return func(* args,** kwargs)
init
中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/engine/input_layer.py”,第87行 name = self.name)
在symbolic_fn_wrapper中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”,第73行,
return func(* args,** kwargs)
在占位符中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”,行676
shape = shape,ndim = ndim,dtype = dtype,sparse =稀疏,name = name)
在占位符中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py”,行1054
x = array_ops.placeholder(dtype,shape = shape,name = name)
在占位符上的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/ops/array_ops.py”,行2718
返回gen_array_ops.placeholder(dtype = dtype,shape = shape,name = name)
文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/ops/gen_array_ops.py”,第6032行,位于占位符
“占位符”,dtype = dtype,shape = shape,name = name)
_apply_op_helper中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/op_def_library.py”,第742行
attrs = attr_protos,op_def = op_def)
_create_op_internal
中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/func_graph.py”,第595行 compute_device)
_create_op_internal中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py”,行3322
op_def = op_def)
init
中的文件“ /home/usergpu/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py”,行1756 self._traceback = tf_stack.extract_stack()

任何帮助将不胜感激。

0 个答案:

没有答案