当前位置: 首页 > 知识库问答 >
问题:

keras稠密模型的矩阵逆逼近

洪高扬
2023-03-14

我正在训练一个神经网络来计算3x3矩阵的逆。我使用的是一个具有1层和9个神经元的Keras密集模型。第一层上的激活函数为“relu”,输出层上的激活函数为线性。我正在使用10000个行列式1的矩阵。我得到的结果不是很好(RMSE有数百个)。我一直在尝试更多的层次、更多的神经元和其他激活功能,但收获很小。代码如下:

import numpy as np
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

def generator(nb_samples, matrix_size = 2, entries_range = (0,1), determinant = None):
    ''' 
    Generate nb_samples random matrices of size matrix_size with float 
    entries in interval entries_range and of determinant determinant 
    ''' 
    matrices = []
    if determinant:
        inverses = []
        for i in range(nb_samples):
            matrix = np.random.uniform(entries_range[0], entries_range[1], (matrix_size,matrix_size))
            matrix[0] *= determinant/np.linalg.det(matrix)
            matrices.append(matrix.reshape(matrix_size**2,))
            inverses.append(np.array(np.linalg.inv(matrix)).reshape(matrix_size**2,))
        return np.array(matrices), np.array(inverses)
    else:
        determinants = []
        for i in range(nb_samples):
            matrix = np.random.uniform(entries_range[0], entries_range[1], (matrix_size,matrix_size))
            determinants.append(np.array(np.linalg.det(matrix)).reshape(1,))
            matrices.append(matrix.reshape(matrix_size**2,))    
        return np.array(matrices), np.array(determinants)

### Select number of samples, matrix size and range of entries in matrices
nb_samples = 10000
matrix_size = 3
entries_range = (0, 100)
determinant = 1

### Generate random matrices and determinants
matrices, inverses = generator(nb_samples, matrix_size = matrix_size, entries_range = entries_range, determinant = determinant)

### Select number of layers and neurons
nb_hidden_layers = 1
nb_neurons = matrix_size**2
activation = 'relu'

### Create dense neural network with nb_hidden_layers hidden layers having nb_neurons neurons each
model = Sequential()
model.add(Dense(nb_neurons, input_dim = matrix_size**2, activation = activation))
for i in range(nb_hidden_layers):
    model.add(Dense(nb_neurons, activation = activation))
model.add(Dense(matrix_size**2))
model.compile(loss='mse', optimizer='adam')

### Train and save model using train size of 0.66
history = model.fit(matrices, inverses, epochs = 400, batch_size = 100, verbose = 0, validation_split = 0.33)

### Get validation loss from object 'history'
rmse = np.sqrt(history.history['val_loss'][-1])

### Print RMSE and parameter values
print('''
Validation RMSE: {}
Number of hidden layers: {}
Number of neurons: {}
Number of samples: {}
Matrices size: {}
Range of entries: {}
Determinant: {}
'''.format(rmse,nb_hidden_layers,nb_neurons,nb_samples,matrix_size,entries_range,determinant))

我在网上查过,似乎有关于逆矩阵近似问题的论文。然而,在更改模型之前,我想知道是否还有其他参数可以更改,从而对错误产生更大的影响。我希望有人能提供一些见解。非常感谢。

共有1个答案

段干帅
2023-03-14

对神经网络来说,反转3x3矩阵是相当困难的,因为它们往往不擅长乘以或除以激活。我无法让它与一个简单的密集网络一起工作,但7层resnet就可以做到这一点。它有数百万个权重,因此需要10000多个示例:我发现它完全记住了多达100000个样本,即使有10000000个样本,也严重过拟合,所以我只是连续生成样本,并在生成每个样本时将其反馈给网络一次。

import tensorflow as tf
import numpy as np

import matplotlib.pyplot as plt

#too_small_model = tf.keras.Sequential([
#    tf.keras.layers.Flatten(),
#    tf.keras.layers.Dense(1500, activation="relu"),
#    tf.keras.layers.Dense(1500, activation="relu"), 
#    tf.keras.layers.Dense(N * N),
#    tf.keras.layers.Reshape([ N, N])
#])

N = 3

inp = tf.keras.layers.Input(shape=[N, N])
x = tf.keras.layers.Flatten()(inp)
x = tf.keras.layers.Dense(128, activation="relu")(x)
for _ in range(7):
    skip = x
    for _ in range(4):
        y = tf.keras.layers.Dense(256, activation="relu")(x)
        x = tf.keras.layers.concatenate([x, y])
    #x = tf.keras.layers.BatchNormalization()(x)
    x = tf.keras.layers.Dense(128,
        kernel_initializer=tf.keras.initializers.Zeros(),
        bias_initializer=tf.keras.initializers.Zeros()
    )(x)
    x = skip + x
    #x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.Dense(N * N)(x)
x = tf.keras.layers.Reshape([N, N])(x)
model2 = tf.keras.models.Model(inp, x)

model2.compile(loss="mean_squared_error", optimizer=tf.keras.optimizers.Adam(learning_rate=.00001))

for _ in range(5000):
    random_matrices = np.random.random((1000000, N, N)) * 4 - 2
    random_matrices = random_matrices[np.abs(np.linalg.det(random_matrices)) > .1]
    inverses = np.linalg.inv(random_matrices)
    inverses = inverses / 5. # normalize target values, large target values hamper training
    model2.fit(random_matrices, inverses, epochs=1, batch_size=1024)

zz = model2.predict(random_matrices[:10000])

plt.scatter(inverses[:10000], zz, s=.0001)

print(random_matrices[76] @ zz[76] * 5)
 类似资料:
  • 问题内容: 我正在尝试计算Java中的逆矩阵。 我遵循伴随方法(首先计算伴随矩阵,然后转置该矩阵,最后将其乘以行列式值的倒数)。 当矩阵不太大时有效。我检查过,对于尺寸最大为12x12的矩阵,可以快速提供结果。但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长。 我需要反转的矩阵是19x19,并且花费太多时间。消耗更多时间的方法是用于行列式计算的方法。 我使用的代码是: 有人知道如何更有效

  • 我正在构建一个模型,该模型使用递归层(GRU)将一个字符串转换为另一个字符串。我试过将稠密层和时间分布(稠密)层作为最后一层,但当使用return\u sequences=True时,我不理解这两个层之间的区别,尤其是因为它们似乎具有相同数量的参数。 我的简化模型如下: 网络的总结是: 这对我来说是有意义的,因为我对时间分布的理解是它在所有时间点应用相同的层,因此密集层有16*15 15=255参

  • 矩阵A的倒数用A -1表示,使得以下关系成立 - AA<sup>−1</sup> = A<sup>−1</sup>A = 1 矩阵的逆矩阵并不总是存在。 如果矩阵的行列式为零,则逆不存在且矩阵是单数的。 使用inv函数计算MATLAB中矩阵的逆。 矩阵A的逆是由inv(A)给出的。 例子 (Example) 创建一个脚本文件并键入以下代码 - a = [ 1 2 3; 2 3 4; 1 2 5]

  • 问题内容: This is my test code: The output is: 但是发生了什么? 文件上说: 注意:如果层的输入的秩大于2,则为 在初始点积之前先展平带核。 当输出被重塑时? 问题答案: 目前,与文件中所述相反的是, 层[应用在输入张量的最后一个轴上](网址:keras.com/https://github- 团队/KERA/问题/10736#问题建议-406589140):

  • 现在,我想我明白了这个概念。但是当我把它们都放入代码中时,它就不起作用了…… 首先,我试图将矩阵转换为上三角矩阵,但由于某种原因,在第2列之后,它停止工作。。 我输入的数组是: [1.00][5.00][4.00][4.00][1.00] [5.00] [7.00] [7.00] [4.00] [8.00] [7.00] [4.00] [8.00] [4.00] [7.00] [10.00][12

  • 我正在尝试使用Keras中的全连接层架构进行二分类,在Keras中称为密集类。 这是我创建的神经网络架构的设计: 因此,我有一个170002000的输入矩阵,其中17K个样本具有2k个特征。 我只保留了一个包含32个单位或神经元的隐藏层。 我的输出层是一个带有乙状结肠激活函数的单神经元。 现在,当我尝试检查第一个隐藏层的权重时,我希望它的大小是(2000,32),其中每行代表每个输入,每列代表该层