Keras模型ValueError:检查模型目标时出错:

DSP*_*209 4 keras

我多年没有编码,请原谅。我正在尝试做一些可能不可能的事情。我有38个视频,视频中的人们表演了相同的基本动作。我想训练模型,以找出正确的人与不正确的人。我现在正在使用颜色,因为灰度也不起作用,因此我想像使用的示例一样进行测试。我使用了示例中定义的模型link

Windows 10(64bit)上的Keras,Anaconda 64中的Python3.5,Tensorflow后端

我希望在这个问题上尝试不同的模型,并使用灰度来减少内存,但无法超越第一步!

谢谢!!!

这是我的代码:

import time
import numpy as np
import sys
import os
import cv2
import keras
import tensorflow as tf

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from keras.layers import Conv3D, Conv2D, MaxPooling2D, GRU, ConvLSTM2D, TimeDistributed


y_cat = np.zeros(40,np.float)
good = "Good"
bad = "Bad"


batch_size = 32
num_classes = 1
epochs = 1
nvideos = 38
nframes = 130
nrows = 240
ncols = 320
nchan = 3

x_learn = np.zeros((nvideos,nframes,nrows,ncols,nchan),np.int32)
x_learn = np.load(".\\train\\datasetcolor.npy")

with open(".\\train\\tags.txt") as ft:
    y_learn = ft.readlines()
y_learn = [x.strip() for x in y_learn] 
ft.close()

# transform string tags to numeric.
for i in range (0,len(y_learn)):
    if (y_learn[i] == good): y_cat[i] = 1
    elif (y_learn[i]  == bad): y_cat[i] = 0


#build model 
# duplicating from https://github.com/fchollet/keras/blob/master/examples/conv_lstm.py
model = Sequential()
model.image_dim_ordering = 'tf'
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
                   input_shape=(nframes,nrows,ncols,nchan),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())

model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())

model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())

model.add(Conv3D(filters=1, kernel_size=(3, 3, 3),
               activation='sigmoid',
               padding='same', data_format='channels_last'))
model.compile(loss='binary_crossentropy', optimizer='adadelta')


print(model.summary())

# fit with first 3 videos because I don't have the horsepower yet
history = model.fit(x_learn[:3], y_learn[:3],
              batch_size=batch_size,
              epochs=epochs)

print (history)
Run Code Online (Sandbox Code Playgroud)

结果:


Layer (type)                 Output Shape              Param #   
=================================================================
conv_lst_m2d_5 (ConvLSTM2D)  (None, 130, 240, 320, 40) 62080     
_________________________________________________________________
batch_normalization_5 (Batch (None, 130, 240, 320, 40) 160       
_________________________________________________________________
conv_lst_m2d_6 (ConvLSTM2D)  (None, 130, 240, 320, 40) 115360    
_________________________________________________________________
batch_normalization_6 (Batch (None, 130, 240, 320, 40) 160       
_________________________________________________________________
conv_lst_m2d_7 (ConvLSTM2D)  (None, 130, 240, 320, 40) 115360    
_________________________________________________________________
batch_normalization_7 (Batch (None, 130, 240, 320, 40) 160       
_________________________________________________________________
conv_lst_m2d_8 (ConvLSTM2D)  (None, 130, 240, 320, 40) 115360    
_________________________________________________________________
batch_normalization_8 (Batch (None, 130, 240, 320, 40) 160       
_________________________________________________________________
conv3d_1 (Conv3D)            (None, 130, 240, 320, 1)  1081      
=================================================================
Total params: 409,881.0
Trainable params: 409,561
Non-trainable params: 320.0
_________________________________________________________________
None
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-d909d285f474> in <module>()
     82 history = model.fit(x_learn[:3], y_learn[:3],
     83               batch_size=batch_size,
---> 84               epochs=epochs)
     85 
     86 print (history)

ValueError: Error when checking model target: expected conv3d_1 to have 5 dimensions, but got array with shape (3, 1)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ler 6

“目标”表示问题在模型的输出中,而不是y_learn的格式。

数组y_learn应该与模型输出的形状完全相同,因为模型输出“猜测”,而模型则y_learn是“正确答案”。如果尺寸相同,则系统只能将猜测与正确答案进行比较。

看到不同:

  • 模型输出(在摘要中看到): (None,130,240,320,1)
  • y_learn: (None,1)

其中“无”是批次大小。您给了y_learn [:3],则此培训课程的批次大小为3。

为了正确纠正它,我们需要了解y_learn是什么。
据我了解,每个视频只有一个数字,即0或1。如果是这样,您的y_learn就可以了,而您需要的是模型输出类似的内容(None,1)

一种非常简单的方法(也许不是最好的方法,在这里我没有更多帮助...)是仅使用一个神经元添加最终的密集层:

model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)

现在,当您这样做时model.summary(),您将看到最终输出为(None,1)