问题描述
我正在寻找一种向我的 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 (将#修改为@)