python 神经网络 多进程_用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为竖直生成。

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

4.进行训练

# *-* 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

训练过程:

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

5.写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。

6.来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过程:

生成结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python实现卷积神经网络需要使用一些工具,例如 NumPy 库来进行矩阵运算和 TensorFlow 或 PyTorch 库来构建和训练模型。 要使用 TensorFlow 实现卷积神经网络,首先需要安装 TensorFlow 库,然后可以使用其中的函数和类来构建模型。 例如,下面是一个简单的卷积神经网络的示例代码: ```python import tensorflow as tf # 输入数据 input_data = tf.placeholder(tf.float32, [None, 28, 28, 1]) # 第一层卷积 conv1 = tf.layers.conv2d(input_data, 32, (5, 5), activation=tf.nn.relu) # 第一层池化 pool1 = tf.layers.max_pooling2d(conv1, (2, 2), (2, 2)) # 第二层卷积 conv2 = tf.layers.conv2d(pool1, 64, (5, 5), activation=tf.nn.relu) # 第二层池化 pool2 = tf.layers.max_pooling2d(conv2, (2, 2), (2, 2)) # 全连接层 fc1 = tf.layers.dense(tf.contrib.layers.flatten(pool2), 1024, activation=tf.nn.relu) # 输出层 output = tf.layers.dense(fc1, 10) ``` 在这段代码中,我们使用了 TensorFlow 中的卷积层、池化层和全连接层来构建卷积神经网络。 要训练模型,还需要定义损失函数、优化器和训练步骤。例如: ```python # 定义损失函数和优化器 loss = tf.loss ### 回答2: 卷积神经网络(Convolutional Neural Network,CNN)是一种常用于图像识别和计算机视觉任务的深度学习模型。Python提供了多个库和框架来实现卷积神经网络。 在Python中,最常用且流行的框架之一是TensorFlow。TensorFlow提供了丰富的功能以实现卷积神经网络。下面是一个简单的CNN实现步骤: 1. 导入所需的库和模块: ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models ``` 2. 加载和预处理数据集: ```python (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() train_images, test_images = train_images / 255.0, test_images / 255.0 ``` 3. 构建卷积神经网络模型: ```python model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) ``` 4. 添加全连接层和输出层: ```python model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10)) ``` 5. 编译和训练模型: ```python model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) ``` 6. 预测和评估模型: ```python test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print('Test accuracy:', test_acc) ``` 这只是一个简单的例子,实际的卷积神经网络可能更加复杂,包括更多的卷积层、池化层和全连接层。通过调整模型的结构和参数,可以进一步优化CNN的性能。 除了TensorFlow,还有其他一些Python库和框架,如Keras、PyTorch和Caffe,也可以轻松实现卷积神经网络。每个库和框架都有自己的特点和优势,可以根据具体需求选择合适的工具。 ### 回答3: 卷积神经网络(Convolutional Neural Networks, CNN)是一种广泛应用于计算机视觉和图像识别任务的深度学习模型。Python提供了多种库和框架来实现卷积神经网络,其中最受欢迎的是TensorFlow和PyTorch。 使用Python实现卷积神经网络的一般步骤如下: 1. 数据准备:首先,需要准备用于训练和测试模型的数据集。可以使用Python的库(如NumPy和Pandas)来加载、处理和转换数据。 2. 模型搭建:在Python中,可以使用TensorFlow或PyTorch等库来定义卷积神经网络模型。首先,需要导入相关库,并创建一个模型对象。然后,可以通过添加各种层(如卷积层、池化层和全连接层)来构建模型结构。 3. 模型训练:训练卷积神经网络需要提供输入数据和相应的标签。可以使用Python的库来分割数据集为训练集和测试集,并在训练集上迭代多次以优化模型参数。通过调用模型对象的训练函数,可以实现模型的训练过程。 4. 模型评估:训练完成后,可以使用测试集数据来评估模型的性能。可以使用Python的库计算准确率和损失函数等指标。 5. 模型预测:训练好的卷积神经网络模型可以用于预测新的未知数据。通过使用训练好的模型对新数据进行前向传播,得到预测结果。 总之,Python是一种强大的编程语言,提供了多种库和框架来实现卷积神经网络。可以根据具体需求选择合适的库和框架,并按照上述步骤进行实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值