美文网首页
用Caffe-Python实现一个两层神经网络

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

作者: WZChan | 来源:发表于2017-10-19 19:25 被阅读0次

    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过程

    生成结果:

    结果
    参考资料:《深度学习与计算机视觉 》 叶韵 编著

    相关文章

      网友评论

          本文标题:用Caffe-Python实现一个两层神经网络

          本文链接:https://www.haomeiwen.com/subject/ozfpuxtx.html