0

我正在寻找一种将自定义层添加到我的 TensorFlow (python) 模型的方法。这一层应该由一个可训练变量组成delta。该变量必须用作贝塞尔函数的参数special.jn(n, delta)。设input_vector为包含我的输入的 d 维向量。我希望将其乘以bessel_tensor. 后者应该是一个 (dxd)-Tensor,包含不同阶 n 的贝塞尔函数,但都具有相同的可训练增量。现在,我想针对要优化的 delta 进行训练。

我怎样才能做到这一点?

到目前为止我所做的:

  • 我创建了一个具有所需可训练重量的自定义层delta
  • 我试图创建上面描述的张量(/矩阵)。这不起作用,因为我无法单独处理单元格。
  • 在张量的上下文中使用该special.jn(n, delta)函数效果不佳,因此我创建了一个接近所需值的总和

一个最小的可重现示例是:

import tensorflow as tf 
from tensorflow.keras import layers
from scipy import special
import pandas as pd
import math as math

# Define parameters
epochs = 12
batch_size = 100
test_size = 1000
training_size = 3000

# Loading training data
test_data = pd.read_csv("data/test_data.csv", delimiter=";")
test_labels = pd.read_csv("data/test_labels.csv")

train_data = pd.read_csv("data/train_data.csv", delimiter=";")
train_labels = pd.read_csv("data/train_labels.csv")

test_data = test_data[:test_size]
test_labels = test_labels[:test_size]

train_data = train_data[:training_size]
train_labels = train_labels[:training_size]


# Layer class
class BesselLayer(layers.Layer):
    def __init__(self, **kwargs):
        super(BesselLayer, self).__init__(**kwargs)


    def build(self, input_shape):
        self.delta = self.add_weight(name="delta", shape=(1, 1), initializer="random_normal", trainable=True)


    def call(self, input_vector):
        
        # Should be a tensor of shape (d x d) with d = 2 shown below
        bessel_tensor = tf.Tensor([[special.jn(0, self.delta), special.jn(1, self.delta)], [special.jn(2, self.delta), special.jn(3, self.delta)]])

        return tf.matmul(input_vector, bessel_tensor)




# Creation of the model
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(784, activation=tf.nn.relu, input_shape=(784,))) # Dense layer 784
bessel_layer = BesselLayer()
model.add(bessel_layer) # Custom defined layer 784
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax)) # Output layer representing the output data


# Compile the model
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy'])
print(model.summary())


# Fit the model
history = model.fit(train_data, train_labels, epochs=epochs, batch_size=batch_size)

# Evaluate the model
test_loss, test_accuracy = model.evaluate(test_data, test_labels)

这不起作用,因为必须以某种方式定义可训练的张量

4

0 回答 0