1

関数を学習するためにニューラルネットをトレーニングしようとしていますy = x1 + x2 + x3。目的は、Caffe をよりよく学び、理解するために Caffe をいじることです。必要なデータは Python で合成的に生成され、lmdb データベース ファイルとしてメモリに書き込まれます。

データ生成のコード:

import numpy as np
import lmdb
import caffe

Ntrain = 100
Ntest = 20
K = 3
H = 1
W = 1

Xtrain = np.random.randint(0,1000, size = (Ntrain,K,H,W))
Xtest = np.random.randint(0,1000, size = (Ntest,K,H,W))

ytrain = Xtrain[:,0,0,0] + Xtrain[:,1,0,0] + Xtrain[:,2,0,0]
ytest = Xtest[:,0,0,0] + Xtest[:,1,0,0] + Xtest[:,2,0,0]

env = lmdb.open('expt/expt_train')

for i in range(Ntrain):
    datum = caffe.proto.caffe_pb2.Datum()
    datum.channels = Xtrain.shape[1]
    datum.height = Xtrain.shape[2]
    datum.width = Xtrain.shape[3]
    datum.data = Xtrain[i].tobytes()
    datum.label = int(ytrain[i])
    str_id = '{:08}'.format(i)

    with env.begin(write=True) as txn:
        txn.put(str_id.encode('ascii'), datum.SerializeToString())


env = lmdb.open('expt/expt_test')

for i in range(Ntest):
    datum = caffe.proto.caffe_pb2.Datum()
    datum.channels = Xtest.shape[1]
    datum.height = Xtest.shape[2]
    datum.width = Xtest.shape[3]
    datum.data = Xtest[i].tobytes()
    datum.label = int(ytest[i])
    str_id = '{:08}'.format(i)

    with env.begin(write=True) as txn:
        txn.put(str_id.encode('ascii'), datum.SerializeToString())

Solver.prototext ファイル:

net: "expt/expt.prototxt"

display: 1
max_iter: 200
test_iter: 20
test_interval: 100

base_lr: 0.000001
momentum: 0.9
# weight_decay: 0.0005

lr_policy: "inv"
# gamma: 0.5
# stepsize: 10
# power: 0.75

snapshot_prefix: "expt/expt"
snapshot_diff: true

solver_mode: CPU
solver_type: SGD

debug_info: true

カフェ モデル:

name: "expt"


layer {
    name: "Expt_Data_Train"
    type: "Data"
    top: "data"
    top: "label"    

    include {
        phase: TRAIN
    }

    data_param {
        source: "expt/expt_train"
        backend: LMDB
        batch_size: 1
    }
}


layer {
    name: "Expt_Data_Validate"
    type: "Data"
    top: "data"
    top: "label"    

    include {
        phase: TEST
    }

    data_param {
        source: "expt/expt_test"
        backend: LMDB
        batch_size: 1
    }
}


layer {
    name: "IP"
    type: "InnerProduct"
    bottom: "data"
    top: "ip"

    inner_product_param {
        num_output: 1

        weight_filler {
            type: 'constant'
        }

        bias_filler {
            type: 'constant'
        }
    }
}


layer {
    name: "Loss"
    type: "EuclideanLoss"
    bottom: "ip"
    bottom: "label"
    top: "loss"
}

取得しているテスト データの損失は です233,655。損失は​​トレーニング データ セットとテスト データ セットの数値よりも 3 桁大きいため、これは衝撃的です。また、学習する関数は単純な線形関数です。コードのどこが間違っているのかわかりません。提案/入力は大歓迎です。

4

1 に答える 1

1

この場合、Caffe は 形式のデータ (つまりdatum.data) とuint8形式のラベル ( datum.label)のみを受け入れるため、生成される損失は大きくなりint32ます。ただし、ラベルについては、numpy.int64フォーマットも機能しているようです。Caffe は主に、入力が [0,255] の範囲の RGB 値を持つ画像であるコンピューター ビジョン タスク用に開発されたためdatum.data、形式でのみ受け入れられると思います。最小量のメモリを使用してこれをキャプチャできます。データ生成コードに次の変更を加えました。uint8uint8

Xtrain = np.uint8(np.random.randint(0,256, size = (Ntrain,K,H,W)))
Xtest = np.uint8(np.random.randint(0,256, size = (Ntest,K,H,W)))

ytrain = int(Xtrain[:,0,0,0]) + int(Xtrain[:,1,0,0]) + int(Xtrain[:,2,0,0])
ytest = int(Xtest[:,0,0,0]) + int(Xtest[:,1,0,0]) + int(Xtest[:,2,0,0])

ネット パラメータ (学習率、反復回数など) をいじってみたところ、10^(-6) のオーダーのエラーが発生しました。これはかなり良いと思います!

于 2015-06-26T20:03:38.397 に答える