标签: deep-learning

解决阶级失衡问题:缩减对损失和sgd的贡献

(已添加此问题的更新.)

我是比利时根特大学的研究生; 我的研究是用深度卷积神经网络进行情感识别.我正在使用Caffe框架来实现CNN.

最近我遇到了关于班级失衡的问题.我正在使用9216个训练样本,约 5%标记为阳性(1),其余样品标记为阴性(0).

我正在使用SigmoidCrossEntropyLoss图层来计算损失.在训练时,即使在几个时期之后,损失也会减少并且准确度非常高.这是由于不平衡:网络总是预测为负(0).(精确度和召回率均为零,支持此声明)

为了解决这个问题,我想根据预测 - 真值组合衡量对损失的贡献(严厉惩罚假阴性).我的导师/教练还建议我通过随机梯度下降(sgd)反向传播时使用比例因子:该因子将与批次中的不平衡相关联.仅包含负样本的批次根本不会更新权重.

我只向Caffe添加了一个自定义图层:报告其他指标,如精度和召回.我对Caffe代码的经验有限,但我有很多编写C++代码的专业知识.


任何人都可以帮助我或指出我如何调整SigmoidCrossEntropyLossSigmoid层以适应以下变化:

  1. 根据预测 - 真值组合调整样本对总损失的贡献(真阳性,假阳性,真阴性,假阴性).
  2. 根据批次中的不平衡(负数与正数)来衡量随机梯度下降所执行的权重更新.

提前致谢!


更新

按照Shai的建议加入了InfogainLossLayer.我还添加了另一个自定义层,H根据当前批次中的不平衡构建了infogain矩阵.

目前,矩阵配置如下:

H(i, j) = 0          if i != j
H(i, j) = 1 - f(i)   if i == j (with f(i) = the frequency of class i in the batch)
Run Code Online (Sandbox Code Playgroud)

我计划将来为矩阵试验不同的配置.

我已经用10:1的不平衡测试了这个.结果表明网络现在正在学习有用的东西:( 30个时期后的结果)

  • 准确度约为.~70%(低于~97%);
  • 精度约为 ~20%(从0%起);
  • 召回是约.~60%(从0%上调). …

c++ machine-learning neural-network deep-learning caffe

32
推荐指数
1
解决办法
7921
查看次数

TensorFlow:关于tf.argmax()和tf.equal()的问题

我正在学习TensorFlow,构建一个多层感知器模型.我正在研究一些例子:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/3_NeuralNetworks/multilayer_perceptron.ipynb

然后,我在下面的代码中有一些问题:

def multilayer_perceptron(x, weights, biases):
    :
    :

pred = multilayer_perceptron(x, weights, biases)
    :
    :

with tf.Session() as sess:
    sess.run(init)
         :
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print ("Accuracy:", accuracy.eval({x: X_test, y: y_test_onehot}))
Run Code Online (Sandbox Code Playgroud)

我想知道做什么tf.argmax(prod,1)tf.argmax(y,1)意味着什么,返回(类型和价值)究竟是什么?并且是correct_prediction变量而不是实际值?

最后,我们如何从tf会话中获取y_test_prediction数组(输入数据时的预测结果X_test)?非常感谢!

neural-network deep-learning tensorflow

31
推荐指数
3
解决办法
4万
查看次数

LSTM自动编码器

我正在尝试构建一个LSTM自动编码器,目的是从序列中获取一个固定大小的矢量,这表示序列尽可能好.该自动编码器由两部分组成:

  • LSTM编码器:获取序列并返回输出向量(return_sequences = False)
  • LSTM解码器:获取输出向量并返回序列(return_sequences = True)

因此,最后,编码器是多对一 LSTM,解码器是一对多 LSTM.

在此输入图像描述 图片来源:Andrej Karpathy

在较高的层次上,编码看起来像这样(类似于这里描述的):

encoder = Model(...)
decoder = Model(...)

autoencoder = Model(encoder.inputs, decoder(encoder(encoder.inputs)))

autoencoder.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

autoencoder.fit(data, data,
          batch_size=100,
          epochs=1500)
Run Code Online (Sandbox Code Playgroud)

data数组的形状(训练样本数,序列长度,输入维数)(1200, 10, 5)如下所示:

array([[[1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0],
        ..., 
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]],
        ... ] …
Run Code Online (Sandbox Code Playgroud)

python machine-learning deep-learning keras tensorflow

31
推荐指数
2
解决办法
2万
查看次数

二维卷积作为矩阵 - 矩阵乘法

我知道在1-d情况下,两个矢量之间的卷积a可以被计算为 b,也可作为在之间的乘积conv(a, b)T_a,其中b是用于相应的托普利兹矩阵T_a.

是否有可能将这个想法扩展到2-D?

给定aa = [5 1 3; 1 1 2; 2 1 3]是否有可能b=[4 3; 1 2]在Toeplitz矩阵中进行转换aT_a在1-D情况下计算矩阵矩阵乘积?

convolution matrix-multiplication neural-network deep-learning conv-neural-network

30
推荐指数
2
解决办法
2万
查看次数

用于音频的卷积神经网络(CNN)

我一直在关注DeepLearning.net上的教程,以学习如何实现从图像中提取特征的卷积神经网络.本教程有很好的解释,易于理解和遵循.

我想扩展相同的CNN,同时从视频(图像+音频)中提取多模态功能.

我知道视频输入只不过是与音频相关的一段时间(例如30 FPS)中显示的一系列图像(像素强度).但是,我真的不明白音频是什么,它是如何工作的,或者它是如何被分解为馈入网络的.

我已经阅读了几篇关于这个主题的论文(多模态特征提取/表示),但没有人解释过如何将音频输入到网络中.

此外,我从我的研究中了解到,多模态表征是我们的大脑真正运作的方式,因为我们没有刻意过滤我们的感官来实现理解.这一切都是在我们不知道的情况下同时发生的(联合代表).一个简单的例子是,如果我们听到狮子吼声,我们立即构成狮子的心理形象,感受到危险,反之亦然.在我们的大脑中发射了多种神经模式,以全面了解狮子的样子,听起来像,感觉,闻起来像是等等.

上面提到的是我的最终目标,但暂时我为了简单起见而打破了我的问题.

如果有人能够阐明音频如何被解剖,然后在卷积神经网络中表现出来,我将非常感激.我还要感谢您对多模态同步,联合表示以及使用多模态数据训练CNN的正确方法的看法.

编辑: 我发现音频可以表示为频谱图.它作为音频的通用格式,表示为具有两个几何尺寸的图形,其中水平线表示时间,垂直表示频率.

在此输入图像描述

是否可以对这些光谱图上的图像使用相同的技术?换句话说,我可以简单地使用这些频谱图作为卷积神经网络的输入图像吗?

convolution feature-extraction neural-network supervised-learning deep-learning

30
推荐指数
2
解决办法
2万
查看次数

神经网络的Python实时图像分类问题

我正在尝试使用caffe和python进行实时图像分类.我在一个过程中使用OpenCV从我的网络摄像头流式传输,并在一个单独的过程中,使用caffe对从网络摄像头拉出的帧执行图像分类.然后我将分类结果传回主线程以标注网络摄像头流.

问题是即使我有一个NVIDIA GPU并且正在执行GPU上的caffe预测,主线程也会变慢.通常没有做任何预测,我的网络摄像头流以30 fps运行; 但是,根据预测,我的网络摄像头流最多可获得15 fps.

我已经验证了caffe在执行预测时确实使用了GPU,而且我的GPU或GPU内存并没有最大化.我还验证了我的CPU内核在程序中的任何时候都没有达到最大限度.我想知道我是做错了什么,或者是否有办法让这两个过程真正分开.任何建议表示赞赏.这是我的代码供参考

class Consumer(multiprocessing.Process):

    def __init__(self, task_queue, result_queue):
        multiprocessing.Process.__init__(self)
        self.task_queue = task_queue
        self.result_queue = result_queue
        #other initialization stuff

    def run(self):
        caffe.set_mode_gpu()
        caffe.set_device(0)
        #Load caffe net -- code omitted 
        while True:
            image = self.task_queue.get()
            #crop image -- code omitted
            text = net.predict(image)
            self.result_queue.put(text)

        return

import cv2
import caffe
import multiprocessing
import Queue 

tasks = multiprocessing.Queue()
results = multiprocessing.Queue()
consumer = Consumer(tasks,results)
consumer.start()

#Creating window and starting video capturer from camera
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
#Try to …
Run Code Online (Sandbox Code Playgroud)

python gpgpu multiprocessing deep-learning caffe

30
推荐指数
1
解决办法
2825
查看次数

TensorFlow中的批处理是什么?

我正在阅读的介绍性文档(TOC在这里)没有定义的情况下引入了这个术语.

[1] https://www.tensorflow.org/get_started/
[2] https://www.tensorflow.org/tutorials/mnist/tf/
Run Code Online (Sandbox Code Playgroud)

machine-learning neural-network deep-learning tensorflow tensor

30
推荐指数
1
解决办法
3万
查看次数

Tensorflow Slim:TypeError:预期int32,得到的列表包含类型为'_Message'的张量

我正在按照教程学习TensorFlow Slim,但是在运行以下代码进行Inception时:

import numpy as np
import os
import tensorflow as tf
import urllib2

from datasets import imagenet
from nets import inception
from preprocessing import inception_preprocessing

slim = tf.contrib.slim

batch_size = 3
image_size = inception.inception_v1.default_image_size
checkpoints_dir = '/tmp/checkpoints/'
with tf.Graph().as_default():
    url = 'https://upload.wikimedia.org/wikipedia/commons/7/70/EnglishCockerSpaniel_simon.jpg'
    image_string = urllib2.urlopen(url).read()
    image = tf.image.decode_jpeg(image_string, channels=3)
    processed_image = inception_preprocessing.preprocess_image(image, image_size, image_size, is_training=False)
    processed_images  = tf.expand_dims(processed_image, 0)

    # Create the model, use the default arg scope to configure the batch norm parameters.
    with slim.arg_scope(inception.inception_v1_arg_scope()):
        logits, …
Run Code Online (Sandbox Code Playgroud)

python machine-learning computer-vision deep-learning tensorflow

30
推荐指数
2
解决办法
3万
查看次数

Max pool layer vs Convolution with stride performance

在大多数体系结构中,conv层后面跟着一个池化层(max/avg等).由于这些汇集层只是选择前一层的输出(即转换),我们是否可以使用带有步幅2的卷积并期望类似的精度结果和减少的过程需求?

deep-learning conv-neural-network max-pooling

29
推荐指数
1
解决办法
1万
查看次数

如何将自定义数据集拆分为训练和测试数据集?

import pandas as pd
import numpy as np
import cv2
from torch.utils.data.dataset import Dataset

class CustomDatasetFromCSV(Dataset):
    def __init__(self, csv_path, transform=None):
        self.data = pd.read_csv(csv_path)
        self.labels = pd.get_dummies(self.data['emotion']).as_matrix()
        self.height = 48
        self.width = 48
        self.transform = transform

    def __getitem__(self, index):
        pixels = self.data['pixels'].tolist()
        faces = []
        for pixel_sequence in pixels:
            face = [int(pixel) for pixel in pixel_sequence.split(' ')]
            # print(np.asarray(face).shape)
            face = np.asarray(face).reshape(self.width, self.height)
            face = cv2.resize(face.astype('uint8'), (self.width, self.height))
            faces.append(face.astype('float32'))
        faces = np.asarray(faces)
        faces = np.expand_dims(faces, -1)
        return faces, self.labels

    def __len__(self): …
Run Code Online (Sandbox Code Playgroud)

python deep-learning pytorch

29
推荐指数
5
解决办法
4万
查看次数