我正在寻找一种将自定义层添加到我的 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)
这不起作用,因为必须以某种方式定义可训练的张量