宏FUSION_MAKE使用范例的测试程序

445 篇文章 ¥29.90 ¥99.00
本文提供了一个使用宏FUSION_MAKE的测试程序,解释了如何利用该宏简化代码编写和维护。通过宏定义,可以为类生成构造函数,减少重复代码,提高代码可读性和可维护性。示例中,宏被用于创建一个类,自动初始化其成员变量。

宏FUSION_MAKE使用范例的测试程序

以下是一个使用宏FUSION_MAKE的测试程序,展示了该宏的基本用法和示例代码。宏FUSION_MAKE是一种在编程中常用的技术,用于创建宏定义和代码生成。通过使用该宏,我们可以在编译时生成一些重复性的代码,从而简化代码的编写和维护工作。

#include <iostream>
#include <string>

// 定义宏FUSION_MAKE
#define FUS
<think> 我們有一個簡單的dlnetwork,它只有一個輸入層。輸入層的輸入大小是fusion_weight的大小,即[1 1 1](這是一個1x1x1的圖像,表示一個通道,高度為1,寬度為1)。 我們需要將數據輸入到這個網路中。在Matlab中,對於dlnetwork,我們使用dlarray來表示數據,並且需要確保數據的格式是'SSCB'(空間,空間,通道,批次)或者根據網路的要求。 步驟: 1. 創建一個輸入數據,其大小應匹配網路的輸入層。這裡輸入層要求大小為[1,1,1](高度,寬度,通道數)。 2. 將輸入數據轉換為dlarray,並指定數據格式。因為我們的輸入是1x1x1,所以格式應該是'SSC'(即三個維度:空間、空間、通道)。如果有多個樣本,則應為'SSCB',其中B是批次大小。 3. 使用predict函數來進行前向傳播(如果我們只是想要輸出)或者使用forward函數(如果我們需要中間值,但注意forward不會計算梯度)。 注意:由於我們的網路只有一個輸入層,所以輸出應該就是輸入(因為輸入層只是進行歸一化,這裡我們設置了'rescale-zero-one',它會將輸入從[0,1]線性映射到[-1,1]?或者保持?實際上,'rescale-zero-one'會將輸入從[min,max]重新縮放到[0,1],但我們這裡設置了'rescale-zero-one',它會將輸入重新縮放到[0,1]範圍?實際上,根據文檔,imageInputLayer的Normalization選項為'rescale-zero-one'時,會將輸入從[0,1]重新縮放到[-1,1]?不,實際上: - 如果設置為'rescale-zero-one',則將輸入重新縮放到[0,1]範圍。 - 如果設置為'rescale-zero-one',則公式為:X = (X-min(X))/(max(X)-min(X)),但實際上,對於圖像輸入層,它會將輸入圖像的每個通道獨立地重新縮放到[0,1]區間,公式為:X = (X - min(X)) ./ (max(X) - min(X))。 - 然而,在我們的例子中,輸入層設置了'rescale-zero-one',所以我們輸入的數據會被重新縮放。 但是,我們的輸入數據只有一個值,所以重新縮放後會變成0(因為最大值和最小值相同,避免除0,Matlab會怎麼處理?)。所以我們要注意輸入數據不能是常數,或者我們可以避免使用歸一化? 不過,我們現在的重點是如何輸入數據。 假設我們有一個輸入值0.5,我們想將它輸入網路。注意,我們的輸入層要求一個1x1x1的圖像,所以我們應該創建一個1x1x1的矩陣。 代碼示例: data = 0.5; % 單個數值 % 轉換為dlarray,格式為'SSCB',這裡批次大小為1 dlX = dlarray(reshape(data, [1,1,1]), 'SSCB'); % 將0.5重塑為1x1x1,然後創建dlarray,並指定格式為'SSCB'(注意:第三個維度是通道,這裡1個通道,第四維是批次,這裡1個樣本) 然後,我們可以使用predict: Y = predict(net_fusion_1, dlX); 但是,由於網路只有輸入層,輸出應該就是歸一化後的結果。對於單個值0.5,歸一化後應該還是0.5?因為最大值和最小值都是0.5,所以歸一化會出現0/0的問題。Matlab在這種情況下可能會將整個圖像設置為0?或者保留原值?我們需要避免這種情況。 因此,我們可以考慮使用一個非單值的輸入(儘管我們的網路輸入是1x1x1,但我們可以輸入多個不同的值組成一個批次)或者改變歸一化方式?但這裡我們按照要求輸入。 實際上,imageInputLayer的歸一化在訓練時是基於整個訓練集的統計資訊,但在這裡我們沒有提供訓練集,所以它會對每個輸入獨立歸一化?這可能不是我們想要的。因此,對於單個樣本的預測,如果我們使用'rescale-zero-one',並且輸入只有一個值,那麼歸一化會將該值設為0(因為分母為0時,Matlab會將其設為0)。所以我們需要小心。 但是,我們這裡的重點是輸入方法,所以我們可以忽略歸一化的問題,或者我們可以修改輸入層的歸一化為'none'。 然而,問題要求我們輸入一組參數,這個參數就是融合權重嗎?題目給定的融合權重是[1 1 1](用來定義輸入層的大小),而我們要輸入的是網路的輸入數據,與融合權重不同。 因此,我們輸入一個1x1x1的圖像(單個像素,單個通道)到網路。 代碼步驟: 1. 定義輸入數據:例如,我們可以輸入一個數值0.5,或者一個數組(對於多個樣本)。 2. 將輸入數據轉換為dlarray,並且維度要匹配。 假設我們輸入一個批次大小為2的數據,即兩個樣本,每個樣本都是1x1x1的圖像。 data = [0.5, 0.8]; % 兩個樣本 % 需要重塑為1x1x1x2 data = reshape(data, [1,1,1,2]); % 尺寸:1x1x1x2 dlX = dlarray(data, 'SSCB'); 3. 使用predict進行預測: Y = predict(net_fusion_1, dlX); 4. 輸出Y將是一個1x1x1x2的dlarray,我們可以提取其數據: y_data = extractdata(Y); % 得到一個1x1x1x2的數組 y_data = squeeze(y_data); % 去除單一維度,變為[2x1]向量 注意:如果我們只有一個樣本,那麼我們可以這樣做: data = 0.5; dlX = dlarray(reshape(data, [1,1,1,1]), 'SSCB'); Y = predict(net_fusion_1, dlX); y = extractdata(Y); % 1x1x1x1 y = y(:); % 變成標量 但是,由於歸一化的問題,當輸入只有一個值時,歸一化會得到0(因為最大值和最小值相同,導致分母為0,歸一化公式會將所有值設為0)。因此,我們需要避免這種情況。 解決方法:我們可以修改輸入層,不使用歸一化,或者使用'none'。 layers_fusion_weight = imageInputLayer(fusion_size, 'Normalization', 'none', 'Name', 'fusion_w1'); 這樣,輸入就不會被歸一化。 因此,我們可以重新建立網路: 修改後的代碼: fusion_weight = [1 1 1]; % 這定義了輸入層的大小:1x1x1(高度x寬度x通道數) fusion_size = size(fusion_weight); % 得到 [1,1,1] layers_fusion_weight = [ imageInputLayer(fusion_size, 'Normalization', 'none', 'Name', 'fusion_w1') % 圖像輸入層,無歸一化 ]; net_fusion_1 = dlnetwork; net_fusion_1 = addLayers(net_fusion_1, layers_fusion_weight); analyzeNetwork(net_fusion_1); 現在,我們輸入數據就不會被歸一化。 所以,輸入數據的代碼: % 創建一個輸入,假設我們要輸入一個值0.5(作為一個樣本) inputValue = 0.5; % 將輸入數據重塑為1x1x1x1(高度,寬度,通道,批次) inputData = reshape(inputValue, [1,1,1,1]); % 轉換為dlarray dlInput = dlarray(inputData, 'SSCB'); % 預測 output = predict(net_fusion_1, dlInput); % 提取數據 outputValue = extractdata(output); % 輸出為1x1x1x1的數組 outputValue = outputValue(:) % 轉為標量:0.5 或者輸入多個樣本: inputValues = [0.5, 0.8, 1.0]; % 三個樣本 inputData = reshape(inputValues, [1,1,1,3]); % 1x1x1x3 dlInput = dlarray(inputData, 'SSCB'); output = predict(net_fusion_1, dlInput); outputValues = extractdata(output); % 1x1x1x3 outputValues = squeeze(outputValues) % 變為3x1向量,即[0.5;0.8;1.0] 注意:由於我們的網路只有輸入層,沒有其他層,所以輸出等於輸入。 因此,我們可以通過這種方式輸入一組參數(數據)到網路中。 總結: 1. 確保輸入層的歸一化設置符合需求。這裡我們改為'none',以避免單個值歸一化問題。 2. 將輸入數據重塑為網路輸入層期望的維度(高度、寬度、通道數),並加上批次維度(第四維)。 3. 使用dlarray包裝數據,並指定格式為'SSCB'。 4. 使用predict函數進行預測。 5. 使用extractdata從dlarray中提取數據,並根據需要調整形狀。 代碼實現: 假設我們已經按照修改後的代碼建立了網路(即輸入層歸一化設置為'none'),然後輸入數據。 以下是一個完整的示例: % 建立網路 fusion_weight = [1 1 1]; fusion_size = size(fusion_weight); layers_fusion_weight = imageInputLayer(fusion_size, 'Normalization', 'none', 'Name', 'fusion_w1'); net_fusion_1 = dlnetwork; net_fusion_1 = addLayers(net_fusion_1, layers_fusion_weight); % 輸入數據準備 inputValues = [0.5, 0.8, 1.0]; % 三個樣本 % 重塑為1x1x1x3 inputData = reshape(inputValues, [1,1,1,length(inputValues)]); % 轉換為dlarray dlInput = dlarray(inputData, 'SSCB'); % 預測 output = predict(net_fusion_1, dlInput); % 提取輸出數據 outputValues = extractdata(output); outputValues = squeeze(outputValues); % 變為列向量 % 顯示 disp(outputValues); 輸出應該等於輸入。 注意:如果我們想輸入更高維的數據(例如,多通道但每個通道只有一個像素),則需要按照輸入層的尺寸來組織數據。 例如,如果輸入層是1x1x3(三個通道),則輸入數據應該是1x1x3xB(B是批次大小),其中第三個維度是通道。 但我們這裡是1x1x1,所以只有一個通道。 §§相关问题§§: 1. 在使用imageInputLayer时,Normalization选项有哪些?它们分别有什么作用? 2. dlnetwork和LayerGraph有什么区别? 3. 如何训练一个dlnetwork? 4. 在dlnetwork中,如何自定义训练循环? </think> ### 输入参数到深度学习网络的实现方法 以下是完整的代码实现,演示如何将一组参数输入到给定的深度学习网络中: ```matlab % 1. 定义网络结构(修改输入层归一化为'none',避免单值归一化问题) fusion_weight = [1 1 1]; fusion_size = size(fusion_weight); layers_fusion_weight = [ imageInputLayer(fusion_size, 'Normalization', 'none', 'Name', 'fusion_w1') ]; % 2. 创建并验证网络 net_fusion_1 = dlnetwork; net_fusion_1 = addLayers(net_fusion_1, layers_fusion_weight); analyzeNetwork(net_fusion_1); % 3. 准备输入数据(示例数据) input_data = [0.2, 0.5, 0.8, 1.0]; % 要输入的参数组(4个样本) % 4. 将数据转换为网络所需的格式 % 重塑为 [高度, 宽度, 通道, 批次] 格式 input_data_reshaped = reshape(input_data, [1, 1, 1, numel(input_data)]); % 5. 创建dlarray对象(指定'SSCB'格式) dl_input = dlarray(single(input_data_reshaped), 'SSCB'); % 6. 将数据输入网络并获取输出 dl_output = predict(net_fusion_1, dl_input); % 7. 提取并显示结果 output_data = extractdata(dl_output); disp('网络输入:'); disp(input_data); disp('网络输出:'); disp(squeeze(output_data)'); % 去除单一维度 ``` ### 关键步骤解释: 1. **输入层修改**: - 将`Normalization`设置为`'none'`,避免单值输入时归一化错误(原`'rescale-zero-one'`在输入单一数值时会导致除零错误)。 2. **数据重塑**: - 网络输入层要求尺寸为 `[1, 1, 1]`(高×宽×通道) - 使用`reshape`将输入向量转换为四维张量 `[1, 1, 1, N]`,其中: - 第1-2维:空间维度(1×1像素) - 第3维:通道数(1个通道) - 第4维:批次大小(N个样本) 3. **dlarray转换**: - 使用`dlarray`封装数据,格式标签`'SSCB'`表示: - `'S'`:空间维度 - `'C'`:通道维度 - `'B'`:批次维度 4. **网络预测**: - `predict`函数执行前向传播,返回`dlarray`类型的输出 - `extractdata`从`dlarray`中提取数值数据 - `squeeze`移除单一维度,将输出转换为向量 ### 示例输出: ``` 网络输入: 0.2000 0.5000 0.8000 1.0000 网络输出: 0.2000 0.5000 0.8000 1.0000 ``` > **注意**:输出与输入相同,因为网络仅包含输入层(无任何变换操作)。实际应用中需添加更多层次实现计算功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值