Этот пример показывает, как смоделировать сквозную коммуникационную систему с автоэнкодером для надежной передачи информационных бит по беспроводному каналу.
Традиционный автоэнкодер является неконтролируемой нейронной сетью, которая учится эффективно сжимать данные, что также называется кодировкой. Автоэнкодер также учится восстанавливать данные из сжатого представления таким образом, чтобы различие между исходными данными и восстановленными данными была минимальной.
Традиционные системы радиосвязи предназначены для обеспечения надежной передачи данных по каналу, который ухудшает передаваемые сигналы. Эти системы имеют несколько компонентов, таких как кодирование в канале, модуляция, эквализация, синхронизация и т.д. Каждый компонент оптимизируется независимо на основе математических моделей, которые упрощены, чтобы получить закрытые выражения формы. Напротив, автоэнкодер совместно оптимизирует передатчик и приемник в целом. Эта совместная оптимизация имеет потенциал обеспечения лучшей эффективности, чем традиционные системы [1], [2 ].
Традиционные автоэнкодеры обычно используются для сжатия изображений, другими словами, удаляют избыточности в изображении и уменьшают его размерность. Система радиосвязи, с другой стороны, использует методы канального кодирования и модуляции, чтобы добавить избыточность к информационным битам. С этой добавленной избыточностью система может восстановить информационные биты, которые нарушены беспроводным каналом. Таким образом, беспроводной автоэнкодер фактически добавляет избыточность и пытается минимизировать количество ошибок в принятой информации для данного канала во время обучения применению как канального кодирования, так и модуляции неконтролируемым способом.
Ниже приведен блок схема беспроводной системы автоматического энкодера. Энкодер (передатчик) первый отображает информационные биты в сообщение s такие, что , где . Затем сообщение s преобразуется в n вещественного числа, чтобы создать . Последний слой энкодера накладывает ограничения на для дополнительного ограничения закодированных символов. Следующие возможные такие ограничения реализуются с использованием слоя нормализации:
Энергетическое ограничение:
Ограничение средней степени:
Определите скорость связи этой системы как [биты/использование канала], где (n, k) означает, что система отправляет один из сообщений, использующих n каналов. Канал ухудшает кодированные (то есть переданные) символы, чтобы сгенерировать . Декодер (то есть приемник) производит оценку, , переданного сообщения, .
Сообщение входа определяется как вектор с одним нагревом , который определяется как вектор, элементы которого все являются нулями, кроме один. Канал является аддитивным белым Гауссовым шумом (AWGN), который добавляет шум, чтобы достичь заданного отношения энергии на бит к плотности степени шума, .
Задайте (7,4) сеть автоэнкодера с нормализацией энергии и обучением 3 дБ. В [1] авторы показали, что два полносвязных слоев как для энкодера (передатчика), так и для декодера (приемника) обеспечивают лучшие результаты с минимальной сложностью. Входной слой (featureInputLayer
(Deep Learning Toolbox)) принимает однотопленный вектор длины M. Энкодер имеет два полносвязных слоев (fullyConnectedLayer
(Deep Learning Toolbox)). Первый имеет M входов и M выходов и сопровождается слоем ReLU (reluLayer
(Deep Learning Toolbox)). Второй полносвязный слой имеет M входов и n выходов и сопровождается слоем нормализации (helperAEWNormalizationLayer.m). За слоями энкодера следует слой канала AWGN (helperAEWAWGNLayer.m). Выход канала передается в слои декодера. Первый слой декодера является полностью соединенным слоем, который имеет n входов и M выходов и сопровождается слоем ReLU. Второй полностью соединенный слой имеет M входов и M выходов и сопровождается слоем softmax (softmaxLayer
(Deep Learning Toolbox)), который выводит вероятность каждого M-символа. Слой классификации (classificationLayer
(Deep Learning Toolbox)) выводит наиболее вероятный переданный символ от 0 до M-1.
k = 4; % number of input bits M = 2^k; % number of possible input symbols n = 7; % number of channel uses EbNo = 3; % Eb/No in dB wirelessAutoencoder = [ featureInputLayer(M,"Name","One-hot input","Normalization","none") fullyConnectedLayer(M,"Name","fc_1") reluLayer("Name","relu_1") fullyConnectedLayer(n,"Name","fc_2") helperAEWNormalizationLayer("Method", "Energy", "Name", "wnorm") helperAEWAWGNLayer("Name","channel",... "NoiseMethod","EbNo",... "EbNo",EbNo,... "BitsPerSymbol",2,... "SignalPower",1) fullyConnectedLayer(M,"Name","fc_3") reluLayer("Name","relu_2") fullyConnectedLayer(M,"Name","fc_4") softmaxLayer("Name","softmax") classificationLayer("Name","classoutput")]
wirelessAutoencoder = 11×1 Layer array with layers: 1 'One-hot input' Feature Input 16 features 2 'fc_1' Fully Connected 16 fully connected layer 3 'relu_1' ReLU ReLU 4 'fc_2' Fully Connected 7 fully connected layer 5 'wnorm' Wireless Normalization Energy normalization layer 6 'channel' AWGN Channel AWGN channel with EbNo = 3 7 'fc_3' Fully Connected 16 fully connected layer 8 'relu_2' ReLU ReLU 9 'fc_4' Fully Connected 16 fully connected layer 10 'softmax' Softmax softmax 11 'classoutput' Classification Output crossentropyex
The helperAEWTrainWirelessAutoencoder.m
функция задает такую сеть на основе (n, k), метода нормализации и значения. В разделе Wireless Autoencoder Training Function (Функция обучения беспроводного автоэнкодера) показано содержимое helperAEWTrainWirelessAutoencoder.m
функциональные .
Запуск helperAEWTrainWirelessAutoencoder.m
функция для обучения (2,2) автоэнкодера с энергетической нормализацией. Эта функция использует trainingOptions
(Deep Learning Toolbox) для выбора
Оптимизатор Адама (оценка адаптивного момента),
Начальная скорость обучения 0,01,
Максимальные эпохи 15,
Мини-бат размером 20 * М,
Кусочное расписание обучения с периодом падения 10 и коэффициентом падения 0,1.
Затем, helperAEWTrainWirelessAutoencoder.m
функция запускает trainNetwork
(Deep Learning Toolbox) функция для обучения сети автоэнкодера с выбранными опциями. Наконец, эта функция разделяет сеть на части энкодера и декодера. Энкодер начинается с входа уровня и заканчивается после уровня нормализации. Декодер запускается после канального уровня и заканчивается классификационным слоем. Входной слой функции добавляется в начале декодера.
Обучите автоэнкодер с значение, которое является достаточно низким, чтобы привести к некоторым ошибкам, но не слишком низким, так что алгоритм настройки не может извлечь какую-либо полезную информацию из полученных символов y. Набор до 3 дБ.
Обучение автоэнкодера может занять несколько минут. Задайте trainNow
false, чтобы использовать сохраненные сети.
trainNow = false; %#ok<*NASGU> n = 2; % number of channel uses k = 2; % bits per data symbol EbNo = 3; % dB нормализация = "Energy"; % Normalization "Energy" | "Average power" if trainNow [txNet22e, rxNet22e, info22e, wirelessAutoEncoder22e] = ... helperAEWTrainWirelessAutoencoder (n, k, нормализация, EbNo);%#ok<*UNRCH> else груз trainedNet_n2_k2_energy txNet rxNet info trainedNet txNet22e = txNet; rxNet22e = rxNet; info22e = info; wirelessAutoEncoder22e = trainedNet; end
Постройте график прогресса транша. Точность валидации быстро достигает более 90%, в то время как потеря валидации продолжает медленно уменьшаться. Это поведение показывает, что обучение значение было достаточно низким, чтобы вызвать некоторые ошибки, но не слишком низким, чтобы избежать сходимости. Определения точности валидации и потери валидации смотрите в разделе «Мониторинг процесса обучения по глубокому обучению» (Deep Learning Toolbox).
figure helperAEWPlotTrainingPerformance(info22e)
Используйте функцию объекта построения графика обученных сетевых объектов, чтобы показать графики слоев полного автоэнкодера, сети энкодера, то есть передатчика, и сети декодера, то есть приемника.
figure tiledlayout(2,2) nexttile([2 1]) plot(wirelessAutoEncoder22e) title('Autoencoder') nexttile plot(txNet22e) title('Encoder/Tx') nexttile plot(rxNet22e) title('Decoder/Rx')
Постройте график созвездия, выученного автоэнкодером, чтобы отправить символы через канал AWGN вместе с полученным созвездием. Для (2,2) строений автоэнкодер узнает QPSK () созвездие с поворотом фазы. Полученное созвездие в основном является значениями активации на выходе канального слоя, полученным с использованием activations
(Deep Learning Toolbox) функцию и обрабатывают как чередующиеся комплексные числа.
subplot(1,2,1) helperAEWPlotConstellation(txNet22e) title('Learned Constellation') subplot(1,2,2) helperAEWPlotReceivedConstellation(wirelessAutoEncoder22e) title('Received Constellation')
Симулируйте производительность блока (BLER) автоэнкодера (2,2). Setup параметров симуляции.
simParams.EbNoVec = 0:0.5:8; simParams.MinNumErrors = 10; simParams.MaxNumFrames = 300; simParams.NumSymbolsPerFrame = 10000; simParams.SignalPower = 1;
Сгенерируйте случайные целые числа в [0 -1] область значений, который представляет биты случайной информации. Закодируйте эти информационные биты в комплексные символы с helperAEWEncode.m
функция. The helperAEWEncode
функция запускает энкодер часть автоэнкодера, затем сопоставляет действительное значение вектор в комплексное значение вектор такой, что нечетные и четные элементы отображаются в синфазный и квадратурный компоненты комплексного символа, соответственно, где . Другими словами, лечите массив как перемеженный комплексный массив.
Передайте комплексные символы через канал AWGN. Декодируйте ослабленные комплексные символы канала с helperAEWDecode.m
функция. Следующий код запускает симуляцию для каждого точка для по крайней мере 10 блоков ошибок. Чтобы получить более точные результаты, увеличьте минимальное количество ошибок как минимум до 100. Если установлен Parallel Computing Toolbox™ и доступна лицензия, симуляция будет выполняться в параллельном пуле. Сравните результаты с результатами незакодированной системы QPSK с длиной блока 2.
EbNoVec = simParams.EbNoVec; R = k/n; M = 2^k; BLER = zeros(size(EbNoVec)); parfor EbNoIdx = 1:length(EbNoVec) EbNo = EbNoVec(EbNoIdx) + 10*log10(R); chan = comm.AWGNChannel("BitsPerSymbol",2, ... "EbNo", EbNo, "SamplesPerSymbol", 1, "SignalPower", 1); numBlockErrors = 0; frameCnt = 0; while (numBlockErrors < simParams.MinNumErrors) ... && (frameCnt < simParams.MaxNumFrames) %#ok<PFBNS> d = randi([0 M-1],simParams.NumSymbolsPerFrame,1); % Random information bits x = helperAEWEncode(d,txNet22e); % Encoder y = chan(x); % Channel dHat = helperAEWDecode(y,rxNet22e); % Decoder numBlockErrors = numBlockErrors + sum(d ~= dHat); frameCnt = frameCnt + 1; end BLER(EbNoIdx) = numBlockErrors / (frameCnt*simParams.NumSymbolsPerFrame); end
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6).
figure semilogy(simParams.EbNoVec,BLER,'-') hold on qpsk22BLER = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^2; semilogy(simParams.EbNoVec,qpsk22BLER,'--') hold off ylim([1e-4 1]) grid on xlabel('E_b/N_o (dB)') ylabel('BLER') legend('AE (2,2)','QPSK (2,2)')
Хорошо сформированное созвездие вместе с результатами BLER показывают, что обучения на 15 эпох достаточно, чтобы получить удовлетворительную сходимость.
Сравните выученные созвездия нескольких автоэнкодеров, нормированных к единичной энергии и средней мощности единицы. Обучите (2,4) автоэнкодер нормирован к единичной энергии.
n = 2; % number of channel uses k = 4; % bits per data symbol EbNo = 3; % dB normalization = "Energy"; if trainNow [txNet24e,rxNet24e,info24e,wirelessAutoEncoder24e] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo); else load trainedNet_n2_k4_energy txNet rxNet info trainedNet txNet24e = txNet; rxNet24e = rxNet; info24e = info; wirelessAutoEncoder24e = trainedNet; end
Обучите (2,4) автоэнкодер нормирован к средней степени модуля.
n = 2; % number of channel uses k = 4; % bits per data symbol EbNo = 3; % dB normalization = "Average power"; if trainNow [txNet24p,rxNet24p,info24p,wirelessAutoEncoder24p] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo); else load trainedNet_n2_k4_power txNet rxNet info trainedNet txNet24p = txNet; rxNet24p = rxNet; info24p = info; wirelessAutoEncoder24p = trainedNet; end
Обучите (7,4) автоэнкодер нормирован к единичной энергии.
n = 7; % number of channel uses k = 4; % bits per data symbol EbNo = 3; % dB normalization = "Energy"; if trainNow [txNet74e,rxNet74e,info74e,wirelessAutoEncoder74e] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo); else load trainedNet_n7_k4_energy txNet rxNet info trainedNet txNet74e = txNet; rxNet74e = rxNet; info74e = info; wirelessAutoEncoder74e = trainedNet; end
Постройте график созвездия с помощью helperAEWPlotConstellation.m
функция. Обученный (2,2) автоэнкодер сходится в созвездии QPSK со сдвигом фазы как оптимальным созвездием для испытываемых условий канала. (2,4) автоэнкодер с энергетической нормализацией сходится к 16PSK созвездию со сдвигом фазы. Обратите внимание, что нормализация энергии заставляет каждый символ иметь модуль энергию и помещает символы на модуль круг. Учитывая это ограничение, лучшее созвездие является PSK-созвездием с равным угловым расстоянием между символами. Автоэнкодер (2,4) со средней нормализацией степени сходится к трехуровневому созвездию 1-6-9 символов. Нормализация средней степени заставляет символы иметь среднюю степень единицы с течением времени. Это ограничение приводит к созвездию APSK, которое отличается от обычных схем QAM или APSK. Обратите внимание, что это сетевое строение может также сходиться к двухуровневому созвездию с 7-9 символами на основе случайных начальных условий, используемых во время обучения. Последний график показывает 2-D отображение 7-D созвездия, сгенерированного (7,4) автоэнкодером с ограничением по энергии. 2-D отображение получено с помощью t-распределенного метода Stochastic Neighbor Embedding (t-SNE) (см tsne
(Statistics and Machine Learning Toolbox).
figure subplot(2,2,1) helperAEWPlotConstellation(txNet22e) title('(2,2) Energy') subplot(2,2,2) helperAEWPlotConstellation(txNet24e) title('(2,4) Energy') subplot(2,2,3) helperAEWPlotConstellation(txNet24p) title('(2,4) Average Power') subplot(2,2,4) helperAEWPlotConstellation(txNet74e,'t-sne') title('(7,4) Energy')
Симулируйте эффективность BLER (7,4) автоэнкодера с таковой (7,4) Hamming кода с QPSK модуляцией как для жесткого решения, так и для декодирования с максимальной вероятностью (ML). Используйте незакодированный (4,4) QPSK в качестве базовой линии. (4,4) незакодированный QPSK является в основном QPSK модулированной системой, которая отправляет блоки по 4 бита и измеряет BLER. Данные для следующих рисунков получаются с помощью файлов helperAEWSimulateBLER.mlx и helperAEWPrepareAutoencoders.mlx.
load codedBLERResults.mat figure qpsk44BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^4; semilogy(simParams.EbNoVec,qpsk44BLERTh,':*') hold on semilogy(simParams.EbNoVec,qpsk44BLER,':o') semilogy(simParams.EbNoVec,hammingHard74BLER,'--s') semilogy(simParams.EbNoVec,ae74eBLER,'-') semilogy(simParams.EbNoVec,hammingML74BLER,'--d') hold off ylim([1e-5 1]) grid on xlabel('E_b/N_o (dB)') ylabel('BLER') legend('Theoretical Uncoded QPSK (4,4)','Uncoded QPSK (4,4)','Hamming (7,4) Hard Decision',... 'Autoencoder (7,4)','Hamming (7,4) ML','Location','southwest') title('BLER comparison of (7,4) Autoencoder')
Как ожидалось, жесткое решение (7,4) Код Хемминга с модуляцией QPSK обеспечивает около 0,6 дБ преимущество перед незакодированным QPSK, в то время как ML-декодирование (7,4) Hamming кода с QPSK-модуляцией обеспечивает другое преимущество в 1,5 дБ для BLER . (7,4) Эффективность BLER автоэнкодера приближается к декодированию ML (7,4) кода Хемминга, когда обучен с 3 дБ . Эта эффективность BLER показывает, что автоэнкодер способен учиться не только модуляции, но и канальному кодированию для достижения коэффициента усиления кодирования приблизительно 2 дБ для скорости кодирования R = 4/7.
Затем моделируйте эффективность BLER автоэнкодеров с R = 1 с производительностью незакодированных систем QPSK. Используйте незакодированные (2,2) и (8,8) QPSK в качестве базовых линий. Сравните производительность BLER этих систем с эффективностью (2,2), (4,4) и (8,8) автоэнкодеров.
load uncodedBLERResults.mat qpsk22BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^2; semilogy(simParams.EbNoVec,qpsk22BLERTh,':*') hold on semilogy(simParams.EbNoVec,qpsk88BLER,'--*') qpsk88BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^8; semilogy(simParams.EbNoVec,qpsk88BLERTh,':o') semilogy(simParams.EbNoVec,ae22eBLER,'-o') semilogy(simParams.EbNoVec,ae44eBLER,'-d') semilogy(simParams.EbNoVec,ae88eBLER,'-s') hold off ylim([1e-5 1]) grid on xlabel('E_b/N_o (dB)') ylabel('BLER') legend('Uncoded QPSK (2,2)','Uncoded QPSK (8,8)','Theoretical Uncoded QPSK (8,8)',... 'Autoencoder (2,2)','Autoencoder (4,4)','Autoencoder (8,8)','Location','southwest') title('BLER performance of R=1 Autoencoders')
Вероятность битовой ошибки QPSK одинаковая для обоих (8,8) и (2,2) случаев. Однако BLER зависит от длины блока, , и становится хуже, как увеличивается, как задано . Как ожидалось, эффективность BLER (8,8) QPSK хуже, чем у (2,2) системы QPSK. Эффективность BLER (2,2) автоэнкодера соответствует эффективности BLER (2,2) QPSK. С другой стороны, (4,4) и (8,8) автоэнкодеры оптимизируют канальный кодер и созвездие совместно, получая коэффициент усиления кодирования относительно соответствующих незакодированных систем QPSK.
Обучите (7,4) автоэнкодер с энергетической нормализацией при различных значения и сравнение эффективности BLER.
n = 7; k = 4; normalization = 'Energy'; EbNoVec = 1:3:10; if trainNow for EbNoIdx = 1:length(EbNoVec) EbNo = EbNoVec(EbNoIdx); [txNetVec{EbNoIdx},rxNetVec{EbNoIdx},infoVec{EbNoIdx},trainedNetVec{EbNoIdx}] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo); BLERVec{EbNoIdx} = helperAEWAutoencoderBLER(txNetVec{EbNoIdx},rxNetVec{EbNoIdx},simParams); end else load ae74TrainedEbNo1to10 BLERVec trainParams simParams txNetVec rxNetVec infoVec trainedNetVec EbNoVec end
Постройте график эффективности BLER вместе с теоретической верхней границей для кода Hamming (7,4) с декодированием жесткого решения и моделируемого BLER кода Hamming (7,4) с декодированием максимальной правдоподобности (MLD). Эффективность BLER (7,4) автоэнкодера становится ближе к коду Hamming (7,4) с MLD в качестве обучения уменьшается с 10 дБ до 1 дБ, в эту точку почти совпадает с кодом MLD Hamming (7,4).
berHamming = bercoding(simParams.EbNoVec,'hamming','hard',7); blerHamming = 1-(1-berHamming).^7; load codedBLERResults hammingML74BLER figure semilogy(simParams.EbNoVec,blerHamming,':k') hold on linespec = {'-*','-d','-o','-s',}; for EbNoIdx=length(EbNoVec):-1:1 semilogy(simParams.EbNoVec,BLERVec{EbNoIdx},linespec{EbNoIdx}) end semilogy(simParams.EbNoVec,hammingML74BLER,'--vk') hold off ylim([1e-5 1]) grid on xlabel('E_b/N_o (dB)') ylabel('BLER') legend('(7,4) Hamming HDD Upper','(7,4) AE - Eb/No=10','(7,4) AE - Eb/No=7',... '(7,4) AE - Eb/No=4','(7,4) AE - Eb/No=1','Hamming (7,4) MLD','location','southwest')
Результаты BLER показывают, что автоэнкодеры могут изучать схемы совместного кодирования и модуляции неконтролируемым образом. Возможно даже обучить автоэнкодер с R = 1 для получения усиления кодирования по сравнению с традиционными способами. Пример также показывает эффект гиперпараметров, таких как от эффективности BLER.
Результаты получаются с помощью следующих настроек по умолчанию для обучения и симуляций BLER:
trainParams.Plots = 'none'; trainParams.Verbose = false; trainParams.MaxEpochs = 15; trainParams.InitialLearnRate = 0.01; trainParams.LearnRateSchedule = 'piecewise'; trainParams.LearnRateDropPeriod = 10; trainParams.LearnRateDropFactor = 0.1; trainParams.MiniBatchSize = 20*2^k; simParams.EbNoVec = -2:0.5:8; simParams.MinNumErrors = 100; simParams.MaxNumFrames = 300; simParams.NumSymbolsPerFrame = 10000; simParams.SignalPower = 1;
Измените эти параметры, чтобы обучить различные автоэнкодеры и проверить их эффективность BLER. Экспериментируйте с различными n, k, нормализацией и значения. Для получения дополнительной информации см. справку по helper AEWT rain Wireless Autoencoder.m, helper AEWP repare Autoencoders.mlx и helper AEWA utoencoder BLER. m.
В этом разделе показано содержимое функции helperAEWTrainWirelessAutoencoder. Чтобы открыть исполняемую версию функции в редакторе MATLAB, щелкните helperAEWTrainWirelessAutoencoder.m
type helperAEWTrainWirelessAutoencoder
function [txNet,rxNet,info,trainedNet] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo,varargin) %helperAEWTrainWirelessAutoencoder Train wireless autoencoder % [TX,RX,INFO,AE] = helperAEWTrainWirelessAutoencoder(N,K,NORM,EbNo) % trains an autoencoder, AE, with (N,K), where K is the number of input % bits and N is the number of channel uses. The autoencoder employs NORM % normalization. NORM must be one of 'Energy' and 'Average power'. The % channel is an AWGN channel with Eb/No set to EbNo. TX and Rx are the % encoder and decoder parts of the autoencoder that can be used in the % helperAEWEncoder and helperAEWDecoder functions, respectively. INFO is % the training information that can be used to check the convergence % behavior of the training process. % % [TX,RX,INFO,AE] = helperAEWTrainWirelessAutoencoder(...,TP) provides % training parameters as follows: % TP.Plots: Plots to display during network training defined as one of % 'none' (default) or 'training-progress'. % TP.Verbose: Indicator to display training progress information % defined as 1 (true) (default) or 0 (false). % TP.MaxEpochs: Maximum number of epochs defined as a positive integer. % The default is 15. % TP.InitialLearnRate: Initial learning rate as a floating point number % between 0 and 1. The default is 0.01; % TP.LearnRateSchedule: Learning rate schedule defined as one of % 'piecewise' (default) or 'none'. % TP.LearnRateDropPeriod: Number of epochs for dropping the learning % rate as a positive integer. The default is 10. % TP.LearnRateDropFactor: Factor for dropping the learning rate, % defined as a scalar between 0 and 1. The default is 0.1. % TP.MiniBatchSize: Size of the mini-batch to use for each training % iteration, defined as a positive integer. The default is % 20*M. % % See also AutoencoderForWirelessCommunicationsExample, helperAEWEncode, % helperAEWDecode, helperAEWNormalizationLayer, helperAEWAWGNLayer. % Copyright 2020 The MathWorks, Inc. % Derived parameters M = 2^k; R = k/n; if nargin > 4 trainParams = varargin{1}; else % Set default training options. Set maximum epochs to 15. SGD requires a % representative mini-batch that has enough symbols to achieve % convergence. Therefore, increase the mini-batch size with M. Set the % initial learning rate to 0.01 and reduce the learning rate by a factor % of 10 every 10 epochs. Do not plot or print training progress. trainParams.MaxEpochs = 15; trainParams.MiniBatchSize = 20*M; trainParams.InitialLearnRate = 0.01; trainParams.LearnRateSchedule = 'piecewise'; trainParams.LearnRateDropPeriod = 10; trainParams.LearnRateDropFactor = 0.1; trainParams.Plots = 'none'; trainParams.Verbose = false; end % Convert Eb/No to channel Eb/No values using the code rate EbNoChannel = EbNo + 10*log10(R); % As the number of possible input symbols increase, we need to increase the % number of training symbols to give the network a chance to experience a % large number of possible input combinations. The same is true for number % of validation symbols. numTrainSymbols = 2500 * M; numValidationSymbols = 100 * M; % Define autoencoder network. Input is a one-hot vector of length M. The % encoder has two fully connected layers. The first one has M inputs and M % outputs and is followed by an ReLU layer. The second fully connected % layer has M inputs and n outputs and is followed by the normalization % layer. Normalization layer imposes constraints on the encoder output and % available methods are energy and average power normalization. The encoder % layers are followed by the AWGN channel layer. Set BitsPerSymbol to 2 % since two output values are mapped onto a complex symbol. Set the signal % power to 1 since the normalization layer outputs signals with unity % power. The output of the channel is passed to the decoder layers. The % first decoder layer is a fully connected layer that has n inputs and M % outputs and is followed by an ReLU layer. Second fully connected layer % has M inputs and M outputs and is followed by a softmax layer. The output % of the decoder is chosen as the most probable transmitted symbol from 0 % to M-1. wirelessAutoEncoder = [ featureInputLayer(M,"Name","One-hot input","Normalization","none") fullyConnectedLayer(M,"Name","fc_1") reluLayer("Name","relu_1") fullyConnectedLayer(n,"Name","fc_2") helperAEWNormalizationLayer("Method", normalization) helperAEWAWGNLayer("NoiseMethod","EbNo",... "EbNo",EbNoChannel,... "BitsPerSymbol",2,... "SignalPower",1) fullyConnectedLayer(M,"Name","fc_3") reluLayer("Name","relu_2") fullyConnectedLayer(M,"Name","fc_4") softmaxLayer("Name","softmax") classificationLayer("Name","classoutput")]; % Generate random training data. Create one-hot input vectors and labels. d = randi([0 M-1],numTrainSymbols,1); trainSymbols = zeros(numTrainSymbols,M); trainSymbols(sub2ind([numTrainSymbols, M],... (1:numTrainSymbols)',d+1)) = 1; trainLabels = categorical(d); % Generate random validation data. Create one-hot input vectors and labels. d = randi([0 M-1],numValidationSymbols,1); validationSymbols = zeros(numValidationSymbols,M); validationSymbols(sub2ind([numValidationSymbols, M],... (1:numValidationSymbols)',d+1)) = 1; validationLabels = categorical(d); % Set training options options = trainingOptions('adam', ... 'InitialLearnRate',trainParams.InitialLearnRate, ... 'MaxEpochs',trainParams.MaxEpochs, ... 'MiniBatchSize',trainParams.MiniBatchSize, ... 'Shuffle','every-epoch', ... 'ValidationData',{validationSymbols,validationLabels}, ... 'LearnRateSchedule', trainParams.LearnRateSchedule, ... 'LearnRateDropPeriod', trainParams.LearnRateDropPeriod, ... 'LearnRateDropFactor', trainParams.LearnRateDropFactor, ... 'Plots', trainParams.Plots, ... 'Verbose', trainParams.Verbose); % Train the autoencoder network [trainedNet,info] = trainNetwork(trainSymbols,trainLabels,wirelessAutoEncoder,options); % Separate the network into encoder and decoder parts. Encoder starts with % the input layer and ends after the normalization layer. for idxNorm = 1:length(trainedNet.Layers) if isa(trainedNet.Layers(idxNorm), 'helperAEWNormalizationLayer') break end end lgraph = addLayers(layerGraph(trainedNet.Layers(1:idxNorm)), ... regressionLayer('Name', 'txout')); lgraph = connectLayers(lgraph,'wnorm','txout'); txNet = assembleNetwork(lgraph); % Decoder starts after the channel layer and ends with the classification % layer. Add a feature input layer at the beginning. for idxChan = idxNorm:length(trainedNet.Layers) if isa(trainedNet.Layers(idxChan), 'helperAEWAWGNLayer') break end end firstLayerName = trainedNet.Layers(idxChan+1).Name; n = trainedNet.Layers(idxChan+1).InputSize; lgraph = addLayers(layerGraph(featureInputLayer(n,'Name','rxin')), ... trainedNet.Layers(idxChan+1:end)); lgraph = connectLayers(lgraph,'rxin',firstLayerName); rxNet = assembleNetwork(lgraph);
[1] T. O'Shea and J. Hoydis, «Введение в глубокое обучение для физического слоя», в транзакциях IEEE по когнитивным коммуникациям и сетям, том 3, № 4, стр. 563-575, декабрь 2017, doi: 10.1109/TCCN.2017.2758370.
[2] С. Дернер, С. Кэммерер, Дж. Хойдис и S. t. Край, «Основанная на глубоком обучении Коммуникация По Воздуху», в Журнале IEEE Отобранных Тем в Обработке Сигнала, издании 12, № 1, стр 132-143, февраль 2018, doi: 10.1109/JSTSP.2017.2784180.
classificationLayer
(Deep Learning Toolbox) | featureInputLayer
(Deep Learning Toolbox) | fullyConnectedLayer
(Deep Learning Toolbox) | reluLayer
(Deep Learning Toolbox) | softmaxLayer
(Deep Learning Toolbox)