Я пытаюсь обучить модель смеси Гаусса через TF2.1, и моя модель выглядит примерно так:
import tensorflow as tf
import numpy as np
def my_network(input_dims=(250, 257), num_class=8631, mode='train'):
inputs=Input(shape=input_dims)
encoder_network=encoder_basemodel(input_dims)
x_emb=encoder_network(inputs)
mu=tf.Variable(initial_value=tf.random.normal([1, 512, num_class]), trainable=True)
sig=tf.Variable(initial_value=tf.ones([1, 512, num_class], trainable=True)
y=-tf.math.reduce_sum(-0.5*tf.math.log(2*3.14*sig)-0.5*tf.math.divide(tf.math.pow(tf.expand_dims(x_emb, -1)-mu, 2), sig), 1)
model=tf.keras.models.Model(inputs=inputs, outputs=y)
if mode=='train':
opt=tf.keras.optimizers.Adam(lr=1e-3)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['acc'])
return model
encoder_network
(некоторая сеть, состоящая из Dense
и Conv1D
Layers) параметры обычно оптимизируются при обучении, но mu
и sig
не обновляются вообще.
Я также пытался создать собственный слой следующим образом, но ничего не изменилось:
class gmm_layer(layers.Layer):
def __init__(self, input_dim, num_class):
super(gmm_layer, self).__init__()
self.input_dim=input_dim
self.num_class=num_class
self.mu=tf.Variable(initial_value=tf.random.normal([1, 512, num_class]), trainable=True)
self.sig=tf.Variable(initial_value=tf.ones([1, 512, num_class]), trainable=True)
def call(self, inputs):
return -tf.math.reduce_sum(-0.5*tf.math.log(2*np.pi*self.sig)-0.5*(tf.expand_dims(inputs, -1)-self.mu)**2/self.sig, 1)
def mu(self):
return self.mu
def sig(self):
return self.sig
def get_config(self):
return {'input_dim':self.input_dim, 'num_class':self.num_class}
Я не уверен, в чем проблема, поскольку у меня не было проблем с обучающими переменными, созданными с помощью tf.Variable в версии TF <2.0. </p>
Любая помощь приветствуется.
Спасибо