コンピュータビジョン
コンピュータビジョン
MNISTによる数字分類
resource = ResourceObject["MNIST"]trainingData = ResourceData[resource, "TrainingData"];
testData = ResourceData[resource, "TestData"];RandomSample[trainingData, 5]lenet = NetChain[{
ConvolutionLayer[20, 5], Ramp, PoolingLayer[2, 2],
ConvolutionLayer[50, 5], Ramp, PoolingLayer[2, 2],
FlattenLayer[], 500, Ramp, 10, SoftmaxLayer[]},
"Output" -> NetDecoder[{"Class", Range[0, 9]}],
"Input" -> NetEncoder[{"Image", {28, 28}, "Grayscale"}]
]results = NetTrain[lenet, trainingData, All, ValidationSet -> testData, MaxTrainingRounds -> 3]
trained = results["TrainedNet"]imgs = Keys @ RandomSample[testData, 5];
Thread[imgs -> trained[imgs]]trained[[image], "Probabilities"]NetMeasurementsを使って,検証集合に対する,訓練されたネットの分類性能をテストする:
NetMeasurements[trained, testData, "Accuracy"]NetMeasurements[trained, testData, "ConfusionMatrixPlot"]CIFAR-10のオブジェクト分類
obj = ResourceObject["CIFAR-10"];
trainingData = ResourceData[obj, "TrainingData"];
RandomSample[trainingData, 5]classes = Union@Values[trainingData]lenet = NetChain[
{ConvolutionLayer[20, 5], Ramp, PoolingLayer[2, 2], ConvolutionLayer[50, 5], Ramp, PoolingLayer[2, 2], FlattenLayer[], 500, Ramp, 10, SoftmaxLayer[]},
"Output" -> NetDecoder[{"Class", classes}],
"Input" -> NetEncoder[{"Image", {32, 32}}]
]results = NetTrain[lenet, trainingData, All, MaxTrainingRounds -> 4]
trained = results["TrainedNet"]trained[{[image], [image], [image], [image], [image]}]trained[[image], {"TopProbabilities", 3}]images = RandomSample[Keys[trainingData], 5000];entropies = trained[images, "Entropy"];Labeled[images[[Ordering[entropies, -10]]], "high entropy"]
Labeled[images[[Ordering[entropies, 10]]], "low entropy"]mnist = Select[ResourceData["MNIST"], Last[#] < 5&];toRule[{img1_ -> l1_, img2_ -> l2_}] := {img1, img2} -> l1 ≠ l2;trainingData = Table[toRule@RandomSample[mnist, 2], 10000];
Take[trainingData, 4]lenet = NetChain[{
ConvolutionLayer[10, 4], Ramp, PoolingLayer[2, 2],
ConvolutionLayer[20, 4], Ramp, PoolingLayer[2, 2],
FlattenLayer[], 2},
"Input" -> NetEncoder[{"Image", {28, 28}, "Grayscale"}]]net = NetPairEmbeddingOperator[lenet]results = NetTrain[net, trainingData, All]
trained = results["TrainedNet"]trained[{{[image], [image]}, {[image], [image]}, {[image], [image]}}]embedding = NetExtract[trained, "Net"]embedding[[image]]groups = KeySort@GroupBy[RandomSample[mnist, 2000], Last -> First];points = Map[embedding /* Normal, groups];ListPlot[Table[points[[i]], {i, 1, 5}], PlotLegends -> Range[0, 4], Axes -> False, FrameTicks -> False, Frame -> True,
PlotStyle -> PointSize[0.012], AspectRatio -> 1]ある画像の内容で,別の画像の画風を使って新しい画像を作成する.この実装はGatys,その他の人によって書かれた「A Neural Algorithm of Artistic Style」で説明されている方法に従っている.
contentImg = [image];
styleImg = [image];vggNet = NetModel["VGG-16 Trained on ImageNet Competition Data"];featureNet = Take[vggNet, {1, "relu4_1"}]contentLoss = NetGraph[{MeanSquaredLossLayer[]}, {1 -> NetPort["LossContent"]}]gramMatrix = NetGraph[{FlattenLayer[-1], TransposeLayer[1 -> 2], DotLayer[]}, {1 -> 3, 1 -> 2 -> 3}];styleLoss = NetGraph[{gramMatrix, gramMatrix, MeanSquaredLossLayer[]},
{NetPort["Input"] -> 1, NetPort["Target"] -> 2, {1, 2} -> 3, 3 -> NetPort["LossStyle"]}]l2Loss = NetGraph[{ThreadingLayer[(#1 - #2) ^ 2&], SummationLayer[]}, {{NetPort["Input"], NetPort["Target"]} -> 1 -> 2}];tvLoss = NetGraph[<|
"dx1" -> PaddingLayer[{{0, 0}, {1, 0}, {0, 0}}, "Padding" -> "Fixed" ],
"dx2" -> PaddingLayer[{{0, 0}, {0, 1}, {0, 0}}, "Padding" -> "Fixed"],
"dy1" -> PaddingLayer[{{0, 0}, {0, 0}, {1, 0}}, "Padding" -> "Fixed" ],
"dy2" -> PaddingLayer[{{0, 0}, {0, 0}, {0, 1}}, "Padding" -> "Fixed"],
"lossx" -> l2Loss, "lossy" -> l2Loss, "tot" -> TotalLayer[]|>, {
{"dx1", "dx2"} -> "lossx", {"dy1", "dy2"} -> "lossy",
{"lossx", "lossy"} -> "tot" -> NetPort["LossTV"]}]createTransferNet[net_, content_Image, styleFeatSize_] := Module[
{dims = Prepend[3]@Reverse@ImageDimensions[content]},
NetGraph[<|
"Image" -> NetArrayLayer["Array" -> RandomReal[{-0.1, 0.1}, dims]],
"imageFeat" -> NetReplacePart[net, "Input" -> dims],
"content" -> contentLoss,
"style" -> styleLoss,
"tv" -> tvLoss|>,
{"Image" -> "imageFeat",
{"imageFeat", NetPort["ContentFeature"]} -> "content",
{"imageFeat", NetPort["StyleFeature"]} -> "style",
"Image" -> "tv"},
"StyleFeature" -> styleFeatSize
]
]予測された画像を可視化するためのNetDecoderを定義する:
meanIm = NetExtract[featureNet, "Input"][["MeanImage"]]results = NetTrain[net,
trainingdata, All, LossFunction -> lossSpec,
LearningRateMultipliers -> {"Image" -> 1, _ -> None},
TrainingProgressReporting -> Function[decoder[#Weights[{"Image", "Array"}]]],
MaxTrainingRounds -> 300, BatchSize -> 1,
Method -> {"ADAM", "LearningRate" -> 0.05}
]
trainedNet = results["TrainedNet"]extractFeatures[img_] := NetReplacePart[featureNet, "Input" -> NetEncoder[{"Image", ImageDimensions[img], "MeanImage" -> meanIm}]][img];trainingdata = <|
"ContentFeature" -> {extractFeatures[contentImg]}, "StyleFeature" -> {extractFeatures[styleImg]}
|>;net = createTransferNet[featureNet, contentImg, Dimensions@First@trainingdata["StyleFeature"]];訓練する場合,内容と画風の相対的重要性を設定するために,3つの損失関数には異なる重みが付けられる.これらの値は内容と画風の画像によって変更される必要がある場合がある.最終的な損失を,3つの損失の合計として定義する損失指定を作成する:
perPixel = 1 / (3 * Apply[Times, ImageDimensions[contentImg]]);
lossSpec = {"LossContent" -> Scaled[6. * 10 ^ -5], "LossStyle" -> Scaled[0.5 * 10 ^ -14], "LossTV" -> Scaled[20. * perPixel]};NetTrainを使って画像を最適化する.LearningRateMultipliersを使って,NetArrayLayer以外のネット内のすべてのパラメータを凍結する.CPU訓練でより結果を得るには最大1時間かかるので,訓練はGPUで行うのがよい.訓練は,評価 ▶ 評価を放棄を使っていつでも中止することができる:
results = NetTrain[net,
trainingdata, All, LossFunction -> lossSpec,
LearningRateMultipliers -> {"Image" -> 1, _ -> None},
TrainingProgressReporting -> Function[decoder[#Weights[{"Image", "Array"}]]],
MaxTrainingRounds -> 300, BatchSize -> 1,
Method -> {"ADAM", "LearningRate" -> 0.05},
TargetDevice -> "GPU"
]
trainedNet = results["TrainedNet"]訓練されたネットのNetArrayLayerから最終画像を抽出する:
decoder[NetExtract[trainedNet, {"Image", "Array"}]]Toyテキストデータセットのセマンティックセグメンテーション
imgMap = <|" " -> [image], "a" -> [image], "b" -> [image], "c" -> [image], "d" -> [image], "e" -> [image], "f" -> [image], "g" -> [image], "h" -> [image], "i" -> [image], "j" -> [image], "k" -> [image], "l" -> [image], "m" -> [image], "n" -> [image], "o" -> [image], "p" -> [image], "q" -> [image], "r" -> [image], "s" -> [image], "t" -> [image], "u" -> [image], "v" -> [image], "w" -> [image], "x" -> [image], "y" -> [image], "z" -> [image]|>;class = 0;
maskMap = Map[1 + class++ * (1 - ImageData[Binarize[#, 0.7]])&, imgMap];maxLen = 7;
wordList = Select[WordList[], StringLength[#] ≤ maxLen && LetterQ[#]&];
wordList = RandomSample@StringPadRight[ToLowerCase[wordList], maxLen];rules = Map[
ImageAssemble[Lookup[imgMap, #]] -> MapThread[Join, Lookup[maskMap, #]]&,
Characters[wordList]];
Length[rules]{testData, trainData} = TakeDrop[rules, Ceiling[Length[rules] / 10]];classNum = Max[maskMap]colorRules = Thread[Range[classNum] -> Prepend[RandomColor[classNum - 1], White]]RandomSample[Keys@trainData, 5]ArrayPlot[trainData[[1005, 2]], ColorRules -> colorRules]basicBlock[channels_, kernelSize_, opts___] := NetChain[{ConvolutionLayer[channels, kernelSize, opts], BatchNormalizationLayer[], Ramp}]net = NetChain[{
(* bottleneck layers *)
basicBlock[32, 1],
basicBlock[32, 1],
basicBlock[32, 1],
basicBlock[32, 3, "Stride" -> 2, "PaddingSize" -> 1],
basicBlock[64, 1], basicBlock[32, 1],
basicBlock[32, 3, "PaddingSize" -> 1],
basicBlock[64, 1],
(* upsample layers *)
basicBlock[32, 1],
DeconvolutionLayer[32, {3, 2}, "Stride" -> 2, "PaddingSize" -> 1],
basicBlock[64, 1],
PaddingLayer[{{0, 0}, {0, 0}, {0, 1}}],
ConvolutionLayer[classNum, 1],
(* classification layers *)
TransposeLayer[{1 3, 1 2}],
SoftmaxLayer[]},
"Input" -> NetEncoder[{"Image", ImageDimensions[trainData[[1, 1]]], "Grayscale"}]]results = NetTrain[net, trainData, All,
ValidationSet -> testData,
MaxTrainingRounds -> 9
]
trainedNet = results["TrainedNet"]pixelPredict[net_, image_] := Map[First@Ordering[#, -1]&, Normal@net[image], {2}]img = testData[[-7, 1]]ArrayPlot[pixelPredict[trainedNet, img], ColorRules -> colorRules]ArrayPlot[testData[[-7, 2]], ColorRules -> colorRules]prob = trainedNet[[image]][[10, 11]];
Sort[Thread[Keys@imgMap -> Normal@prob], #1[[2]] > #2[[2]]&]stringPredict[net_, str_] := pixelPredict[net, ImageAssemble[Lookup[imgMap, Characters@StringPadRight[str, maxLen]]]]ArrayPlot[stringPredict[trainedNet, "abcdefg"], ColorRules -> colorRules]ArrayPlot[stringPredict[trainedNet, "hqx"], ColorRules -> colorRules]1. - Mean@Flatten[Unitize[Map[pixelPredict[trainedNet, #]&, Keys[testData]] - Values[testData]]]関連するガイド
-
▪
- 機械学習 ▪
- ニューラルネットワーク