如何使用只有一个可训练变量的 Tensorflow (python) 自定义层?

问题描述

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

我怎样才能做到这一点?

到目前为止我所做的:

  • 我创建了一个具有所需可训练权重的自定义层 delta
  • 我尝试创建上述 Tensor(/Matrix)。这不起作用,因为我无法单独处理单元格。
  • 在张量上下文中使用函数 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,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)

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)