MATLAB-DL6


迁移学习-文档示例

步骤

加载网络
导入新数据集
修改最后层
设置学习率,新层大,迁移层小
开始训练,APP或command

注意:如果使用的数据集与imageNet的网络很相似,则使用预定义的网络均是可以的

交互式迁移貌似2020a才有???

学会用analyze network

命令行式

unzip('MerchData.zip') %解压
%创建数据存储
imds=imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames')%创建数据存储并定义标签
[imdsTrain,imdsValidation]=splitEachLabel(imds,0.7,'randomized') %定义数据集合验证集

%导入预训练网络
net=googlenet
%analyzeNetwork(net)

%画图???
if isa(net,'SeriesNetwork')
	lgraph=layerGraph(net.Layers);
else
	lgraph=layerGraph(net);
end

%迁移更新
learnableLayer=net.Layers(142)
classLayer=net.Layers(end)

%所分类别
numClasses=numel(categories(imdsTrain.Labels))

%更改全连接、全卷积层
if isa(learnableLayer,'nnet.cnn.layer.FullyConnectedLayer')
	newLearnableLayer=fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);
elseif isa(learnableLayer,'nnet.cnn.layer.Convolution2DLayer')
	newLearnableLayer=convolution2dLayer(1,numClasses,'Name','new_conv','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);
end
lgraph=replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer)

%更改输出分类层
newClassLayer=classificationLayer('Name','new_classoutput')
lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer)

%等待训练
%冻结前面层
layers = lgraph.Layers;
connections = lgraph.Connections;

layers(1:10) = freezeWeights(layers(1:10));
lgraph = createLgraphUsingConnections(layers,connections);

%数据增强
%调整训练集
pixelRange = [-30 30];
scaleRange = [0.9 1.1];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange, ...
    'RandXScale',scaleRange, ...
    'RandYScale',scaleRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);
    
%调整验证集
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

%训练参数
miniBatchSize = 10;
valFrequency = floor(numel(augimdsTrain.Files)/miniBatchSize);
options = trainingOptions('sgdm', ...
    'MiniBatchSize',miniBatchSize, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',3e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',valFrequency, ...
    'Verbose',false, ...
    'Plots','training-progress');
    
%开始训练
 net = trainNetwork(augimdsTrain,lgraph,options);
 
%进行验证
[YPred,probs] = classify(net,augimdsValidation);

%进行测试
idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

迁移学习

有的网络最后的带有学习参数的层为全连接层,而有的是1*1的全卷积层,
但是最终都要等于最后的要分类的数目
一般迁移学习修改的是最后几个全连接层和最后的输出层,输出层一般不需要特定类别数量,系统会自动分类
更改后即可准备训练

冻结

冻结初始层
可选操作,可以通过将前面层的学习率设置为0达到冻结前面层的目的,训练过程中并不更新冻结层的参数,因为在冻结层的梯度不需要进行计算,所以能够加快网络训练,同时如果数据集过小冻结之前的层还可以防止过拟合
对于googlenet一般冻结前10层

freezeWeights

冻结前面的层,使学习率为0

createLgraphUsingConnections

以原始的连接顺序重新连接层,此时包括前面学习率为0的层

数据增强

一般对训练集进行数据增强,对验证集不进行数据增强

学习参数

对未冻结的迁移层设置较小的学习率
在更改预训练的迁移层时,已经将最后几层的学习率设置的很大,来加速新层的学习,这种组合方式能够进行更快的训练

函数大杂烩

imageDatastore 数据存储 imageDatastore(data,‘includeSubfloders’,‘LabelSource’)
analyzeNetwork 分析网络 analyzeNetwork(net)
net.layers(1).InputSize
layerGraph 画网络图,与isa()使用
net.layers(n) 定位到某一层
‘nnet.cnn.layer.FullyConnectedLayer’ 层属性
fullyConnectedLayer(‘Name’,‘WeightLearnRateFactor’,‘BiasLeranRateFactor’)
categories
categorical
replaceLayer
classificationLayer
convolution2dLayer
freezeWeights 冻结层学习率为0
lgraph.layers/Connections
classify
randperm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。根据你的描述,我们可以将质量矩阵$M_e$和刚度矩阵$K_e$组装成6维矩阵,并将刚度矩阵$K_e$分为弹性刚度矩阵和非线性刚度矩阵两部分计算。 假设我们有$n$个单元,每个单元的质量矩阵和刚度矩阵分别为$M_{e,i}$和$K_{e,i}$,其中$i=1,2,\ldots,n$,则组装后的6维质量矩阵和刚度矩阵为: $$M=\begin{bmatrix} M_{1,1} & 0 & 0 & 0 & 0 & 0 \\ 0 & M_{1,1} & 0 & 0 & 0 & 0 \\ 0 & 0 & M_{1,1} & 0 & 0 & 0 \\ 0 & 0 & 0 & M_{1,1} & 0 & 0 \\ 0 & 0 & 0 & 0 & M_{2,2} & 0 \\ 0 & 0 & 0 & 0 & 0 & M_{2,2} \\ \end{bmatrix}$$ $$K=\begin{bmatrix} K_{1,1}^L & K_{1,1}^N & 0 & 0 & 0 & 0 \\ -K_{1,1}^L & K_{1,1}^L+K_{2,2}^L & -K_{2,2}^N & 0 & 0 & 0 \\ 0 & -K_{2,2}^L & K_{2,2}^L+K_{3,3}^L & -K_{3,3}^N & 0 & 0 \\ 0 & 0 & -K_{3,3}^L & K_{3,3}^L+K_{4,4}^L & 0 & 0 \\ 0 & 0 & 0 & 0 & K_{n,n}^L & K_{n,n}^N \\ 0 & 0 & 0 & 0 & -K_{n,n}^L & K_{n,n}^L \\ \end{bmatrix}$$ 其中,$M$和$K$均为$6n\times 6n$的矩阵。 对于刚度矩阵$K_{e,i}$,可以按照$K_{e,i} = K_{e,i}^L + K_{e,i}^N$的形式表示,其中$K_{e,i}^L$和$K_{e,i}^N$分别为单元$i$的局部坐标系下的弹性刚度矩阵和非线性刚度矩阵。因此,可以将$K$矩阵中的元素表示为: $$K_{i,j}=\begin{cases} K_{e,i}^L & i=j \\ -K_{e,i}^L & i=j+1 \\ 0 & \text{otherwise} \end{cases}+\begin{cases} K_{e,i}^N & i=j \\ -K_{e,i}^N & i=j+1 \\ 0 & \text{otherwise} \end{cases}$$ 其中,$i$和$j$均为奇数,且满足$1\leq i,j\leq 2n-1$。需要注意的是,$K$矩阵中的第二个分块的大小为$(n-1)\times(n-1)$,表示除第一个单元和最后一个单元外的中间单元的弹性刚度矩阵之和。 具体实现可以按照以下MATLAB代码: ```matlab % 假设有n个单元 n = 4; % 初始化6维刚度矩阵和质量矩阵 K = zeros(6*n, 6*n); M = zeros(6*n, 6*n); % 组装6维刚度矩阵和质量矩阵 dL = 1; % 假设单元长度为1,可以根据具体问题进行修改 E = 1; % 假设弹性模量为1,可以根据具体问题进行修改 I = 1; % 假设惯性矩为1,可以根据具体问题进行修改 for i = 1:n % 计算单元i的局部坐标系下的弹性刚度矩阵Ke_L和非线性刚度矩阵Ke_N Ke_L = [12*E*I/dL^3, 6*E*I/dL^2, -12*E*I/dL^3, 6*E*I/dL^2; 6*E*I/dL^2, 4*E*I/dL, -6*E*I/dL^2, 2*E*I/dL; -12*E*I/dL^3, -6*E*I/dL^2, 12*E*I/dL^3, -6*E*I/dL^2; 6*E*I/dL^2, 2*E*I/dL, -6*E*I/dL^2, 4*E*I/dL]; Ke_N = % 计算Ke_N的代码 % 组装单元i的刚度矩阵Ke = Ke_L + Ke_N Ke = Ke_L + Ke_N; % 将Ke矩阵的元素放入6维刚度矩阵K中 if i == 1 K(1:6, 1:6) = [Ke_L, Ke_N; -Ke_L, Ke_L+Ke_N]; elseif i == n K(6*i-5:6*i, 6*i-5:6*i) = [Ke_L, -Ke_L; -Ke_L, Ke_L+Ke_N]; else K(6*i-5:6*i, 6*i-5:6*i) = [Ke_L, Ke_N; -Ke_L, Ke_L]; K(6*i-5:6*i, 6*i+1:6*i+6) = [-Ke_N, Ke_N; Ke_N, Ke_N]; K(6*i+1:6*i+6, 6*i-5:6*i) = [-Ke_N', Ke_N'; Ke_N', Ke_N']; end % 获取单元i的质量矩阵Me Me = [156, 22*dL, 54, -13*dL; 22*dL, 4*dL^2, 13*dL, -3*dL^2; 54, 13*dL, 156, -22*dL; -13*dL, -3*dL^2, -22*dL, 4*dL^2]; % 将Me矩阵的元素放入6维质量矩阵M中 M(6*i-5:6*i, 6*i-5:6*i) = Me; end ``` 需要注意的是,代码中的计算方法需要根据具体问题进行调整和修改,此处的代码仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值