Python從0到100(八十七):CNN網絡詳細介紹及WISDM數據集模型仿真

在這里插入圖片描述

前言: 零基礎學Python:Python從0到100最新最全教程。 想做這件事情很久了,這次我更新了自己所寫過的所有博客,匯集成了Python從0到100,共一百節課,幫助大家一個月時間里從零基礎到學習Python基礎語法、Python爬蟲、Web開發、 計算機視覺、機器學習、神經網絡以及人工智能相關知識,成為學習學習和學業的先行者!
歡迎大家訂閱專欄:零基礎學Python:Python從0到100最新最全教程!

本文目錄:

  • 一、WISDM數據集分析及介紹
  • 二、CNN網絡結構及介紹
    • 1. CNN的核心組件
      • 1.1 卷積層(Convolutional Layer)
      • 1.2 池化層(Pooling Layer)
      • 1.3 激活函數層(Activation Layer)
      • 1.4 全連接層(Fully Connected Layer)
    • 2. CNN的層次化特征提取
    • 3. CNN的變體與擴展
      • 3.1 深度可分離卷積(Depthwise Separable Convolution)
      • 3.2 空洞卷積(Dilated Convolution)
      • 3.3 注意力機制(Attention Mechanism)
    • 4. CNN在時間序列數據中的應用
      • 4.1 1D卷積
      • 4.2 時序池化
      • 4.3 混合架構
    • 5. CNN的優化策略
      • 5.1 正則化方法
      • 5.2 學習率調整
    • 6. 典型CNN架構示例
  • 三、WISDM數據集分割及處理
  • 四、CNN網絡訓練WISDM數據集
    • 1.常用的仿真指標
      • 1.1 準確率 (Accuracy)
      • 1.2 精確率 (Precision)
      • 1.3 召回率 (Recall)
      • 1.4 F1分數 (F1-Score)
      • 1.5 參數量 (Parameters)
      • 1.6 推理時間 (Inference Time)
    • 2.具體的訓練過程
      • 1.數據集加載
      • 2.模型實例化
      • 3.創建數據加載器
      • 4.優化器和學習率調度器設置
      • 5.混合精度訓練設置
      • 6.訓練循環
    • 3.結果展示
  • 五、可視化維度分析
    • 1.混淆矩陣圖
    • 2.雷達圖
    • 3.準確率和損失率的收斂曲線圖
    • 4.仿真指標柱狀圖
    • 5.仿真指標折線圖
  • 六、總結

卷積神經網絡(CNN)因其強大的特征提取能力和深度學習架構而備受推崇,CNN在處理圖像數據時展現出的卓越性能,使其成為解決各種視覺識別任務的首選工具。WISDM數據集是一個廣泛用于運動估計研究的基準數據集,它包含了多個視頻序列,每個序列都記錄了攝像頭在不同方向上移動時捕捉到的圖像。在本研究中,我們將探討如何利用 CNN來訓練和優化WISDM數據集,以提高運動估計的準確性和魯棒性。

一、WISDM數據集分析及介紹

WISDM數據集是一個用于人類活動識別(Human Activity Recognition, HAR)的公共數據集。它包含了從智能手機和智能手表收集的傳感器數據,這些數據被用來識別多種不同的人類活動:

  1. 數據集來源與構成

    • WISDM數據集由福特漢姆大學計算機與信息科學系的Gary Weiss博士領導的團隊創建。
    • 數據集包含了51名參與者進行的18種不同的活動,每種活動的數據都是通過佩戴在身體不同部位的智能手機和智能手表上的加速度計和陀螺儀以20Hz的頻率收集得到的。
  2. 數據集特點

    • 數據集中的活動包括但不限于走路、跑步、上下樓梯、坐、站等。
    • 每個活動的數據長度為3分鐘,為研究者提供了充足的時間序列數據進行分析。
  3. 數據集的應用

    • WISDM數據集適用于開發和測試各種HAR模型,尤其是基于深度學習的模型,如卷積神經網絡(CNN)。

二、CNN網絡結構及介紹

卷積神經網絡是一種專門用來處理具有類似網格結構的數據的神經網絡,如圖像。CNN在圖像識別、視頻分析和自然語言處理等領域取得了巨大的成功。

1. CNN的核心組件

1.1 卷積層(Convolutional Layer)

  • 功能:通過卷積核(filter)在輸入數據上滑動,提取局部特征。
  • 數學表示
    ( I ? K ) ( i , j ) = ∑ m ∑ n I ( i ? m , j ? n ) ? K ( m , n ) (I * K)(i,j) = \sum_{m}\sum_{n} I(i-m, j-n) \cdot K(m,n) (I?K)(i,j)=m?n?I(i?m,j?n)?K(m,n)
    其中, I I I為輸入, K K K為卷積核。
  • 參數
    • 卷積核大小(kernel size):通常為3×3或5×5
    • 步幅(stride):控制滑動步長
    • 填充(padding):保持特征圖尺寸

1.2 池化層(Pooling Layer)

  • 功能:對特征圖進行下采樣,降低計算復雜度,增強特征不變性。
  • 類型
    • 最大池化(Max Pooling):取局部區域最大值
    • 平均池化(Average Pooling):取局部區域平均值
  • 參數
    • 池化窗口大小:通常為2×2
    • 步幅:通常與窗口大小一致

1.3 激活函數層(Activation Layer)

  • 功能:引入非線性,增強模型的表達能力。
  • 常用激活函數
    • ReLU(Rectified Linear Unit): f ( x ) = max ? ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
    • Leaky ReLU: f ( x ) = max ? ( 0.01 x , x ) f(x) = \max(0.01x, x) f(x)=max(0.01x,x)
    • Swish: f ( x ) = x ? σ ( x ) f(x) = x \cdot \sigma(x) f(x)=x?σ(x),其中 σ \sigma σ為sigmoid函數

1.4 全連接層(Fully Connected Layer)

  • 功能:將提取的特征映射到輸出空間(如分類概率)。
  • 特點
    • 參數量較大
    • 通常位于網絡末端

2. CNN的層次化特征提取

CNN通過多層卷積和池化操作,逐步提取從低級到高級的特征:

  1. 低級特征:邊緣、角點、紋理等
  2. 中級特征:局部形狀、簡單模式
  3. 高級特征:語義信息、復雜結構

3. CNN的變體與擴展

3.1 深度可分離卷積(Depthwise Separable Convolution)

  • 結構
    • 深度卷積(Depthwise Convolution):每個輸入通道單獨卷積
    • 逐點卷積(Pointwise Convolution):1×1卷積融合通道信息
  • 優點
    • 顯著減少參數量和計算量
    • 公式: 1 N + 1 D k 2 \frac{1}{N} + \frac{1}{D_k^2} N1?+Dk2?1? N N N為輸出通道數, D k D_k Dk?為卷積核大小)

3.2 空洞卷積(Dilated Convolution)

  • 特點
    • 通過增加卷積核采樣間隔,擴大感受野
    • 公式: F d i l a t e d ( i , j ) = ∑ m ∑ n I ( i + r ? m , j + r ? n ) ? K ( m , n ) F_{dilated}(i,j) = \sum_{m}\sum_{n} I(i+r\cdot m, j+r\cdot n) \cdot K(m,n) Fdilated?(i,j)=m?n?I(i+r?m,j+r?n)?K(m,n)
    • 其中, r r r為空洞率

3.3 注意力機制(Attention Mechanism)

  • 作用
    • 動態調整特征權重
    • 增強重要特征的表達能力
  • 常見形式
    • 通道注意力(SENet)
    • 空間注意力(CBAM)

4. CNN在時間序列數據中的應用

4.1 1D卷積

  • 特點
    • 卷積核沿時間維度滑動
    • 適用于傳感器數據、語音信號等
  • 示例
    tf.keras.layers.Conv1D(filters=64, kernel_size=3, strides=1, padding='same')
    

4.2 時序池化

  • 方法
    • 全局平均池化(Global Average Pooling)
    • 自適應最大池化(Adaptive Max Pooling)

4.3 混合架構

  • CNN-LSTM
    • CNN提取局部特征
    • LSTM捕捉時序依賴
  • CNN-Transformer
    • CNN提取空間特征
    • Transformer建模長時依賴

5. CNN的優化策略

5.1 正則化方法

  • Dropout:隨機丟棄神經元,防止過擬合
  • Batch Normalization:標準化層輸入,加速訓練
  • 權重衰減(L2正則化):約束權重幅度

5.2 學習率調整

  • 策略
    • 學習率衰減(Learning Rate Decay)
    • 余弦退火(Cosine Annealing)
    • 預熱(Warmup)

6. 典型CNN架構示例

def cnn(input_shape, num_classes):inputs = tf.keras.Input(shape=input_shape)# 卷積模塊x = tf.keras.layers.Conv1D(64, 5, padding='same', activation='relu')(inputs)x = tf.keras.layers.MaxPooling1D(2)(x)x = tf.keras.layers.Conv1D(128, 3, padding='same', activation='relu')(x)x = tf.keras.layers.GlobalAveragePooling1D()(x)# 分類頭x = tf.keras.layers.Dense(128, activation='relu')(x)outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)return tf.keras.Model(inputs, outputs)

三、WISDM數據集分割及處理

WISDM數據集下載鏈接:https://www.cis.fordham.edu/wisdm/includes/datasets/latest/WISDM_ar_latest.tar.gz

加載、預處理和準備WISDM數據集,以便用于人類活動識別(HAR)任務:

  1. 參數設定
    • dataset_dir: 指定原始數據存放的目錄。
    • WINDOW_SIZE: 定義滑窗的大小。
    • OVERLAP_RATE: 定義滑窗的重疊率。
    • SPLIT_RATE: 定義訓練集和驗證集的分割比例。
    • VALIDATION_SUBJECTS: 定義留一法驗證時使用的特定主題(subject)集合。
    • Z_SCORE: 決定是否進行標準化處理。
    • SAVE_PATH: 定義預處理后數據保存的路徑。
def WISDM(dataset_dir='./WISDM_ar_v1.1', WINDOW_SIZE=200, OVERLAP_RATE=0.5, SPLIT_RATE=(8, 2), VALIDATION_SUBJECTS={}, Z_SCORE=True, SAVE_PATH=os.path.abspath('D:/PycharmProjects/xyp-task')):
  1. 數據集下載
  • 使用download_dataset函數,從福特漢姆大學提供的URL下載WISDM數據集,并將其存儲在dataset_dir指定的目錄中。
download_dataset(dataset_name='WISDM',file_url='https://www.cis.fordham.edu/wisdm/includes/datasets/latest/WISDM_ar_latest.tar.gz', dataset_dir=dataset_dir
)
  1. 數據清洗與讀取
  • 從指定路徑的文本文件中讀取原始數據,該文件包含了多個以逗號分隔的條目。
  • 清洗數據,移除不完整的條目,確保每行數據都包含參與者ID、活動標簽和三個傳感器信號。
  • 將清洗后的數據轉換為NumPy數組,便于后續處理。
  1. 標簽編碼
  • 使用category_dict字典,將活動標簽的字符串表示(如’Walking’、'Jogging’等)映射為整數ID,以便于機器學習模型處理。
  1. 滑窗處理
  • 對清洗并編碼后的數據應用滑窗分割,生成固定大小的樣本窗口。這些窗口將用于訓練和測試機器學習模型。
  1. 分割數據集
  • 根據是否提供了VALIDATION_SUBJECTS,選擇留一法或平均法來分割數據集。留一法是為每個參與者ID分別創建訓練集和測試集,而平均法則是按照SPLIT_RATE比例分割數據。
  1. 數據整合
  • 將分割后的數據和標簽分別整合到xtrainxtestytrainytest列表中,這些列表將包含所有訓練和測試數據。
  1. 標準化處理
  • 如果Z_SCORE參數為True,則對整合后的xtrainxtest進行Z分數標準化處理,以消除不同傳感器信號量級的影響。
  1. 數據保存
  • 如果提供了SAVE_PATH,則使用save_npy_data函數將預處理后的訓練集和測試集數據保存為.npy格式的文件,這有助于后續加載和使用數據。

準備WISDM數據集,使其適合用于CNN網絡模型的訓練和測試。通過滑窗處理,可以將原始的長時間序列傳感器數據轉換為固定大小的短時間序列數據,這有助于訓練卷積神經網絡等模型進行人類活動識別。此外,通過留一法或平均法分割數據集,可以為模型提供訓練集和驗證集,以評估模型性能。最后,通過Z分數標準化,可以提高模型對數據分布變化的魯棒性。

四、CNN網絡訓練WISDM數據集

1.常用的仿真指標

1.1 準確率 (Accuracy)

準確率是所有正確預測樣本數占總樣本數的比例。它是最直觀的性能指標,計算公式如下:

image.png

1.2 精確率 (Precision)

精確率是所有預測為正類中真正為正類的比例,它關注的是預測為正類的結果的準確性。計算公式如下:

image.png

1.3 召回率 (Recall)

召回率是所有實際為正類中被正確預測為正類的比例,它衡量的是模型捕捉正類樣本的能力。計算公式如下:

image.png

1.4 F1分數 (F1-Score)

F1分數是精確率和召回率的調和平均值,它在兩者之間取得平衡,是評價分類模型性能的一個重要指標。計算公式如下:

image.png

1.5 參數量 (Parameters)

參數量指的是網絡模型中需要訓練的參數總數。參數量越多,模型的容量越大,但也越容易過擬合。

1.6 推理時間 (Inference Time)

推理時間指的是模型對數據進行預測的時間。它可以是單個樣本的推理時間,也可以是整個數據集推理所需的總時間。推理時間是評估模型在實際應用中效率的重要指標,尤其是在需要實時響應的應用場景中。

2.具體的訓練過程

image.png

1.數據集加載

根據選擇的數據集和模型,加載數據集,并進行必要的預處理。

2.模型實例化

根據選擇的模型,實例化一個模型對象,并將其移動到選定的設備上。

3.創建數據加載器

使用DataLoader創建訓練和測試數據的加載器,允許在訓練中以小批量方式加載數據。

4.優化器和學習率調度器設置

定義了AdamW優化器和學習率調度器,用于在訓練過程中更新模型參數和調整學習率。

5.混合精度訓練設置

實例化GradScaler對象,用于在訓練中使用混合精度,可以提高訓練效率和精度。

6.訓練循環

對于每個訓練輪次,執行以下步驟:

  • 設置模型為訓練模式。
  • 在每個小批量數據上執行前向傳播、計算損失、執行反向傳播并更新模型參數。
  • 學習率調度器步進。
  • 設置模型為評估模式。
  • 在測試集上進行預測,并計算模型的準確率、精確率、召回率和F1分數。
  • 打印每個輪次的訓練損失、測試準確率和其他評估指標。
for i in range(EP):net.train()inference_start_time = time.time()for data, label in train_loader:data, label = data.to(device), label.to(device)# 前向過程(model + loss)開啟 autocast,混合精度訓練with autocast():out = net(data)loss = loss_fn(out, label)optimizer.zero_grad()  # 梯度清零scaler.scale(loss).backward()  # 梯度放大scaler.step(optimizer)  # unscale梯度值scaler.update()lr_sch.step()

3.結果展示

在每個訓練輪次結束時,打印出當前輪次的訓練信息和模型評估指標。

image.png
從訓練結果中可以看出,基于CNN網絡訓練得到的以上六種指標數據分別為:

CNN0.97290.97340.97290.97325283900.0008 0.7563

五、可視化維度分析

將CNN網絡訓練WISDM數據集的結果進行可視化維度分析:

image.png

1.混淆矩陣圖

混淆矩陣是一個N×N的矩陣,N代表的是你的分類標簽個數。混淆矩陣的橫縱坐標軸分別為模型預測值和真實值,在圖中縱軸是真實值而橫軸代表模型預測值。

image.png

2.雷達圖

雷達圖可以反映多個行為的某個指標值映射在坐標軸上,可以更直觀的觀察出每個行為的指標值大小。

image.png

3.準確率和損失率的收斂曲線圖

準確率和損失率的收斂曲線圖橫坐標是訓練輪次,縱坐標是模型的準確率以及損失率,這個圖可以直觀的看出你的模型在訓練以及測試過程中的準確率和損失率走向和模型收斂以后的準確率的數值范圍,也可以反映出你的模型在訓練過程中是否穩定。

image.png

4.仿真指標柱狀圖

仿真指標柱狀圖是一種以長方形的長度為變量來表示各個行為的指標值,例如可以表示你的模型在WISDM數據集中的每個行為精確率的值,通過由一系列高度不等的縱向條紋表示數據分布的情況。

image.png

5.仿真指標折線圖

仿真指標折線圖是一種用來表示超參數設置大小對模型效果影響的可視化方式,可以表示我們的CNN網絡模型在WISDM數據集中Batch size對加權F1分數的影響。

image.png

六、總結

在本研究中,我們深入探討了卷積神經網絡(CNN)在處理WISDM數據集時的應用,該數據集是一個用于人類活動識別(HAR)的公共數據集。通過一系列數據處理步驟,我們將原始的長時間序列傳感器數據轉換為適合CNN模型訓練的固定大小的短時間序列數據。此外,我們還介紹了CNN的核心思想、優點、缺點以及基本的網絡結構,并通過可視化方法對訓練結果進行了全面的分析。
通過本研究,我們證明了CNN在處理時間序列數據和人類活動識別任務中的有效性。未來的工作可以探索更先進的網絡結構和訓練策略,以進一步提高模型的性能和應用范圍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67891.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ Primer 迭代器

歡迎閱讀我的 【CPrimer】專欄 專欄簡介:本專欄主要面向C初學者,解釋C的一些基本概念和基礎語言特性,涉及C標準庫的用法,面向對象特性,泛型特性高級用法。通過使用標準庫中定義的抽象設施,使你更加適應高級…

【C++篇】位圖與布隆過濾器

目錄 一,位圖 1.1,位圖的概念 1.2,位圖的設計與實現 1.5,位圖的應用舉例 1.4,位圖常用應用場景 二,布隆過濾器 2.1,定義: 2.2,布隆過濾器的實現 2.3, 應…

VR觸感數據手套:觸感反饋賦予虛擬交互沉浸式體驗

隨著動作捕捉技術的蓬勃發展,動捕數據手套成為了手部動作捕捉與虛擬交互的便捷工具,為人們打開了通往虛擬世界的新大門。在眾多產品中,mHand Pro作為一款多功能兼具的VR動作捕捉數據手套,憑借其卓越的性能,在手部動作捕…

C# 結構體介紹

.NET學習資料 .NET學習資料 .NET學習資料 一、結構體的定義與基本使用 (一)定義結構體 在 C# 中,使用struct關鍵字來創建結構體。它就像是一個模板,能定義出符合特定需求的數據結構。比如,若要跟蹤圖書館中書的信息…

圖像噪聲處理技術:讓圖像更清晰的藝術

在這個數字化時代,圖像作為信息傳遞的重要載體,其質量直接影響著我們的視覺體驗和信息解讀。然而,在圖像采集、傳輸或處理過程中,難免會遇到各種噪聲干擾,如高斯噪聲、椒鹽噪聲等,這些噪聲會降低圖像的清晰…

追逐低空經濟,無人機研學技術詳解

追逐低空經濟,無人機研學技術成為了一個備受關注的領域。以下是對無人機研學技術的詳細解析: 一、無人機研學技術概述 無人機研學技術是以無人機為核心,結合航空科技、電子技術、機械原理等多領域知識的一種教育實踐活動。它旨在通過理論學習…

(done) MIT6.S081 2023 學習筆記 (Day7: LAB6 Multithreading)

網頁:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任務1教會了你如何用 C 語言調用匯編,編譯后鏈接即可) 任務1:Uthread: switching between threads (完成) 在這個練習中,你將設計一個用戶級線程系統中的上下文切…

Kubernetes學習之通過Service訪問Pod

一、基礎概述 1.當通過deployment等controller動態創建和銷毀pod使得每個pod都有自己的ip地址,當controller用新的pod替代發生故障的pod時,新的pod會分配到新的ip地址,那么客戶端如何穩定的找到并訪問pod提供的服務。 2.創建service service從…

【優先算法】專題——前綴和

目錄 一、【模版】前綴和 參考代碼: 二、【模版】 二維前綴和 參考代碼: 三、尋找數組的中心下標 參考代碼: 四、除自身以外數組的乘積 參考代碼: 五、和為K的子數組 參考代碼: 六、和可被K整除的子數組 參…

CDDIS從2025年2月開始數據遷移

CDDIS 將從 2025 年 2 月開始將我們的網站從 cddis.nasa.gov 遷移到 earthdata.nasa.gov,并于 2025 年 6 月結束。 期間可能對GAMIT聯網數據下載造成影響。

谷歌Titans模型論文解析,Transformer迎來變革拐點——DeepSeek能否“接招”?

一、引入 Titans 模型 我們將深入探討谷歌研究院的一篇新論文《Titans: Learning to Memorize at Test Time》,該論文介紹了一種名為 Titans 的新模型架構。 Titans 在緩解 Transformer 二次方成本問題的同時,展現出了令人期待的成果。Titans 模型的設…

新春賀歲,共赴AGI之旅

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入! 往期精彩文章推薦 季姮教授獨家文字版干貨 | 面向知識淵博的大語言模型 關于AI TIME AI TIME源起于2019年,旨在發揚科學思辨精神,邀請各界人士對人工智能理論、算法和場景應用的本質問題…

Baklib推動數字化內容管理解決方案助力企業數字化轉型

內容概要 在當今信息爆炸的時代,數字化內容管理成為企業提升效率和競爭力的關鍵。企業在面對大量數據時,如何高效地存儲、分類與檢索信息,直接關系到其經營的成敗。數字化內容管理不僅限于簡單的文檔存儲,更是整合了文檔、圖像、…

【memgpt】letta 課程4:基于latta框架構建MemGpt代理并與之交互

Lab 3: Building Agents with memory 基于latta框架構建MemGpt代理并與之交互理解代理狀態,例如作為系統提示符、工具和agent的內存查看和編輯代理存檔內存MemGPT 代理是有狀態的 agents的設計思路 每個步驟都要定義代理行為 Letta agents persist information over time and…

測試方案和測試計劃相同點和不同點

在軟件測試領域,測試方案與測試計劃皆為舉足輕重的關鍵文檔,盡管它們有著緊密的關聯,但在目的與內容層面存在著顯著的差異。相同點: 1.共同目標:測試方案和測試計劃的核心目標高度一致,均致力于保障軟件的…

詳細介紹:網站背景更換功能

目錄 1. HTML 部分 2. JavaScript 部分 3. 完整流程 4. 總結 5. 適用場景 本文將介紹如何通過文件上傳實現網站背景圖片的更換。通過使用 JavaScript 和 Axios,我們可以允許用戶上傳圖片文件并將其作為網站的背景圖片。上傳的圖片 URL 會保存在瀏覽器的 localSt…

嵌入原則:數據特征如何 融入 模型的 損失地形

嵌入原則:數據特征如何 融入 模型的 損失地形 第一節:嵌入原則的基本概念與公式解釋 機器學習中的嵌入原則,就像 “雕刻師” 將 “石塊的紋理” 逐漸融入到 “雕塑的造型” 中。數據特征不再是獨立的輸入,而是被模型 “吸收” 和…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中調用的IP核,新建文件PLL_test.v 2、代碼如圖 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…

【C++】P5734 【深基6.例6】文字處理軟件

博客主頁: [小????????] 本文專欄: C 文章目錄 💯前言💯題目描述💯題目描述輸入格式輸出格式示例輸入與輸出輸入:輸出: 💯我的做法操作1:在文檔末尾插入字符串操作2&…

后盾人JS -- 原型

沒有原型的對象 也有沒有原型的對象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…