11

私は自分自身に機械学習を教えようとしており、MNISTデータベース(http://yann.lecun.com/exdb/mnist/)を使用しています。そのサイトの作成者は、98年に、さまざまな種類の手書き認識技術に関する論文を執筆しました。この論文は、 http: //yann.lecun.com/exdb/publis/pdf/lecun-98.pdfで入手できます。

言及された10番目の方法は「接線距離分類器」です。各画像を(NxM)次元のベクトル空間に配置すると、2つの画像間の距離を、ポイントを取得して画像を回転させることにより、超平面が与えられるそれぞれによって形成される超平面間の距離として計算できるという考え方です。 、画像の再スケーリング、画像の翻訳など。

不足している詳細を記入するのに十分な理解ができません。これらのほとんどは確かに線形演算子であることを理解しています。では、その事実をどのように使用して超平面を作成するのでしょうか。そして、超平面ができたら、他の超平面との距離をどのように取るのでしょうか?

4

1 に答える 1

17

ヒントをいくつかあげます。画像処理の背景知識が必要です。詳細については、2、3を参照してください。

  • 2c接線距離の実装です
  • 3は接線距離をより詳細に説明する論文です

画像の畳み込み

3によると、あなたがする必要がある最初のステップは、画像を滑らかにすることです。以下に、 3つの異なるスムーズ操作の結果を示します(セクション4/3を確認してください)(左の列は結果の画像を示し、右の列は元の画像と畳み込み演算子を示しています)。このステップでは、離散ベクトルを連続ベクトルにマッピングして、微分可能にします。著者は、ガウス関数を使用することを提案しています。画像の畳み込みについてより多くの背景が必要な場合は、ここに例があります。

ここに画像の説明を入力してください

この手順が完了したら、水平シフトと垂直シフトを計算しました。

ここに画像の説明を入力してください ここに画像の説明を入力してください

スケーリング接線の計算

ここでは、 2で実装された接線計算の1つであるスケーリング接線を示します。3から、変換は次のようになります。

ここに画像の説明を入力してください

/* scaling */
for(k=0;k<height;k++)
  for(j=0;j<width;j++) {
    currentTangent[ind] = ((j+offsetW)*x1[ind] + (k+offsetH)*x2[ind])*factor;
    ind++;
  }

td.cin 2の実装の最初に、次の定義を知っています。

factorW=((double)width*0.5);
offsetW=0.5-factorW;
factorW=1.0/factorW;

factorH=((double)height*0.5);
offsetH=0.5-factorH;
factorH=1.0/factorH;

factor=(factorH<factorW)?factorH:factorW; //min

著者はサイズ16x16の画像を使用しています。だから私たちは知っています

factor=factorW=factorH=1/8, 

offsetH=offsetW = 0.5-8 = -7.5

また、すでに計算したことに注意してください

  • x1[ind]=
  • x2[ind]=

そのため、これらの定数をプラグインします。

currentTangent[ind] = ((j-7.5)*x1[ind] + (k-7.5)*x2[ind])/8
                    = x1 * (j-7.5)/8 + x2 * (k-7.5)/8.

j(もk)は0から15までの整数であるため(画像の幅と高さは16ピクセルです)、はから(j-7.5)/8の間の小数です。-0.93750.9375

(j+offsetW)*factorつまり、各ピクセルの変位は、ピクセルから画像の中心までの水平距離に比例すると思います。同様に、垂直方向の変位もわかります(k+offsetH)*factor

回転接線の計算

回転接線は以下のように定義されます3

ここに画像の説明を入力してください

/* rotation */
for(k=0;k<height;k++)
  for(j=0;j<width;j++) {
    currentTangent[ind] = ((k+offsetH)*x1[ind] - (j+offsetW)*x2[ind])*factor;
    ind++;
  }

前の結論を使用すると、に(k+offsetH)*factor対応することがわかりyます。同様にに- (j+offsetW)*factor対応し-xます。つまり、これが3で使用されている式とまったく同じであることがわかります。

2で実装された3で説明されている他のすべての接線を見つけることができます。下の3の画像が好きです。これは、さまざまな変換接線の変位効果を明確に示しています。 ここに画像の説明を入力してください

画像間の接線距離の計算

関数の実装に従ってtangentDistanceください:

// determine the tangents of the first image
calculateTangents(imageOne, tangents, numTangents, height, width, choice, background);

// find the orthonormal tangent subspace 
numTangentsRemaining = normalizeTangents(tangents, numTangents, height, width);

// determine the distance to the closest point in the subspace
dist=calculateDistance(imageOne, imageTwo, (const double **) tangents, numTangentsRemaining, height, width);

上記で十分に始めることができると思います。不足しているものがある場合は、3を注意深く読み、 2の対応する実装を参照してください。幸運を!

于 2012-11-12T22:19:48.723 に答える