我多年没有编码,请原谅。我正在尝试做一些可能不可能的事情。我有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)
“目标”表示问题出在模型的输出中,而不是y_learn的格式。
数组y_learn应该与模型输出的形状完全相同,因为模型输出“猜测”,而模型则y_learn是“正确答案”。如果尺寸相同,则系统只能将猜测与正确答案进行比较。
看到不同:
(None,130,240,320,1) (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)
| 归档时间: |
|
| 查看次数: |
4279 次 |
| 最近记录: |