Как решить проблему увеличения функции стоимости вместо ее уменьшенияPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как решить проблему увеличения функции стоимости вместо ее уменьшения

Сообщение Anonymous »

У меня есть образец сложной нейронной сети с одним слоем, который действует следующим образом:
Во-первых, у меня есть известная комплексная матрица размером N x N, Я извлек столбцы 1:4:N из этой матрицы, чтобы получить матрицу V размера N x N/4, я хочу умножить матрицу V на a общеизвестный вектор s, содержащий 1 и -1, размером N/4 x 1 такой, что y = Vs, где y будет иметь размер N x 1< /код>. Поэтому я хочу, чтобы последние N/4 элементов вектора y были нулями или близкими к нулю. Итак, я сначала вставил вектор s в нейронную сеть, а затем умножил его на матрицу V. Затем выполняется обучение для поиска лучших весов нейронного слоя, которые оптимизируют последние N/4 элементов вектора y.
Задача I обнаружено, что функция стоимости увеличивается во время обучения, а не убывает, а также результат после обучения: вектор y = VGs не содержит нулевых или близких к нулю значений в своем последнем N/ 4 элемента, G здесь представляет веса нейронной сети после обучения.
Вот код, который я написал:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model
import numpy as np
from tensorflow.keras.optimizers import Adam

# Parameters
N = 64

class ComplexNormal(tf.keras.initializers.Initializer): #to build the complex NN
"""Complex normal initializer."""
def __call__(self, shape, dtype=None):
real_part = tf.random.normal(shape, stddev=0.5)
imag_part = tf.random.normal(shape, stddev=0.5)
return tf.dtypes.complex(real_part, imag_part)

#Generate the vector s
s_vector = tf.random.uniform(shape=(N//4,1), minval=0, maxval=2, dtype=tf.int32)
s_vector = tf.where(s_vector == 0, -1, 1) # Convert 0 to -1 and 1 stays 1
s_vector = tf.cast(s_vector, dtype=tf.complex64)

def Matrix_multiplication(x, N):
Vector_pilot = tf.convert_to_tensor(x, dtype=tf.complex64)
n = tf.range(N, dtype=tf.float32)
k = tf.reshape(n, (N, 1))

imaginary_part = 2 * np.pi * n * k / tf.cast(N, tf.float32) # Imaginary part for the V matrix
omega = tf.exp(tf.complex(0.0, imaginary_part)) # Complex exponential the matrix
Matrix_V = omega / tf.sqrt(tf.cast(N, tf.complex64)) # Normalize the matrix
pilot_ind = tf.range(0, N, delta=4, dtype=tf.int32) # Create pilot_ind array equivalent to [1:4:N] in MATLAB

V_matrix_selected = tf.gather(Matrix_V, pilot_ind, axis=1) # Extract columns 1:4:end
y_vector = tf.matmul(V_matrix_selected, Vector_pilot)
return y_vector

# Use the subcarrier into the model
input_data = Input(shape=(N//4,), dtype=tf.complex64)
layer_1 = Dense(N//4, activation='linear', kernel_initializer=ComplexNormal(), dtype=tf.complex64)(input_data) # The first layer

y2 = Matrix_multiplication(tf.transpose(layer_1), N) # Multiply the output with the maxtrix V

model = Model(inputs=input_data, outputs=layer_1)

UW = tf.reduce_mean(tf.abs(y2[-N//4:, :])) #Reduce the mean of the last N/4 elements of vector y2
model.add_loss(UW)

s_vector_repeated = tf.tile(tf.transpose(s_vector), [5000000,1]) #Generate the data with 5000000 training size
data = tf.convert_to_tensor(s_vector_repeated, dtype=tf.complex64)

model.compile(optimizer=Adam(lr=0.001))
model.fit(data, epochs=200, steps_per_epoch=1000, verbose=2)


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

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

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

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

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

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

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