У меня есть образец сложной нейронной сети с одним слоем, который действует следующим образом:
Во-первых, у меня есть известная комплексная матрица размером 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
Как решить проблему увеличения функции стоимости вместо ее уменьшения ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Можете ли вы контролировать коэффициент увеличения/уменьшения изображений на веб-странице?
Anonymous » » в форуме CSS - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как сделать анимацию увеличения и уменьшения масштаба при нажатии жестом в SwiftUI?
Anonymous » » в форуме IOS - 0 Ответы
- 53 Просмотры
-
Последнее сообщение Anonymous
-