【发布时间】:2016-01-27 20:01:18
【问题描述】:
我正在使用caffe,但仍然无法输入。
这是我的solver.prototxt:
train_net:“auto_train.prototxt” test_net:“auto_test.prototxt” 测试者:800 测试间隔:20 base_lr:0.01 动量:0.9 重量衰减:0.0005 lr_policy:“inv” 伽玛:0.0001 功率:0.75 显示:100 最大迭代器:10000 快照:5000 快照前缀:“sed” 求解器模式:GPU这是正在运行的python脚本:
导入操作系统 PROJECT_HOME = '/home/romulus/code/project/' CAFFE_HOME = '/home/romulus/code/caffe/' os.chdir(PROJECT_HOME) 导入系统 sys.path.insert(0, CAFFE_HOME + 'caffe/python') 导入咖啡,h5py 从 pylab 导入 * 从 caffe 导入层为 L,参数为 P OUTPUT_DIM = 8 定义网络(分贝,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) 返回 n.to_proto() 使用 open('/home/romulus/code/project/auto_train.prototxt', 'w') 作为 f: f.write(str(net('/home/romulus/code/project/traindb', 64))) 使用 open('/home/romulus/code/project/auto_test.prototxt', 'w') 作为 f: f.write(str(net('/home/romulus/code/project/testdb', 100))) caffe.set_device(0) caffe.set_mode_gpu() 求解器 = caffe.SGDSolver(PROJECT_HOME + 'auto_solver.prototxt') solver.net.forward() # 训练网络 solver.test_nets[0].forward() # 测试网(可以有多个) 尼特 = 500 测试间隔 = 15 train_loss = zeros(niter) test_acc = zeros(int(np.ceil(niter * 1.0 / test_interval))) 输出 = 零((niter,8,OUTPUT_DIM)) 在范围内(niter): solver.step(1) # Caffe 的 SGD 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] 如果它 % test_interval == 0: 打印'迭代',它,'测试......' 正确 = 0 对于范围(1)中的 test_it: 求解器.test_nets[0].forward() 正确 += sum(solver.test_nets[0].blobs['ip3'].data.argmax(1) == solver.test_nets[0].blobs['label'].data) test_acc[it // test_interval] = 正确 * 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('迭代') ax1.set_ylabel('训练损失') ax2.set_ylabel('测试精度') _.savefig('converge.png')数据是手动生成的,每个数据是一个 1x256 的向量,所有相同的比例值为 8 * label value。这意味着,带有标签 3 的数据是 [24, 24, 24, 24, 24...., 24, 24]。我有 8 个标签和总共 80000 个数据。
我的问题是,如果我以0,1,2,3,4,5,6,7,8,0,1,2,3,4,5... 之类的标签顺序将数据放入 leveldb,caffe 可以很好地训练网络。但是如果我按0,0,...,0,0,1,1,1,...,1,1,2,2,... 订购,caffe 无法学习。如果我将solver.prototxt中的test_iter减少到100,caffe总是会说输出标签是0。
似乎 caffe 并没有读取所有的训练数据,而只是读取了前面的一些数据。但除了训练批次外,我找不到任何描述它的东西。
事实上,如果我将训练批大小增加到 80000,caffe 会再次很好地训练。虽然速度很慢,也不是所谓的批处理。
谁能帮忙?谢谢!
【问题讨论】:
标签: caffe python neural-network deep-learning caffe