训练Caffe CNN以输出多维特征

时间:2018-10-24 20:59:28

标签: deep-learning caffe pycaffe

我想使用Caffe的CNN构建特征提取器,并且我已经有大量输入特征和所需输出特征的样本。

现在,我需要训练一些卷积层,以学习如何将输入特征转换为输出。

我的问题是:如何在Caffe上实现这一目标?

作为一个最小的示例,假设我想训练一个CNN来反转2D数组的值。

例如,如果我输入的是

[[0,1,0],
 [1,1,1],
 [0,1,0]]

CNN应该输出

[[1,0,1],
 [0,0,0],
 [1,0,1]].

对于

[[0,0,0],
 [0,1,0],
 [0,0,0]]

输出应为

[[1,1,1],
 [1,0,1],
 [1,1,1]]

以此类推。

当然,这只是一个最小的例子,如果不使用多重卷积,几乎不可能解决实际问题。

我能够针对此问题创建此代码。最后,我使用了欧几里得损失,但不幸的是,CNN没有学到任何东西。

ROOT_DIR = '/home'

from os.path import join
import numpy as np
import h5py
from itertools import product
import caffe
from caffe import layers
from caffe.proto import caffe_pb2

#%% GENERATE DATA
data_in = np.array([np.array(seq).reshape(1,3,3) for seq in product([0,1], repeat=9)])
data_out = np.array([-1*array+1 for array in data_in])

with open(join(ROOT_DIR, 'data.txt'), 'w') as ftxt:
    with h5py.File(join(ROOT_DIR, 'data.hdf5'), 'w') as fhdf5:
        fhdf5['data'] = data_in.astype(np.float32)
        fhdf5['label'] = data_out.astype(np.float32)
        ftxt.write(join(ROOT_DIR, 'data.hdf5'))

#%%DEFINE NET
net = caffe.NetSpec()
net.data, net.label = layers.HDF5Data(batch_size=64, source=join(ROOT_DIR, 'data.txt'), ntop=2)
net.conv1 = layers.Convolution(net.data, kernel_size=1, num_output=128)
net.relu1 = layers.ReLU(net.conv1, in_place=True)
net.conv2 = layers.Convolution(net.relu1, kernel_size=1, num_output=1)
net.relu2 = layers.ReLU(net.conv2, in_place=True)
net.loss = layers.EuclideanLoss(net.relu2, net.label)
net.to_proto()

with open(join(ROOT_DIR, 'invert_net.prototxt'), 'w') as f:
    f.write(str(net.to_proto()))

#%% DEFINE SOLVER
solver = caffe_pb2.SolverParameter()
solver.train_net = join(ROOT_DIR, 'invert_net.prototxt')
solver.max_iter = 10000
solver.base_lr = 0.01
solver.lr_policy = 'fixed'

with open(join(ROOT_DIR, 'solver.prototxt'), 'w') as f:
    f.write(str(solver))

#%% TRAIN NET
caffe.set_mode_cpu()
solver = caffe.SGDSolver(join(ROOT_DIR, 'solver.prototxt'))
solver.solve()

0 个答案:

没有答案