用Caffe-Python实现一个两层神经网络

1. 首先准备一下原始数据

# *-* coding: utf-8 *-*
import pickle
import numpy as np
#  划分类别的边界
def cos_curve(x):
    return 0.25*np.sin(2*x*np.pi+0.5*np.pi) + 0.5
#  samples保存二维点的坐标,labels标明类别
np.random.seed(123)
samples = []
labels = []
#  单位空间内平均样本数为50
sample_density = 50
for i in range(sample_density):
    x1, x2 = np.random.random(2)
    #  计算当前x1对应的分类边界
    bound = cos_curve(x1)
    #  为了方便可视化,舍弃太靠近边界的样本
    if bound - 0.1 < x2 <= bound + 0.1:
        continue
    else:
        samples.append((x1, x2))
        #  打标签,上半部分为1,下半部分为2
        if x2 > bound:
            labels.append(1)
        else:
            labels.append(0)
#  将生成的样本和标签保存
with open('data.pkl', 'wb') as f:
    pickle.dump((samples, labels), f)
#  进行数据可视化
import matplotlib.pyplot as plt
for i, sample in enumerate(samples):
    plt.plot(sample[0], sample[1], 'o' if labels[i] else '^', mec='r' if labels[i] else 'b', mfc='none', markersize=10)
x1 = np.linspace(0, 1)
plt.plot(x1, cos_curve(x1), 'k--')
plt.show()
生成的数据

2. 用HDF5准备坐标数据和对应标签。

# *-* coding: utf-8 *-*
import pickle
import numpy as np
import h5py
#  读取先前保存好的数据
with open('data.pkl', 'rb') as f:
    samples, labels = pickle.load(f)
sample_size = len(labels)
#  按照HDF5格式要求制作数据
samples = np.array(samples).reshape((sample_size, 2))
labels = np.array(labels).reshape((sample_size, 1))
#  生成HDF5格式数据
h5_filename = 'data.h5'
with h5py.File(h5_filename, 'w') as h:
    h.create_dataset('data', data=samples)
    h.create_dataset('label', data=labels)
#  生成HDF5数据列表
with open('data_h5.txt', 'w') as f:
    f.write(h5_filename)

这部分结束之后,生成data.h5和data_h5.txt。

3.做训练网络以及train.prototxt

name: "SimpleMLP"
input: "data"
input_shape {
    dim: 1
    dim: 2
}
layer {
    name: "fc1"
    type: "InnerProduct"
    bottom: "data"
    top: "fc1"
    inner_product_param {
        num_output: 2
    }
}

layer {
    name: "sigmoid1"
    type: "Sigmoid"
    bottom: "fc1"
    top: "sigmoid1"
}

layer {
    name: "fc2"
    type: "InnerProduct"
    bottom: "sigmoid1"
    top: "fc2"
    inner_product_param {
        num_output: 2
    }
}

layer {
    name: "softmax"
    type: "Softmax"
    bottom: "fc2"
    top: "prob"
}

就这样完成了一个两层神经网络的设计。
接下来将这个网络进行可视化,利用caffe提供的draw_net.py实现,需要安装graphviz和pydot。
遇到的问题在我的另一篇文章用draw_net.py绘制网络图时的小问题中有给出解决方法。
如果你在使用pycharm编辑器的话,需要在run之前给出一些需要设置的参数,第一个参数为train.prototxt,第二个为生成图像的位置,第三个--randir为生成layers的排列顺序,默认为横向,BT为竖直生成。

要进行python之前的参数设置

这样运行之后,就生成了一张网络图:

net

3.进行训练

# *-* coding: utf-8 *-*

import sys
import numpy as np
import caffe

# caffe的python入口
sys.path.append('D:/new_caffe/caffe/python')
# 初始化一个SGDSolver
solver = caffe.SGDSolver('solver.prototxt')
# 开始训练
solver.solve()
# 获取训练好的网络
net = solver.net
# 制定一个输入数据,比如取值范围平面的中心
net.blobs['data'] = np.array([[0.5, 0.5]])
# 执行前向计算
output = net.forward()
# 输出结果
print output

训练过程:

训练过程1
训练过程2

并且生成了相应的权重文件:


caffemodel

4.写test.prototxt

name: "SimpleMLP"
input: "data"
input_shape {
    dim: 1
    dim: 2
}
layer {
    name: "fc1"
    type: "InnerProduct"
    bottom: "data"
    top: "fc1"
    inner_product_param {
        num_output: 2
    }
}

layer {
    name: "sigmoid1"
    type: "Sigmoid"
    bottom: "fc1"
    top: "sigmoid1"
}

layer {
    name: "fc2"
    type: "InnerProduct"
    bottom: "sigmoid1"
    top: "fc2"
    inner_product_param {
        num_output: 2
    }
}

layer {
    name: "softmax"
    type: "Softmax"
    bottom: "fc2"
    top: "prob"
}

用于使用训练好的模型进行test。

5.来test模型,并且生成可视化的结果

# *-* coding:utf-8 *-*

import sys
import pickle
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

sys.path.append('D:/new_caffe/caffe/python')
import caffe

# 构建一个网络用语Inference
# 网络结构是test.prototxt,权重从训练好的simple_mlp_iter_2000.caffemodel中获取
net = caffe.Net('test.prototxt', "simple_mlp_iter_2000.caffemodel", caffe.TEST)
# 读取二维样本及标签
with open('data.pkl', 'rb') as f:
    samples, labels = pickle.load(f)
samples = np.array(samples)
labels = np.array(labels)
# 进行可视化
# 第一步可视化概率值平面
X = np.arange(0, 1.05, 0.05)
Y = np.arange(0, 1.05, 0.05)
X, Y = np.meshgrid(X, Y)
grids = np.array([[X[i][j], Y[i][j]] for i in range(X.shape[0]) for j in range(X.shape[1])])
grid_probs = []
for grid in grids:
    net.blobs['data'].data[...] = grid.reshape((1, 2))[...]
    output = net.forward()
    grid_probs.append(output['prob'][0][1])
grid_probs = np.array(grid_probs).reshape(X.shape)
fig = plt.figure('Sample Surface')
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, grid_probs, alpha=0.15, color='k', rstride=2, cstride=2, lw=0.5)

# 对所有样本及对应概率进行可视化
samples0 = samples[labels == 0]
samples0_probs = []
for sample in samples0:
    net.blobs['data'].data[...] = sample.reshape((1, 2))[...]
    output = net.forward()
    samples0_probs.append(output['prob'][0][1])
samples1 = samples[labels == 1]
samples1_probs = []
for sample in samples1:
    net.blobs['data'].data[...] = sample.reshape((1, 2))[...]
    output = net.forward()
    samples1_probs.append(output['prob'][0][1])
ax.scatter(samples0[:, 0], samples0[:, 1], samples0_probs, c='b', marker='^', s=50)
ax.scatter(samples1[:, 0], samples1[:, 1], samples1_probs, c='r', marker='o', s=50)
plt.show()

test过程:

test过程

生成结果:

结果
参考资料:《深度学习与计算机视觉 》 叶韵 编著
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容