使用卷积神经网络做回归任务

Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域。绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还真没有很现成的例子。这篇举个简单的小例子说明一下如何用Caffe和卷积神经网络(CNN: Convolutional Neural Networks)做基于回归的应用。

原理

最经典的CNN结构一般都是几个卷积层,后面接全连接(FC: Fully Connected)层,最后接一个Softmax层输出预测的分类概率。如果把图像的矩阵也看成是一个向量的话,CNN中无论是卷积还是FC,就是不断地把一个向量变换成另一个向量(事实上对于单个的filter/feature channel,Caffe里最基础的卷积实现就是向量和矩阵的乘法:Convolution in Caffe: a memo),最后输出就是一个把制定分类的类目数作为维度的概率向量。因为神经网络的风格算是黑盒子学习,所以很直接的想法就是把最后输出的向量的值直接拿来做回归,最后优化的目标函数不再是cross entropy等,而是直接基于实数值的误差。

EuclideanLossLayer

Caffe内置的EuclideanLossLayer就是用来解决上面提到的实值回归的一个办法。EuclideanLossLayer计算如下的误差:

\begin{align}\notag \frac 1 {2N} \sum_{i=1}^N \| x^1_i - x^2_i \|_2^2\end{align}

所以很简单,把标注的值和网络计算出来的值放到EuclideanLossLayer比较差异就可以了。

给图像混乱程度打分的简单例子

用一个给图像混乱程度打分的简单例子来说明如何使用Caffe和EuclideanLossLayer进行回归。

生成基于Ising模型的数据

这里采用统计物理里非常经典的Ising模型的模拟来生成图片,Ising模型可能是统计物理里被人研究最多的模型之一,不过这篇不是讲物理,就略过细节,总之基于这个模型的模拟可以生成如下的图片:

图片中第一个字段是编号,第二个字段对应的分数可以大致认为是图片的有序程度,范围0~1,而这个例子要做的事情就是用一个CNN学习图片的有序程度并预测。

生成图片的Python脚本源于Monte Carlo Simulation of the Ising Model using Python,基于Metropolis算法对Ising模型的模拟,做了一些并行和随机生成图片的修改,在每次模拟的时候随机取一个时间(1e3到1e7之间)点输出到图片,代码如下:

import os
import sys
import datetime

from multiprocessing import Process

import numpy as np
from matplotlib import pyplot

LATTICE_SIZE = 100
SAMPLE_SIZE = 12000
STEP_ORDER_RANGE = [3, 7]
SAMPLE_FOLDER = 'samples'

#----------------------------------------------------------------------#
#   Check periodic boundary conditions
#----------------------------------------------------------------------#
def bc(i):
    if i+1 > LATTICE_SIZE-1:
        return 0
    if i-1 < 0:
        return LATTICE_SIZE - 1
    else:
        return i

#----------------------------------------------------------------------#
#   Calculate internal energy
#----------------------------------------------------------------------#
def energy(system, N, M):
    return -1 * system[N,M] * (system[bc(N-1), M] \
                               + system[bc(N+1), M] \
                               + system[N, bc(M-1)] \
                               + system[N, bc(M+1)])

#----------------------------------------------------------------------#
#   Build the system
#----------------------------------------------------------------------#
def build_system():
    system = np.random.random_integers(0, 1, (LATTICE_SIZE, LATTICE_SIZE))
    system[system==0] = - 1

    return system

#-------------------------------------------
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(CNN)是一种深度学习模型,被广泛应用于图像处理领域。回归任务是CNN的一种应用,主要是预测一个连续值,而不是一个离散的类别。本文将介绍基于tensorflow的CNN回归任务的实现。 1. 数据准备 首先,我们需要准备数据集。对于回归任务,我们需要一个由输入值和对应的输出值组成的数据集。在本文中,我们将使用房价数据集,其中输入值是房子的特征,如面积、房间数量等,输出值是房价。 从sklearn.datasets中导入波士顿房价数据: ```python from sklearn.datasets import load_boston import numpy as np dataset = load_boston() x = dataset.data y = dataset.target x = (x - np.mean(x, axis=0)) / np.std(x, axis=0) # 归一化 ``` 在这里,我们使用了数据归一化的方法,将所有特征缩放到相同的范围内。这有助于提高模型的训练和预测效果。 2. 搭建模型 接下来,我们将使用tensorflow搭建CNN回归模型。模型将包含几个卷积层、池化层和全连接层。 ```python import tensorflow as tf model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(x.shape[1], 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse') ``` 在这里,我们选用了一个具有32个过滤器(filter),每个过滤器大小为(3, 3)的卷积层,并使用ReLU激活函数。接下来使用最大池化层得到池化输出进行下一层的输入处理。如此依照此规律搭建下去,最终一维的输出用作房价预测。最后,我们使用均方误差作为损失函数,优化器选用adam。 3. 模型训练和预测 现在,我们可以开始训练模型了。我们将数据集分为训练集和测试集,并使用fit()方法对模型进行训练。 ```python x = np.expand_dims(x, axis=2) model.fit(x, y, batch_size=32, epochs=50, validation_split=0.1) ``` 接下来,我们可以使用predict()方法对新数据进行预测。 ```python x_test = np.random.rand(10, x.shape[1], 1) y_pred = model.predict(x_test) print(y_pred) ``` 在这里,我们生成了一个十个样本的测试集,并使用predict()方法对其进行预测。 总结 本文介绍了如何使用tensorflow搭建卷积神经网络回归模型,并使用boston房价数据集进行训练和预测。通过本文的学习,你可以了解CNN回归任务的基本概念和实现方法,帮助你更好地理解深度学习模型的应用和应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值