こんにちは
よろしくお願いします。
Chainerを使い始めたDeepLearning初学者です。1つわからない問題がありご質問させて頂きます。
入力が1875次元の2値分類のネットワークを以下の様に組み
model = chainer.FunctionSet(l1=F.Linear(1875, 2000),
l2=F.Linear(2000, 1000),
l3=F.Linear(1000, 256),
l4=F.Linear(256, 2))
学習させた所、lossがnanもしくは-infになり正しく学習されて無いように見えました。(ロス関数はサンプルにあったsoftmax_cross_entropyを使っています。)(関係無いかもしれないですが、入力データの数値が大きすぎてoverflowを起こしていた問題は気づいて修正しました。現在は1875次元全ての入力は有効数字5桁以内の数値です。)
他に試した以下の様な簡単なネットワークでも
def __init__(self):
super(ThreeHiddenNN, self).__init__(
l1=chainer.functions.Linear(5, 10),
l2=chainer.functions.Linear(10, 10),
l3=chainer.functions.Linear(10, 2)
)
上の構造では正しく動いている様に見えましたが、
中間層を1000や2000など試しに大きく取ってみると、やはりlossがnanになります。
lossがnanになる際に必ずWarningで
/usr/local/lib/python2.7/site-packages/chainer/functions/loss/softmax_cross_entropy.py:44: RuntimeWarning: divide by zero encountered in log
y = numpy.log(p).sum(keepdims=True) * (-1.0 / count)
が出ます。これは何故でしょうか?
もしこの質問がニューラルネットの初歩的な質問である場合はご容赦ください。
初めの入力1875次元のネットワークのlossの計算についてアドバイス頂けましたら幸いです。
よろしくお願いします。
関連するソース
# モデルの設定 or 保存されたモデルの読み込み
if args.model != 0:
if args.gpu >= 0:
cuda.init(args.gpu)
model = pickle.load(open(args.model, 'rb'))
else:
model = chainer.FunctionSet(l1=F.Linear(1875, 2000),
l2=F.Linear(2000, 1000),
l3=F.Linear(1000, 256),
l4=F.Linear(256, 2))
def forward(x_data, y_data, train=True):
x, t = chainer.Variable(x_data, volatile=not train), chainer.Variable(
y_data, volatile=not train)
h = F.dropout(F.relu(model.l1(x)), train=train)
h = F.dropout(F.relu(model.l2(h)), train=train)
h = F.dropout(F.relu(model.l3(h)), train=train)
y = model.l4(h)
print("predict: {}".format(y.data.argmax()))
print("answer: {}".format(t.data[0]))
return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
optimizer = optimizers.Adam()
optimizer.setup(model)
翔