發表文章

目前顯示的是 11月, 2023的文章

原來CNN也能運用於NLP中

圖片
  當提及CNN一般普遍都會直覺聯想到在電腦視覺方面的應用。 而近幾年CNN也踏入自然語言處理,也有相當好的成績。 https://www.analyticsvidhya.com/blog/2022/03/basics-of-cnn-in-deep-learning/ 通常CNN要處裡應用於NLP的任務,往往需要以矩陣形式表達句子或文本。 (PS:因為CNN你要餵進去的格式要是矩陣) 矩陣中每一行對應一個分詞元素,通常會是一個單詞或是一個字符。 換言之,每一行都是一個詞或者字符的向量(比方word2vec) 假設共有10個詞,每個詞都用128維的vector表示,那就可得到一個10*128維度的矩陣。 如此一來這個矩陣就有點像是一幅影像。 Embedding層:一個7x5的矩陣,其中每row(橫列)是一個單詞的向量,即詞向量,詞向量的維度為5。(這邊用比較低的維度for好舉利用,通常可能用到128,256就會有128或256直行。) Convolution層:這里是一維卷積,卷積核寬度固定:即為詞向量維度(都是5個直行),卷積核的高度即一個窗口中包含的單詞的個數,這里的kernel_size=(2,3,4)即為一個窗口中分別可以包含2,3,4個單詞。然後每個kernel_size輸出2個通道,實際上是每類(包含單詞個數)卷積核的個數為2而已,再將卷積輸出的結果經過激活函數輸出 MaxPooling層(池化):每類卷積核輸出兩個通道,然後再取各個通道結果的最大值(MaxPooling),於是就得到了6個值。 FullConnection層:將MaxPooling層的輸出結果進行拼接構成一個全連接層的輸入,然後再根據分類類別數接上一個softmax層就可以得到分類結果了。 Ref: CNN在NLP的应用--文本分类 https://yxzf.github.io/2017/03/cnn-for-nlp-in-sentence-classification/ Convolutional Neural Network in Natural Language Processing https://towardsdatascience.com/convolutional-neural-network-in-natural-language-processing-96d67f912

深入研究_Word2Vec兩種模型(CBOW , Skip-Gram)

圖片
 Word2Vec(詞向量) https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/ 一般在分析影像或語音普遍都是針對密集且高維度的資料集,比方RGB三通道,聲音波型。 所有需要的資訊都存儲於raw data中,可能是一維或者二維的。 而換作在自然語言問題處理方面,會先進行分詞,給每一個詞一個編號,比方 '貓' 的編號是120 , '狗'則是340等等。 比方 '女生' 的編號是1230, '女王'的編號是 2329。 而這些編號並沒有規律,更相互無關連。 我們無法從編號中得到詞和詞之間的相關性,此外詞資料十分稀疏並不密集。 比方以下這句 How are you ? How : 234 Are:  7 you : 987 因此Google 在2013 年由 Tomas Mikolov 等人有提出了一個研究論文 Efficient Estimation of Word Representations in Vector Space 介紹到關於word2vector的核心思想,可將一個詞轉為向量形式來表達。 比方以下向量幾乎平行距離又很相近,相近詞就較鄰近。 國家和首都 詞性相近詞距離較近(現在進行式和過去式) 兩種模型(CBOW , Skip-Gram) 連續詞袋模型(CBOW, Continuous bag-of-word Model) 根據詞的上下文詞彙來預測目標詞彙,例如上下文詞彙是"今天早餐吃..." 要預測的目標詞彙就可能是 "蛋餅"、"漢堡"、"燒餅油條"之類的。 Skip-Gram模型 剛好和CBOW相反過來,其透過目標詞彙來預測上下文。 比方目標詞彙是 "早餐" 則其上下文就有可能出現 "今天" 或是有 "吃麵包" 等等。 https://medium.com/%E6%89%8B%E5%AF%AB%E7%AD%86%E8%A8%98/%E4%BD%BF%E7%94%A8-tensorflow-%E5%AD%B8%E7%BF%92-softmax-%E5%

影像壓縮DCT_IDCT

圖片
靜態影像壓縮技術(分如下兩種) 無失真壓縮(Information Lossless):採用差值訊號編碼(DPCM , Differential PCM) 通常壓縮不到10倍,比方:TIFF 用於醫學影像,不可能用失真壓縮(會出人命)。 失真壓縮(Information Loss):採用離散餘弦轉換(DCT , Discrete Cosine Transform) 壓縮率極高,壓縮大概30倍但仍可獲得高品質,通常應用於網頁應用圖片呈現。 比方: JPEG 「JPEG標準」 是由「聯合攝影專家組」開發的損失式圖像壓縮標準,於1992年被正式接受為國際標準,採用基於DCT(離散餘弦變換)的變換編碼方法。 在JPEG壓縮中,圖像被視為在空間域中的i和j(或傳統上的x和y)的函數。 JPEG使用2D DCT作為壓縮過程中的一個步驟,以產生空間頻率域中的頻率響應,這個響應是由兩個整數u和v索引的函數F(u v)。 JPEG的DCT轉換編碼方法的有效性 基於三個層面來觀察會被推廣和使用如此成熟的原因 1.有用的圖像內容變化相對較慢:例如,在8×8的圖像塊內,像素強度值的變化通常不會出現快速且頻繁的變化,這表示圖像中存在「空間冗餘」。 2.人類對高空間頻率組件的損失不太敏感:心理物理學實驗表明,人們對於非常高空間頻率成分的損失不如低頻成分那麼容易察覺。因此,可以通過大幅減少高空間頻率成分來減少空間冗餘。 3.對於灰度(黑白)比彩色的視覺敏感度更高:因此,JPEG使用色度子採樣(4:2:0)。 JPEG壓縮流程 Step1.將圖像轉換為YIQ或YUV格式。 Step2.進行DCT變換。 Step3.量化DCT變換後的結果。 Step4.在量化後,圖像數據通過編碼表和熵編碼進行進一步處理。 主要流程圖如下 JPEG圖像壓縮的主要步驟 將RGB轉換為YIQ或YUV格式,並進行色彩子採樣。 對影像塊進行DCT(離散餘弦變換)。 將每個圖像分割成8×8的塊,對每個塊進行2D DCT,輸出為每個塊的DCT係數F(u v)。 使用塊的方法會使得每個塊與其鄰近上下文隔離,這就是為什麼當用戶指定高壓縮比時,JPEG圖像看起來會有“塊狀”(choppy)現象。 量化過程(量化公式如下) -> 量化步驟是JPEG壓縮中主要的損失來源。 F(u v)代表DCT係數,Q(u v)是量化矩陣的條目,

量化誤差信號的直方圖(Plot histogram of error signals)_自相關及交叉相關(Autocorrelation and Cross-correlation)

圖片
量化誤差(error signals) 量化誤差是指原始信號與量化信號之間的差異 對於給定的位元/樣本數(7、4、2 和 1),計算原始語音信號和量化後語音信號之間的差異。 針對指定的bits數陣列進行尋訪,垂直呈現量化誤差直方圖。 延續使用之前自定義的量化函數 UquantAudio 對信號進行量化 量化誤差程式碼 % 讀取原始語音信號 [speech, Fs_speech] = audioread( 'speech.au' ); % 設定量化的位元/樣本 bits = [ 7 , 4 , 2 , 1 ]; % 創建一個新圖形來繪製直方圖 figure; orient tall; % 計算並繪製每個量化誤差信號的直方圖 for i = 1 : length (bits) % 量化語音信號 quantized_speech = UquantAudio(speech, 2 ^bits( i )); % 計算誤差 error_signal = speech - quantized_speech; % 使用 subplot 在同一圖形中繪製直方圖 subplot( 4 , 1 , i ); hist(error_signal, 20 ); title([ '誤差直方圖 - ' , num2str(bits( i )), ' 位元/樣本' ]); end % 保存直方圖圖片 saveas(gcf, 'error_histograms.png' ); 從顯示圖可觀察到,當量化級別較少時(如1位元/樣本),誤差分布可能會更廣泛,顯示出更大的誤差範圍。 7位元量化誤差直方圖: 顯示了當信號被量化到128個可能的級別時(2的7次方)的誤差分布。 誤差值範圍較小,分布相對均勻,這表明在高量化級別下誤差較小且分布平均。 4位元量化誤差直方圖: 當信號被量化到16個級別(2的4次方)時的誤差分布更為集中。 誤差的絕對值增加了,這是因為隨著量化級別的減少,可能的誤差範圍擴大了。 2位元量化誤差直方圖: 在僅僅只有4個級別(2的2次方)下誤差分布非常極端。 大多數誤差集中在四個明顯的峰值附近,這些峰值對應於可用量化級別之

asp.net core 6網站藉由Serilog上線添加只有在發生error跟例外的txt log檔並限制只保留2天以內的

圖片
  ~\Program.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 using BingoSys.Data ; using BingoSys.Hubs ; using BingoSys.Services ; using Microsoft.AspNetCore.Identity ; using Microsoft.AspNetCore.Identity.UI.Services ; using Microsoft.EntityFrameworkCore ; using Serilog ; using Serilog.Events ; using System.Text.Encodings.Web ; using System.Text.Unicode ; var builder = WebApplication.CreateBuilder(args); // 初始化 Serilog,名稱像是 myapp_20231029.txt,定時只保留最近3天的日誌檔案 Log.Logger = new LoggerConfiguration() .MinimumLevel.Override( "Microsoft" , LogEventLevel.Warning) // 過濾 Microsoft 日誌 .MinimumLevel.Override( "Microsoft.EntityFrameworkCore" , LogEventLevel.Error) // 只有在出現錯誤時才記錄 EF Core 的日誌 .WriteTo.File( "logs/myapp_.txt" , rollingInterval: Rolling

3-4.Audio Quantization

圖片
在Matlab版本分水嶺較新版本(R2012以後) 讀取聲音檔的API都用audioread,早期版本用wavread。 audioread( 'speech.au' ) 通常可支援的音訊檔格式如下 Platform Support File Format All platforms AIFC ( .aifc ) AIFF ( .aiff ,  .aif ) AU ( .au ) FLAC ( .flac ) OGG ( .ogg ) OPUS ( .opus ) WAVE ( .wav ) Windows ®  7  (or later),  Macintosh , and Linux ® MP3 ( .mp3 ) MPEG-4 AAC ( .m4a ,  .mp4 ) https://www.mathworks.com/help/matlab/ref/audioread.html 此函數的對應輸出有兩個 1.取樣點: 音頻的矩陣型態,單聲道還是有左右兩聲道。 2.取樣頻率:8K , 16K....Hz 因此需用以下語法來承接對應輸出的變數結果 [y,Fs] = audioread(filename) 第一階段.讀音檔程式 要確保你兩個音檔在當前matlab運行的所在目錄下 % 讀取音頻檔案 [speech, Fs_speech] = audioread( 'speech.au' ); [music, Fs_music] = audioread( 'music.au' ); 效果(對應輸出) 可以見到以下兩個音檔各自的矩陣型態是double 都是8k hz的取樣頻率 speech.au 是 23759x1的維度 music.au  是 82543x1的維度 這裡可打開workspace中的變數監看式查看 取樣點值域位於-1~+1之間 讀取進來後若想播放出來聽看看怎麼辦? 可藉由sound的函數來傳入剛剛兩個參數即可 第二階段.將讀進來的音檔進行可視化plot呈現 % 讀取音頻檔案 [speech, Fs_speech] = audioread( 'speech.au' ); [music, Fs_music] = audioread( 'music.au' ); %sound(