3

私は、観察の次元を減らし、それでもそれらの重要な表現を保持する必要があるプロジェクトに取り組んでいます。オートエンコーダーの使用は多くの理由で強く提案されましたが、それが最善のアプローチであるかどうかはよくわかりません。

次元が 60,000 の 1400 個のサンプルがあり、これは高すぎます。元の次元の 10% に次元を削減しようとしています。私はtheano autoencoders [ Link ]を使用していますが、コストは約30,000のままです(これは非常に高いです)。エポック数を増やしたり、学習率を下げたりしてみましたが、うまくいきませんでした。私はオートエンコーダーの専門家ではないので、ここから先に進む方法や、いつ試行をやめるべきかわかりません。

私が実行できるテストは他にもありますが、先に進む前に、あなたからの意見が欲しいです。

  • データセットが小さすぎると思いますか (さらに 600 サンプルを追加して、合計で ~2000 にすることができます)?

  • 積み重ねられた自動エノダーを使用すると役立つと思いますか?

  • パラメータ (エポックと学習率) を微調整し続ける必要がありますか?

データセットは画像のアンサンブルであるため、オートエンコーダーからの再構成を視覚化しようとしましたが、すべてのサンプルで同じ出力しか得られませんでした。これは、入力が与えられると、オートエンコーダーが入力を再構築しようとするが、代わりに得られるのは、どの入力に対しても同じ (ほぼ正確に) 画像であることを意味します (これは、データセット内のすべての画像の平均のように見えます)。これは、オートエンコーダーがそこから画像を再構築できないため、内部表現が十分でないことを意味します。

データセット:スキャンされた書籍 (表紙を含む) の 1400 ~ 2000 枚の画像 (それぞれ約 60.000 ピクセル) (これは 60.000 要素の特徴ベクトルに変換されます)。各特徴ベクトルは [0,1] で正規化されており、元の値は [0,255] でした。

問題: オートエンコーダーで次元を減らす (可能であれば)

追加情報が必要な場合、または問題をよりよく理解するのに役立つ可能性のある情報を見逃した場合は、コメントを追加してください。喜んでお手伝いさせていただきます =)。

注: 現在、データセット全体でより多くのエポックを使用してテストを実行しています。結果に応じて投稿を更新しますが、しばらく時間がかかる場合があります。

4

3 に答える 3

3

オートエンコーダーは、非線形の次元削減を学習できるため、便利です。ただし、オートエンコーダーよりもはるかに高速な次元削減手法は他にもあります。拡散マップは人気のあるマップです。局所線形埋め込みは別のものです。2000 以上の 60k 次元データ (画像も含む) で拡散マップを使用しましたが、1 分以内に機能します。

numpy などを使用した簡単な Python 実装を次に示します。

def diffusion_maps(data, d, eps=-1, t=1):
    """
    data is organized such that columns are points. so it's 60k x 2k for you
    d is the target dimension
    eps is the kernel bandwidth, estimated automatically if == -1
    t is the diffusion time, 1 is usually fine
    """

    from scipy.spatial import pdist, squareform
    from scipy import linalg as la
    import numpy as np

    distances = squareform(pdist(data.T))

    if eps == -1:
        # if a kernel bandwidth was not supplied,
        # just use the distance to the tenth-nearest neighbor
        k = 10
        nn = np.sort(distances)
        eps = np.mean(nn[:, k + 1])

    kernel = np.exp(-distances ** 2 / eps ** 2)
    one = np.ones(n_samples)
    p_a = np.dot(kernel, one)
    kernel_p = walk / np.outer(p_a, p_a)
    dd = np.dot(kernel_p, one) ** 0.5
    walk = kernel_p / np.outer(dd, dd)

    vecs, eigs, _ = la.svd(walk, full_matrices=False)
    vecs = vecs / vecs[:, 0][:, None]
    diffusion_coordinates = vecs[:, 1:d + 1].T * (eigs[1:d + 1][:, None] ** t)

    return diffusion_coordinates

拡散マップの要点は、遠くのポイントよりも近くのポイントを訪れる可能性がはるかに高くなるように、データに対してランダム ウォークを形成することです。次に、ポイント間の距離 (拡散距離) を定義できます。これは、本質的に、すべての可能なパスで 2 つのポイント間を移動する平均確率です。秘訣は、これは実際には非常に簡単に計算できるということです。行列を対角化し、固有ベクトルを使用してデータを低次元空間に埋め込むだけです。この埋め込みでは、ユークリッド距離は近似誤差までの拡散距離です。

于 2016-02-01T18:39:08.010 に答える