Определение пользовательского слоя и пользовательских потерь на основе результатов всех слоев.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Определение пользовательского слоя и пользовательских потерь на основе результатов всех слоев.

Сообщение Anonymous »

Я пытаюсь реализовать нейронную сеть для декодирования зашумленного полученного сигнала. Каждый уровень моей нейронной сети выглядит следующим образом:
Один слой
Моя попытка:

Код: Выделить всё

class DetNet(tf.keras.Model):
def __init__(self, K, N, L, v_size, hl_size, res_alpha=0.9, log_loss=True):
super(DetNet, self).__init__()
self.K = K
self.N = N
self.L = L
self.v_size = v_size
self.hl_size = hl_size
self.res_alpha = res_alpha
self.log_loss = log_loss

self.layers_detnet = []
for i in range(L):
layer = DetNetLayer(K, v_size, hl_size, res_alpha, name=f'layer_{i}')
self.layers_detnet.append(layer)

def call(self, HY, HH, X, training=False):
S = [tf.zeros_like(X)]
V = [tf.zeros((tf.shape(HY)[0], self.v_size),dtype=tf.dtypes.as_dtype(HY.dtype))]
losses = []
bers = []

for i, layer in enumerate(self.layers_detnet):
Z = tf.concat([HY, S[-1], tf.linalg.matvec(HH, S[-1]), V[-1]], axis=-1)
S_next, V_next = layer(Z, training=training)
S.append(S_next)
V.append(V_next)

loss = tf.reduce_mean(tf.reduce_mean(tf.square(X - S[-1]), axis=-1) / tf.reduce_mean(tf.square(X - tf.squeeze(tf.linalg.solve(HH, tf.expand_dims(HY, 2)), axis=2)), axis=-1))
if self.log_loss:
loss *= tf.math.log(tf.cast(i + 1, tf.float32))
losses.append(loss)

ber = tf.reduce_mean(tf.cast(tf.not_equal(X, tf.sign(S[-1])), tf.float32))
bers.append(ber)

total_loss = tf.add_n(losses)
return total_loss, bers

class DetNetLayer(layers.Layer):
def __init__(self, K, v_size, hl_size, res_alpha, **kwargs):
super(DetNetLayer, self).__init__(**kwargs)
self.K = K
self.v_size = v_size
self.hl_size = hl_size
self.res_alpha = res_alpha

self.W1 = self.add_weight(shape=(3 * K + v_size, hl_size), initializer='glorot_uniform', trainable=True)
self.b1 = self.add_weight(shape=(hl_size,), initializer='zeros', trainable=True)
self.W2 = self.add_weight(shape=(hl_size, K), initializer='glorot_uniform', trainable=True)
self.b2 = self.add_weight(shape=(K,), initializer='zeros', trainable=True)
self.t = self.add_weight(shape=(), initializer=tf.constant_initializer(0.1), trainable=True)
self.W3 = self.add_weight(shape=(hl_size, v_size), initializer='glorot_uniform', trainable=True)
self.b3 = self.add_weight(shape=(v_size,), initializer='zeros', trainable=True)

def call(self, inputs, training=False):
Z = tf.nn.relu(tf.matmul(inputs, self.W1) + self.b1)
S_next = self.piecewise_linear_soft_sign(tf.matmul(Z, self.W2) + self.b2, self.t)
V_next = tf.matmul(Z, self.W3) + self.b3
if training:
return (1 - self.res_alpha) * S_next, (1 - self.res_alpha) * V_next
else:
return S_next, V_next

И мой цикл обучения (я использую tf.GradientTape):

Код: Выделить всё

for epoch in range(num_epochs):
epoch_loss = 0
for HY_, HH, X in train_dataset:
with tf.GradientTape() as tape:
loss, bers = detnet(HY_, HH, X, training=True)
gradients = tape.gradient(loss, detnet.trainable_variables)
optimizer.apply_gradients(zip(gradients, detnet.trainable_variables))
epoch_loss += loss.numpy()
temp.append(loss.numpy())
epoch_loss /= (num_train_samples // batch_size)
train_losses.append(epoch_loss)

# Evaluate on validation set
val_loss, _ = detnet(HY_val_, HH_val, X_val, training=True)
val_losses.append(val_loss.numpy())
print(f"Epoch {epoch + 1}, Training Loss: {epoch_loss}, Validation Loss: {val_losses[-1]}")

Есть ли какие-либо проблемы, описанные выше? Я не могу получить правильные BER в качестве бумаги, моя функция потерь насыщается до 1500, хотя я ожидаю, что она достигнет 500.

Подробнее здесь: https://stackoverflow.com/questions/783 ... all-layers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»