Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于图像的多输入CNN_Python_Deep Learning_Conv Neural Network - Fatal编程技术网

Python 用于图像的多输入CNN

Python 用于图像的多输入CNN,python,deep-learning,conv-neural-network,Python,Deep Learning,Conv Neural Network,我想创建一个网络,将n帧作为一个输入,并将其标记为一个分类器 我想建立两个网络 首先:使用Alexnet、Googlenet等模型来实现这一点。 第二:使用LSTM模型来实现这一点 顺便说一下,n帧是来自视频帧的连续帧。我想这对第一款车型来说并不重要。对第二个很重要 我对图像深度学习世界很陌生。我正在使用Keras,但我不知道如何构建这个网络,我必须这么做。特别是第一个。Alexnet体系结构只需要输入一个帧,但我想给输入一个n帧 这只是我尝试的一个例子。我选择n=5。要将n帧作为输入,我将n

我想创建一个网络,将n帧作为一个输入,并将其标记为一个分类器

我想建立两个网络

首先:使用Alexnet、Googlenet等模型来实现这一点。 第二:使用LSTM模型来实现这一点

顺便说一下,n帧是来自视频帧的连续帧。我想这对第一款车型来说并不重要。对第二个很重要

我对图像深度学习世界很陌生。我正在使用Keras,但我不知道如何构建这个网络,我必须这么做。特别是第一个。Alexnet体系结构只需要输入一个帧,但我想给输入一个n帧

这只是我尝试的一个例子。我选择n=5。要将n帧作为输入,我将n帧堆叠为通道。当我告诉你我做了什么时,人们说,“哦,我的上帝,你在做什么。”我不明白为什么。(FlowNet架构没有使用这种方式?)但我仍然不知道如何才能做到这一点

img1 = cv2.cvtColor(cv2.imread('frame0'),cv2.COLOR_BGR2GRAY) # 64x64x1
img2 = cv2.cvtColor(cv2.imread('frame1'),cv2.COLOR_BGR2GRAY) # 64x64x1
img3 = cv2.cvtColor(cv2.imread('frame2'),cv2.COLOR_BGR2GRAY) # 64x64x1
img4 = cv2.cvtColor(cv2.imread('frame3'),cv2.COLOR_BGR2GRAY) # 64x64x1
img5 = cv2.cvtColor(cv2.imread('frame4'),cv2.COLOR_BGR2GRAY) # 64x64x1

# this is only a sample for label1. (a sample = 5 sequential frames)
a_sample_for_label1 = np.stack([img1,img2,img3,img4,img5],axis=2) # gives me 64x64x5

img1_ = cv2.cvtColor(cv2.imread('other_frame0'),cv2.COLOR_BGR2GRAY) # 64x64x1
img2_ = cv2.cvtColor(cv2.imread('other_frame1'),cv2.COLOR_BGR2GRAY) # 64x64x1
img3_ = cv2.cvtColor(cv2.imread('other_frame2'),cv2.COLOR_BGR2GRAY) # 64x64x1
img4_ = cv2.cvtColor(cv2.imread('other_frame3'),cv2.COLOR_BGR2GRAY) # 64x64x1
img5_ = cv2.cvtColor(cv2.imread('other_frame4'),cv2.COLOR_BGR2GRAY) # 64x64x1

# this is only a sample for label2. (a sample = 5 sequential frames)
a_sample_for_label2 = np.stack([img1_,img2_,img3_,img4_,img5_],axis=2) # gives me 64x64x5


model = alexnet(shape=(64,64,5))
model.compile(...)
model.fit(np.array[a_sample_for_label1,a_sample_for_label2],[1,2])

你必须明白,当你把信息输入到神经网络时,它会从中学习一些东西,将其存储在内存中(更新权重),并忘记输入的内容,这意味着当你按顺序给它帧时,它并不真正关心你给它帧的顺序,它只关注您当前输入到它的帧,这不是我们在处理视频时想要的,我们希望它能够跟踪以前帧中的一些历史,从而在当前帧和它的前一帧之间建立链接,这通常是LSTM或RNN所做的,它们将历史编码到NN中,所以我们要做的是合并传统的CNN和LSTM,将帧历史编码到CNN中。因此,不要单独使用Alexnet和LSTM,而是使用,您可以使用Alexnet作为该网络的主干,它应该可以工作

至于为什么堆叠通道是错误的,你基本上把它与这个合并的信息混淆了,图像的堆叠通道使它将N个图像视为一个,因此这不是我们想要的,另外你可以垂直/水平地堆叠N个图像,所以每个帧的部分都包含在输入中,但这只会给NN带来更多的工作,并可能导致它不学习任何东西,所以您可以做的是,不向所有节点提供输入,而是对这些节点进行N个相等的分区,并将每个映像堆栈提供给一组唯一的节点,所以你要做的是,你会有一个100200,3形状的帧的视频,假设N是5,如果你垂直叠加图像,那么你的NN的输入形状将是500200,3,你可以有1000个输入节点,所以节点0-200将得到0-100200,3像素,帧200-400将得到100-200200,3像素,依此类推。但你也不能保证你的神经网络是否能学到什么

除非你下定决心不使用LSTM CNN,否则你可以尝试上述方法,但我不确定你会得到可行的结果,你最好的方法是使用LSTM-CNN

其他信息编辑:

参考上面的图像,它显示了一个传统的神经网络,我们所做的是将输入层的所有节点馈送给下一层的所有节点,因此如果输入节点实际上是5个图像叠加在一起,那么所有图像都将传递给所有节点,这样神经网络就必须学会区分图像,这不是我们想要的


我的建议如上图所示,将5个图像堆叠在一起,而不是将整个图像堆栈提供给每个输入节点,我们将输入节点划分为多个分区,因此如果我们将5个图像堆叠在一起,我们将划分为5个分区,现在分区1中的节点将只获得第一个图像像素,分区2中的节点将只获得第二个图像像素,依此类推,因此如果有1000个输入节点,前200个将获得图像1,节点200-400将获得图像2,节点400-600将获得图像3,节点600-800将获得图像4,节点800-1000将获得图像5,随后,您可以互连输入层的输出节点,从而实现可行的体系结构。我希望这能更好地说明我的观点:)

你必须明白,当你把信息输入到神经网络时,它会从中学习一些东西,并将其存入内存(更新权重),忘记输入的内容,这意味着当你按顺序给它帧时,它实际上并不关心你给它帧的顺序,它只关注您当前输入到它的帧,这不是我们在处理视频时想要的,我们希望它能够跟踪以前帧中的一些历史,从而在当前帧和它的前一帧之间建立链接,这通常是LSTM或RNN所做的,它们将历史编码到NN中,所以我们要做的是合并传统的CNN和LSTM,将帧历史编码到CNN中。因此,不要单独使用Alexnet和LSTM,而是使用,您可以使用Alexnet作为该网络的主干,它应该可以工作

至于为什么堆叠通道是错误的,你基本上把它与这个合并的信息混淆了,图像的堆叠通道使它将N个图像视为一个,因此这不是我们想要的,另外你可以垂直/水平地堆叠N个图像,所以每个帧的部分都包含在输入中,但这只会给NN带来更多的工作,并可能导致它不学习任何东西,所以您可以做的是,不向所有节点提供输入,而是对这些节点进行N个相等的分区,并将每个映像堆栈提供给一组唯一的节点,所以你要做的是,你会有一个100200,3形状的帧的视频,假设N是5,如果你垂直叠加图像,那么你的NN的输入形状将是500200,3,你可以有1000个输入节点,所以节点0-200将得到0-100200,3像素,帧200-400将得到100-200200,3像素,依此类推。但是你又不能保证你的神经网络是否能学到什么