用tensorflow搭建卷积神经网络,使用yield来返回数据batch,然后输入到卷积神经网络训练,相关代码如下:
def generate_batch(batch_train_list, max_frame, size_x, size_y, batch_label):
batch_rgb = get_rgb_batch(batch_train_list, max_frame, size_x, size_y)
# 得到rgb特征 [video/batch_size,batch_size,max_frame,size_x,size_y,3],
# size_x和size_y为图片大小,max_frame为每个视频抽取出的帧数,3为通道数
batch_label = np.asarray(batch_label, dtype=np.int32)
for i, j in zip(batch_rgb, batch_label):
# 按batch返回
yield i, j
train_label = tf.cast(tf.convert_to_tensor(train_label), dtype=tf.int32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# step = 1000
for i in range(1000):
for xs, ys in tool.generate_batch(train_list,max_frame,size_x,size_y,train_label):
sess.run(train_step, feed_dict={tf_X: xs, tf_Y: ys})
运行之后报错,报错处为:for xs, ys in tool.generate_batch(train_list,max_frame,size_x,size_y,train_label)处,报错信息为: "`Tensor` objects are not iterable when eager execution is not ",原因是不能对张量进行迭代,而train_label为张量,导致循环中的ys为张量,因此报错。
解决方法:我的程序中train_label = tf.cast(tf.convert_to_tensor(train_label), dtype=tf.int32)是多余的,删除即可。若一定要使ys为张量,可以在输入卷积神经网络之前进行数据转换。如下图所示,这里的label既是上图传入的ys。
def 3d_cnn(inputs, scope,label):
label = tf.cast(tf.convert_to_tensor(label),dtype=tf.int32)
with tf.variable_scope(scope, '3d_cnn', [inputs]):
with slim.arg_scope([slim.conv3d, slim.max_pool3d, slim.avg_pool3d],
stride=1, padding='VALID'):
net = slim.conv3d(inputs, 2, [3, 7, 7], stride=[1, 1, 1], scope='Conv3d_la_1x3x3')# b x 5 x 54x34x2
net = slim.max_pool3d(net, [1, 2, 2], stride=[1, 2, 2], scope='Maxpool3d_1a_1x3x3')# b x 5 x 27x17x2
# 省略以下不相关代码