【发布时间】:2018-12-06 01:11:55
【问题描述】:
我正在尝试训练一个简单的 3DCNN,用于对动力学数据集的一个子集进行动作分类。我正在传递一个 tf.data.Dataset.from_generator() 对象作为对 model.fit() 的调用的输入。
张量流版本:r1.12
初始化 tf.data.Dataset 的生成器产生一个 np.arrays 元组。第一个是形状为(50,45,80,3)的预处理视频,第二个是形状为(22,)的类的one-hot编码
代码:
import os
import numpy as np
import itertools
import tensorflow as tf
import tensorflow.data as data
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import MaxPooling3D, Conv3D, BatchNormalization, Dense
from tensorflow.keras.layers import Dropout, Activation, Flatten, Input
def train_generator():
train_dir = '/home/kjd/Storage/kinetics-frames_proc_small'
classes = os.listdir(train_dir)
for index, label in enumerate(classes):
clips = os.listdir(train_dir + '/' + label)
for clip in clips:
data = np.load(train_dir + '/' + label + '/' + clip)
yield data, np.eye(22)[index].astype(int)
EPOCHS = 3
BATCH_SIZE = 32
dataset = data.Dataset.from_generator(train_generator, (tf.int64, tf.int64))
model = Sequential()
model.add(Conv3D(16, (3,3,3), strides=(1,1,1), padding='same', activation='relu',
input_shape=(50,45,80,3)))
model.add(Conv3D(32, (3,3,3), strides=(1,1,1), padding='same', activation='relu'))
model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2)))
model.add(BatchNormalization())
model.add(Conv3D(64, (3,3,3), strides=(1,1,1), padding='same', activation='relu'))
model.add(Conv3D(128, (3,3,3), strides=(1,1,1), padding='same', activation='relu'))
model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2)))
model.add(BatchNormalization())
model.add(Conv3D(256, (3,3,3), strides=(1,1,1), padding='same', activation='relu'))
model.add(Conv3D(512, (3,3,3), strides=(1,1,1), padding='same', activation='relu'))
model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2)))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(22, activation='softmax'))
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
model.fit(dataset, batch_size=BATCH_SIZE, epochs=EPOCHS, shuffle=False,
steps_per_epoch=1000)
错误:
Traceback (most recent call last):
File "train.py", line 55, in <module>
steps_per_epoch=1000)
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1683, in fit
shuffle=shuffle)
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1200, in _standardize_user_data
class_weight, batch_size)
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1328, in _standardize_weights
exception_prefix='input')
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 294, in standardize_input_data
data = [standardize_single_array(x) for x in data]
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 294, in <listcomp>
data = [standardize_single_array(x) for x in data]
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 228, in standardize_single_array
if x.shape is not None and len(x.shape) == 1:
File "/home/kjd/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py", line 745, in __len__
raise ValueError("Cannot take the length of shape with unknown rank.")
ValueError: Cannot take the length of shape with unknown rank.
似乎 tf.keras 不喜欢我输入数据的格式。我对 tf/keras 相当陌生,但并没有从这个错误消息中收集到很多信息。如果有人对问题所在有任何见解,您的想法将不胜感激。
【问题讨论】:
标签: python tensorflow keras tensorflow-datasets