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