TensorFlow 模型中的矩阵乘法
Matrix multiplication in TensorFlow model
我想在 TF 模型中使用矩阵乘法。我的模型是一个输入形状 = (1,9) 的神经网络。我想自己得到这个向量的乘积(即我想得到一个矩阵乘积等于转置输入向量本身的乘积,所以它的形状等于(9,9))。
代码示例:
inputs = tf.keras.layers.Input(shape=(1,9))
outputs = tf.keras.layers.Dense(1, activation='linear')(tf.transpose(inputs) @ inputs)
model = tf.keras.Model(inputs, outputs)
adam = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss='mse', metrics=['mae'])
但我对这种结果的形状有疑问。对于上面的代码,我得到了下一个架构:
如果我没理解错的话,输入层中的第一个维度(None)对应于输入数据批次的大小。当我使用转置操作时,它适用于这个形状的所有维度。所以我在转置和乘法后得到形状为 (9,1,9) 的结果。但我认为,这是不正确的。因为我想为批量中的所有向量单独获取转置输入向量的乘积(即我想要获得的结果的正确形状是 (None, 9, 9)).
将这个乘积作为模型的输入(在这个模型之外计算这个乘法)是不合适的。因为我想在我的模型中有原始输入向量和乘法后的结果做一些操作(上面的架构不完整,以为例)。
我怎样才能得到正确的结果?如果我们想将此操作批量应用于所有向量(矩阵),在 TF 中乘以矩阵和向量的正确方法是什么?
尝试tf.linalg.matmul
,因为它会考虑批次维度:
import tensorflow as tf
inputs = tf.keras.layers.Input(shape=(1,9))
outputs = tf.keras.layers.Dense(1, activation='linear')(tf.linalg.matmul(inputs, inputs, transpose_a=True))
model = tf.keras.Model(inputs, outputs)
adam = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss='mse', metrics=['mae'])
print(model.summary())
Model: "model_3"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_5 (InputLayer) [(None, 1, 9)] 0 []
tf.linalg.matmul_3 (TFOpLambda (None, 9, 9) 0 ['input_5[0][0]',
) 'input_5[0][0]']
dense_4 (Dense) (None, 9, 1) 10 ['tf.linalg.matmul_3[0][0]']
==================================================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
__________________________________________________________________________________________________
None
我从你的问题中读到,在 NN 中进行矩阵乘法,其中数字乘法很容易!
它是一个序列到一个序列,我们有很多例子(那些带有目标乘法字典的句子输入)
不需要指定形状输出,但序列输出仍然是答案!
( 1 ): 使用 TF.where 或更大!
输入:
array_1 = [ 0, 1, 1, 0 ]
array_2 = np.concatenate((array_1, array_1), axis = 0)
temp = [ 0, 1, 1, 0 ]
print( np.asarray( tf.where([ temp == [0, 1, 1, 0] ], array_2, 0 ) ) )
input('...')
输出:
[0 1 1 0 0 1 1 0]
( 2 ): 使用 tfa.seq2seq.BasicDecoder sum
输入:
index = 1
next_char = tf.strings.substr(
input_word, index, len(input_word[0].numpy()) - index, unit="UTF8_CHAR", name=None
)
output, state, lengths = decoder(
next_char, start_tokens=start_tokens, end_token=end_token, initial_state=initial_state)
print('next_char[0].numpy(): ' + str(next_char[0].numpy()))
输出:
input_word[0].numpy() length: tf.Tensor([b'Gl\xc3\xbccklicherweise '], shape=(1,), dtype=string)
input_word[0].numpy() length: 18
next_char[0].numpy(): b'Gl\xc3\xbccklicherweise '
next_char[0].numpy(): b'l\xc3\xbccklicherweise '
next_char[0].numpy(): b'\xc3\xbccklicherweise '
next_char[0].numpy(): b'cklicherweise '
next_char[0].numpy(): b'klicherweise '
next_char[0].numpy(): b'licherweise '
sum = G + L + L + ...
( 3 ): 模型乘法,你使用密集输入,输出是如图中所需目标的序列。
...
我想在 TF 模型中使用矩阵乘法。我的模型是一个输入形状 = (1,9) 的神经网络。我想自己得到这个向量的乘积(即我想得到一个矩阵乘积等于转置输入向量本身的乘积,所以它的形状等于(9,9))。
代码示例:
inputs = tf.keras.layers.Input(shape=(1,9))
outputs = tf.keras.layers.Dense(1, activation='linear')(tf.transpose(inputs) @ inputs)
model = tf.keras.Model(inputs, outputs)
adam = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss='mse', metrics=['mae'])
但我对这种结果的形状有疑问。对于上面的代码,我得到了下一个架构:
如果我没理解错的话,输入层中的第一个维度(None)对应于输入数据批次的大小。当我使用转置操作时,它适用于这个形状的所有维度。所以我在转置和乘法后得到形状为 (9,1,9) 的结果。但我认为,这是不正确的。因为我想为批量中的所有向量单独获取转置输入向量的乘积(即我想要获得的结果的正确形状是 (None, 9, 9)).
将这个乘积作为模型的输入(在这个模型之外计算这个乘法)是不合适的。因为我想在我的模型中有原始输入向量和乘法后的结果做一些操作(上面的架构不完整,以为例)。
我怎样才能得到正确的结果?如果我们想将此操作批量应用于所有向量(矩阵),在 TF 中乘以矩阵和向量的正确方法是什么?
尝试tf.linalg.matmul
,因为它会考虑批次维度:
import tensorflow as tf
inputs = tf.keras.layers.Input(shape=(1,9))
outputs = tf.keras.layers.Dense(1, activation='linear')(tf.linalg.matmul(inputs, inputs, transpose_a=True))
model = tf.keras.Model(inputs, outputs)
adam = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss='mse', metrics=['mae'])
print(model.summary())
Model: "model_3"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_5 (InputLayer) [(None, 1, 9)] 0 []
tf.linalg.matmul_3 (TFOpLambda (None, 9, 9) 0 ['input_5[0][0]',
) 'input_5[0][0]']
dense_4 (Dense) (None, 9, 1) 10 ['tf.linalg.matmul_3[0][0]']
==================================================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
__________________________________________________________________________________________________
None
我从你的问题中读到,在 NN 中进行矩阵乘法,其中数字乘法很容易! 它是一个序列到一个序列,我们有很多例子(那些带有目标乘法字典的句子输入) 不需要指定形状输出,但序列输出仍然是答案!
( 1 ): 使用 TF.where 或更大!
输入:
array_1 = [ 0, 1, 1, 0 ]
array_2 = np.concatenate((array_1, array_1), axis = 0)
temp = [ 0, 1, 1, 0 ]
print( np.asarray( tf.where([ temp == [0, 1, 1, 0] ], array_2, 0 ) ) )
input('...')
输出:
[0 1 1 0 0 1 1 0]
( 2 ): 使用 tfa.seq2seq.BasicDecoder sum
输入:
index = 1
next_char = tf.strings.substr(
input_word, index, len(input_word[0].numpy()) - index, unit="UTF8_CHAR", name=None
)
output, state, lengths = decoder(
next_char, start_tokens=start_tokens, end_token=end_token, initial_state=initial_state)
print('next_char[0].numpy(): ' + str(next_char[0].numpy()))
输出:
input_word[0].numpy() length: tf.Tensor([b'Gl\xc3\xbccklicherweise '], shape=(1,), dtype=string)
input_word[0].numpy() length: 18
next_char[0].numpy(): b'Gl\xc3\xbccklicherweise '
next_char[0].numpy(): b'l\xc3\xbccklicherweise '
next_char[0].numpy(): b'\xc3\xbccklicherweise '
next_char[0].numpy(): b'cklicherweise '
next_char[0].numpy(): b'klicherweise '
next_char[0].numpy(): b'licherweise '
sum = G + L + L + ...
( 3 ): 模型乘法,你使用密集输入,输出是如图中所需目标的序列。
...