Создание представления матрицы весов, перестановка индексов, затем создание точечного произведения с представлением в пользовательском слое - PullRequest
0 голосов
/ 12 марта 2020

В моем коде я преобразовываю весовую матрицу моего пользовательского слоя в массив numpy с .eval(), затем я выполняю над ним операции, прежде чем выполнить точечное произведение со входными данными.

i у меня две проблемы, во-первых, когда я пытаюсь преобразовать мягкую копию матрицы весов, которая теперь находится в формате numpy, обратно в тензор, когда я делаю скалярное произведение со входом, я получаю следующую ошибку.

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-17aacf1004a8> in <module>()
    161 for s in range(50000):
    162         input_tensor = Input(shape=(random_dim,))
--> 163         x=MyLayer(10,array=noise[s:s+1,:])(input_tensor)
    164 
    165 

3 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    449             # Actually call the layer,
    450             # collecting output(s), mask(s), and shape(s).
--> 451             output = self.call(inputs, **kwargs)
    452             output_mask = self.compute_mask(inputs, previous_mask)
    453 

<ipython-input-20-17aacf1004a8> in call(self, y)
     94         #S=tf.compat.v1.transpose(S)
     95         self.trainable_weights = [S]
---> 96         return K.dot(self.array, S)
     97 '''
     98 class MyLayer(Layer):

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in dot(x, y)
   1109     {{np_implementation}}
   1110     """
-> 1111     if ndim(x) is not None and (ndim(x) > 2 or ndim(y) > 2):
   1112         x_shape = []
   1113         for i, s in zip(int_shape(x), tf.unstack(tf.shape(x))):

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in ndim(x)
    645     {{np_implementation}}
    646     """
--> 647     dims = x.get_shape()._dims
    648     if dims is not None:
    649         return len(dims)

AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'

вот фрагмент моего кода:

        with tf.compat.v1.Session() as sess:
                          sess.run(tf.compat.v1.global_variables_initializer())
                          S[count_t, count_c ] = W2[count_t,c ].eval()


        S=tf.compat.v1.convert_to_tensor(S)
        print(S.shape)
        #self.array=tf.compat.v1.convert_to_tensor(self.array)
        #print(self.array.shape)
        self.trainable_weights = [S]
        return K.dot(self.array, S) 

, если я не прокомментирую печать (S.shape) и (self.array.shape), а также ссылку на себя. массив в тензор, после, по-видимому, преобразования обоих в тензоры, я получаю их формы, даже если .shape является командой numpy и не работает с тензорами. И я получаю другое сообщение об ошибке.

(100, 100)
(1, 100)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
    527                 as_ref=input_arg.is_ref,
--> 528                 preferred_dtype=default_dtype)
    529           except TypeError as err:

8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py in internal_convert_to_tensor(value, dtype, name, as_ref, preferred_dtype, ctx, accepted_result_types)
   1272           "Tensor conversion requested dtype %s for Tensor with dtype %s: %r" %
-> 1273           (dtype.name, value.dtype.name, value))
   1274     return value

ValueError: Tensor conversion requested dtype float32 for Tensor with dtype float64: <tf.Tensor 'my_layer_23/Const:0' shape=(100, 100) dtype=float64>

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-23-02f759050a33> in <module>()
    161 for s in range(50000):
    162         input_tensor = Input(shape=(random_dim,))
--> 163         x=MyLayer(10,array=noise[s:s+1,:])(input_tensor)
    164 
    165 

/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    449             # Actually call the layer,
    450             # collecting output(s), mask(s), and shape(s).
--> 451             output = self.call(inputs, **kwargs)
    452             output_mask = self.compute_mask(inputs, previous_mask)
    453 

<ipython-input-23-02f759050a33> in call(self, y)
     94         print(self.array.shape)
     95         self.trainable_weights = [S]
---> 96         return K.dot(self.array, S)
     97 '''
     98 class MyLayer(Layer):

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in dot(x, y)
   1133         out = tf.sparse_tensor_dense_matmul(x, y)
   1134     else:
-> 1135         out = tf.matmul(x, y)
   1136     return out
   1137 

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/util/dispatch.py in wrapper(*args, **kwargs)
    178     """Call target, and fall back on dispatchers if there is a TypeError."""
    179     try:
--> 180       return target(*args, **kwargs)
    181     except (TypeError, ValueError):
    182       # Note: convert_to_eager_tensor currently raises a ValueError, not a

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/math_ops.py in matmul(a, b, transpose_a, transpose_b, adjoint_a, adjoint_b, a_is_sparse, b_is_sparse, name)
   2752     else:
   2753       return gen_math_ops.mat_mul(
-> 2754           a, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)
   2755 
   2756 

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/gen_math_ops.py in mat_mul(a, b, transpose_a, transpose_b, name)
   6134   _, _, _op = _op_def_lib._apply_op_helper(
   6135         "MatMul", a=a, b=b, transpose_a=transpose_a, transpose_b=transpose_b,
-> 6136                   name=name)
   6137   _result = _op.outputs[:]
   6138   _inputs_flat = _op.inputs

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
    562                   "%s type %s of argument '%s'." %
    563                   (prefix, dtypes.as_dtype(attrs[input_arg.type_attr]).name,
--> 564                    inferred_from[input_arg.type_attr]))
    565 
    566           types = [values.dtype]

TypeError: Input 'b' of 'MatMul' Op has type float64 that does not match type float32 of argument 'a'.

Я также, возможно, сделал что-то нелогичное, потому что, очевидно, .eval () не является дифференцируемой операцией. как бы я выполнял операции с матрицей весов до того, как вход в слой вошел без использования .eval (), или, в гораздо более широком смысле, есть ли способ сделать перестановки для тензоров-индексов, то есть создать представления тензора в способ, которым у представления есть те же самые элементы, только в другой перестановке. Затем используйте это перестановочное представление, чтобы получить точечное произведение со входом.

Другая проблема заключается в том, будет ли это работать на графическом процессоре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...