11

非常に単純な CNN 構造を使用して非画像データを分類するために Caffe を使用しています。次元 nx 1 x 156 x 12 の HDF5 データでネットワークをトレーニングするのに問題はありませんでした。しかし、新しいデータを分類するのに苦労しています。

前処理なしで単純なフォワードパスを行うにはどうすればよいですか? 私のデータは正規化されており、Caffe の正しい次元を持っています (ネットのトレーニングに既に使用されています)。以下は私のコードと CNN 構造です。

編集:問題を pycaffe.py の関数 '_Net_forward' に分離し、self.input dict が空であるために問題が発生することを発見しました。その理由を説明できる人はいますか?セットは、新しいテスト データから得られるセットと等しいと想定されます。

if set(kwargs.keys()) != set(self.inputs):
            raise Exception('Input blob arguments do not match net inputs.')

データをデータに変換するために IO メソッドを使用するようになったため、コードが少し変更されました (以下を参照)。このようにして、kwargs 変数に正しいデータを入力しました。

小さなヒントでも大歓迎です!

    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt

    # Make sure that caffe is on the python path:
    caffe_root = ''  # this file is expected to be run from {caffe_root}
    import sys
    sys.path.insert(0, caffe_root + 'python')

    import caffe

    import os
    import subprocess
    import h5py
    import shutil
    import tempfile

    import sklearn
    import sklearn.datasets
    import sklearn.linear_model
    import skimage.io



    def LoadFromHDF5(dataset='test_reduced.h5', path='Bjarke/hdf5_classification/data/'):

        f   = h5py.File(path + dataset, 'r')
        dat = f['data'][:]
        f.close()   

        return dat;

    def runModelPython():
        model_file = 'Bjarke/hdf5_classification/conv_v2_simple.prototxt'
        pretrained = 'Bjarke/hdf5_classification/data/train_iter_10000.caffemodel'
        test_data = LoadFromHDF5()

        net = caffe.Net(model_file, pretrained)
        caffe.set_mode_cpu()
        caffe.set_phase_test()  

        user = test_data[0,:,:,:] 
        datum = caffe.io.array_to_datum(user.astype(np.uint8))
        user_dat = caffe.io.datum_to_array(datum)
        user_dat = user_dat.astype(np.uint8)
        out = net.forward_all(data=np.asarray([user_dat]))

if __name__ == '__main__':
    runModelPython()

CNN 原文

name: "CDR-CNN"
layers {
  name: "data"
  type: HDF5_DATA
  top: "data"
  top: "label"
  hdf5_data_param {
    source: "Bjarke/hdf5_classification/data/train.txt"
    batch_size: 10
  }
  include: { phase: TRAIN }
}
layers {
  name: "data"
  type: HDF5_DATA
  top: "data"
  top: "label"
  hdf5_data_param {
    source: "Bjarke/hdf5_classification/data/test.txt"
    batch_size: 10
  }
  include: { phase: TEST }
}

layers {
  name: "feature_conv"
  type: CONVOLUTION
  bottom: "data"
  top: "feature_conv"
  blobs_lr: 1
  blobs_lr: 2
  convolution_param {
    num_output: 10
    kernel_w: 12
    kernel_h: 1
    stride_w: 1
    stride_h: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
    }
  }
}
layers {
  name: "conv1"
  type: CONVOLUTION
  bottom: "feature_conv"
  top: "conv1"
  blobs_lr: 1
  blobs_lr: 2
  convolution_param {
    num_output: 14
    kernel_w: 1
    kernel_h: 4
    stride_w: 1
    stride_h: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
    }
  }
}
layers {
  name: "pool1"
  type: POOLING
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_w: 1
    kernel_h: 3
    stride_w: 1
    stride_h: 3
  }
}
layers {
  name: "conv2"
  type: CONVOLUTION
  bottom: "pool1"
  top: "conv2"
  blobs_lr: 1
  blobs_lr: 2
  convolution_param {
    num_output: 120
    kernel_w: 1
    kernel_h: 5
    stride_w: 1
    stride_h: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
    }
  }
}
layers {
  name: "fc1"
  type: INNER_PRODUCT
  bottom: "conv2"
  top: "fc1"
  blobs_lr: 1
  blobs_lr: 2
  weight_decay: 1
  weight_decay: 0
  inner_product_param {
    num_output: 84
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layers {
  name: "accuracy"
  type: ACCURACY
  bottom: "fc1"
  bottom: "label"
  top: "accuracy"
  include: { phase: TEST }
}
layers {
  name: "loss"
  type: SOFTMAX_LOSS
  bottom: "fc1"
  bottom: "label"
  top: "loss"
}
4

4 に答える 4

9

Caffe Google Groups で得た Evan Shelhamer からの回答は次のとおりです。

self._inputs実際、prototxt の入力フィールドで定義されている手動または「デプロイ」入力用です。pycaffe を介してデータ層を含むネットを実行するには、net.forward()引数なしで呼び出すだけです。トレーニングまたはテスト ネットの定義を変更する必要はありません。

たとえば、 Python LeNet の例のコード セル [10] を参照してください。

実際、 Instant Recognition with Caffe チュートリアルのセル 6の方がわかりやすいと思います。

# Feed in the image (with some preprocessing) and classify with a forward pass.
net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image(caffe_root + 'examples/images/cat.jpg'))
out = net.forward()
print("Predicted class is #{}.".format(out['prob'].argmax()))

つまり、pycaffe を使用して予測出力とその確率を生成するには、モデルをトレーニングしたら、まず入力をデータ レイヤーにフィードし、次に でフォワード パスを実行する必要がありnet.forward()ます。


または、他の回答で指摘されているように、訓練されたネットワークを定義するために使用するものと同様の deploy prototxt を使用できますが、入力層と出力層を削除し、最初に以下を追加します (明らかに入力に従って適応します)寸法):

name: "your_net"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 1
input_dim: 250

それがCIFAR10 チュートリアルで使用されているものです。

(pycaffe はもっと詳しく文書化されるべきです…)

于 2015-07-13T18:44:38.853 に答える
1

私はまったく同じ問題を抱えています。これがそれを修正したものです。

まず、トレーニングに使用したのと同じ prototext ファイルを使用して、2 つのデータ レイヤーを削除します。

次に、上記のマークのようにブロックを追加します

name: "Name_of_your_net"
input: "data"
input_dim: 64 
input_dim: 1
input_dim: 28
input_dim: 28

私のinput_dimはmnist用です。それらをあなたのdimに変更してください。

すべてが機能します。

于 2015-07-11T18:04:23.697 に答える