如何强制caffe读取所有训练数据?
How to force caffe read all training data?
我正在使用 caffe,但输入仍然有问题。
这是我的 solver.prototxt:
train_net: "auto_train.prototxt"
test_net: "auto_test.prototxt"
test_iter: 800
test_interval: 20
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "sed"
solver_mode: GPU
这是 运行 python 脚本:
import os
PROJECT_HOME = '/home/romulus/code/project/'
CAFFE_HOME = '/home/romulus/code/caffe/'
os.chdir(PROJECT_HOME)
import sys
sys.path.insert(0, CAFFE_HOME + 'caffe/python')
import caffe, h5py
from pylab import *
from caffe import layers as L, params as P
OUTPUT_DIM = 8
def net(db, batch_size):
n = caffe.NetSpec()
n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LEVELDB, source=db,
transform_param=dict(scale=1./255), ntop=2)
n.ip1 = L.InnerProduct(n.data, num_output=500, weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=500, weight_filler=dict(type='xavier'))
n.relu2 = L.ReLU(n.ip2, in_place=True)
n.ip3 = L.InnerProduct(n.relu2, num_output=OUTPUT_DIM, weight_filler=dict(type='xavier'))
n.loss = L.SoftmaxWithLoss(n.ip3, n.label)
return n.to_proto()
with open('/home/romulus/code/project/auto_train.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/traindb', 64)))
with open('/home/romulus/code/project/auto_test.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/testdb', 100)))
caffe.set_device(0)
caffe.set_mode_gpu()
solver = caffe.SGDSolver(PROJECT_HOME + 'auto_solver.prototxt')
solver.net.forward() # train net
solver.test_nets[0].forward() # test net (there can be more than one)
niter = 500
test_interval = 15
train_loss = zeros(niter)
test_acc = zeros(int(np.ceil(niter * 1.0 / test_interval)))
output = zeros((niter, 8, OUTPUT_DIM))
for it in range(niter):
solver.step(1) # SGD by Caffe
train_loss[it] = solver.net.blobs['loss'].data
solver.test_nets[0].forward(start='ip1')
output[it] = solver.test_nets[0].blobs['ip3'].data[:8]
if it % test_interval == 0:
print 'Iteration', it, 'testing...'
correct = 0
for test_it in range(1):
solver.test_nets[0].forward()
correct += sum(solver.test_nets[0].blobs['ip3'].data.argmax(1)
== solver.test_nets[0].blobs['label'].data)
test_acc[it // test_interval] = correct * 1.0 / len(data)
_, ax1 = subplots()
ax2 = ax1.twinx()
ax1.plot(arange(niter), train_loss)
ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r')
ax1.set_xlabel('iteration')
ax1.set_ylabel('train loss')
ax2.set_ylabel('test accuracy')
_.savefig('converge.png')
数据是手动生成的,每个数据都是一个1x256的向量,所有相同的scale值为8 * label value
。这意味着,带有标签 3 的数据是 [ 24, 24, 24, 24, 24...., 24, 24]。我有8个标签,总共80000条数据。
我的问题是,如果我将数据放入带有标签顺序的 leveldb,如 0,1,2,3,4,5,6,7,8,0,1,2,3,4,5...
,caffe 可以很好地训练网络。但是如果我按 0,0,...,0,0,1,1,1,...,1,1,2,2,...
排序,caffe 就无法学习。如果我将 solver.prototxt 中的 test_iter
减少到 100,caffe 将始终说输出标签为 0.
好像caffe没有读取所有的训练数据,只读取前面的东西。但除了训练批次,我找不到任何描述它的东西。
事实上,如果我将训练批量大小增加到 80000,caffe 会再次训练得很好。虽然很慢,也不是所谓的batch
有人可以帮忙吗?谢谢!
以随机顺序输入数据始终是一个好习惯:如果您的数据以 "sorted" 方式输入,梯度将每批采用非常退化的方向,从而产生较差的训练结果。
caffe"sees"训练时的训练样例数是max_iter
*batch_size
,所以如果你设置这两个参数超过你拥有的训练样例数,你应该涵盖您在训练期间拥有的所有数据。
我正在使用 caffe,但输入仍然有问题。
这是我的 solver.prototxt:
train_net: "auto_train.prototxt" test_net: "auto_test.prototxt" test_iter: 800 test_interval: 20 base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 lr_policy: "inv" gamma: 0.0001 power: 0.75 display: 100 max_iter: 10000 snapshot: 5000 snapshot_prefix: "sed" solver_mode: GPU
这是 运行 python 脚本:
import os PROJECT_HOME = '/home/romulus/code/project/' CAFFE_HOME = '/home/romulus/code/caffe/' os.chdir(PROJECT_HOME) import sys sys.path.insert(0, CAFFE_HOME + 'caffe/python') import caffe, h5py from pylab import * from caffe import layers as L, params as P OUTPUT_DIM = 8 def net(db, batch_size): n = caffe.NetSpec() n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LEVELDB, source=db, transform_param=dict(scale=1./255), ntop=2) n.ip1 = L.InnerProduct(n.data, num_output=500, weight_filler=dict(type='xavier')) n.relu1 = L.ReLU(n.ip1, in_place=True) n.ip2 = L.InnerProduct(n.relu1, num_output=500, weight_filler=dict(type='xavier')) n.relu2 = L.ReLU(n.ip2, in_place=True) n.ip3 = L.InnerProduct(n.relu2, num_output=OUTPUT_DIM, weight_filler=dict(type='xavier')) n.loss = L.SoftmaxWithLoss(n.ip3, n.label) return n.to_proto() with open('/home/romulus/code/project/auto_train.prototxt', 'w') as f: f.write(str(net('/home/romulus/code/project/traindb', 64))) with open('/home/romulus/code/project/auto_test.prototxt', 'w') as f: f.write(str(net('/home/romulus/code/project/testdb', 100))) caffe.set_device(0) caffe.set_mode_gpu() solver = caffe.SGDSolver(PROJECT_HOME + 'auto_solver.prototxt') solver.net.forward() # train net solver.test_nets[0].forward() # test net (there can be more than one) niter = 500 test_interval = 15 train_loss = zeros(niter) test_acc = zeros(int(np.ceil(niter * 1.0 / test_interval))) output = zeros((niter, 8, OUTPUT_DIM)) for it in range(niter): solver.step(1) # SGD by Caffe train_loss[it] = solver.net.blobs['loss'].data solver.test_nets[0].forward(start='ip1') output[it] = solver.test_nets[0].blobs['ip3'].data[:8] if it % test_interval == 0: print 'Iteration', it, 'testing...' correct = 0 for test_it in range(1): solver.test_nets[0].forward() correct += sum(solver.test_nets[0].blobs['ip3'].data.argmax(1) == solver.test_nets[0].blobs['label'].data) test_acc[it // test_interval] = correct * 1.0 / len(data) _, ax1 = subplots() ax2 = ax1.twinx() ax1.plot(arange(niter), train_loss) ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r') ax1.set_xlabel('iteration') ax1.set_ylabel('train loss') ax2.set_ylabel('test accuracy') _.savefig('converge.png')
数据是手动生成的,每个数据都是一个1x256的向量,所有相同的scale值为8 * label value
。这意味着,带有标签 3 的数据是 [ 24, 24, 24, 24, 24...., 24, 24]。我有8个标签,总共80000条数据。
我的问题是,如果我将数据放入带有标签顺序的 leveldb,如 0,1,2,3,4,5,6,7,8,0,1,2,3,4,5...
,caffe 可以很好地训练网络。但是如果我按 0,0,...,0,0,1,1,1,...,1,1,2,2,...
排序,caffe 就无法学习。如果我将 solver.prototxt 中的 test_iter
减少到 100,caffe 将始终说输出标签为 0.
好像caffe没有读取所有的训练数据,只读取前面的东西。但除了训练批次,我找不到任何描述它的东西。
事实上,如果我将训练批量大小增加到 80000,caffe 会再次训练得很好。虽然很慢,也不是所谓的batch
有人可以帮忙吗?谢谢!
以随机顺序输入数据始终是一个好习惯:如果您的数据以 "sorted" 方式输入,梯度将每批采用非常退化的方向,从而产生较差的训练结果。
caffe"sees"训练时的训练样例数是max_iter
*batch_size
,所以如果你设置这两个参数超过你拥有的训练样例数,你应该涵盖您在训练期间拥有的所有数据。