具有3D输入的TensorFlow CNN太慢而无法训练

时间:2017-10-29 22:49:29

标签: python-2.7 tensorflow conv-neural-network

问题

我正在Python 2.7中构建TensorFlow CNN,将40x40x40的3D图像分类为两个类别中的一个。训练数据作为(5000,40,40,40,1)阵列(5000个训练图像,1个颜色通道)存储在HDF5文件中。但是,当我训练网络时,一批32个图像的每次迭代大约需要一分钟才能完成。通过Activity Monitor我发现在每次迭代中都有大约6GB的数据写入磁盘。 HDF5本身只有500MB左右。怎么了?

这是我用来加载数据的代码:

f = h5py.File(file_name, 'r')
images = f.get('key_name')
images = np.array(images)
images = images.astype(np.float32)
images = np.multiply(images, 1.0 / 100.0)

我还尝试在每次迭代时直接使用HDF5对象,而不是一次将所有数据加载到内存中。但问题仍然存在:

f = h5py.File(file_name, 'r')
images = np.array(f.get('key_name')[:batch_size])

CNN结构

我制作的CNN有两个3D卷积层,一个展平层,一个完全连接层和一个输出层。以下是结构的完整代码:

num_channels = 1 
filter_size_conv1 = 5
filter_size_conv2 = 5 
num_filters_conv1 = 32
num_filters_conv2 = 64
fc_layer_size = 64 

x = tf.placeholder(tf.float32, shape=[None, img_size, img_size, img_size, num_channels], name='x')
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name='y_true')
y_true_cls = tf.argmax(y_true, dimension=1)

def create_weights(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))

def create_biases(size):
    return tf.Variable(tf.constant(0.05,shape=[size]))

def create_convolutional_layer(input,
               num_input_channels, 
               conv_filter_size,        
               num_filters):     
    weights = create_weights(shape=[
        conv_filter_size, conv_filter_size, conv_filter_size, num_input_channels, num_filters])
    biases = create_biases(num_filters)
    layer = tf.nn.conv3d(input=input,
                     filter=weights,
                     strides=[1, 1, 1, 1, 1],
                     padding='SAME')
    layer += biases
    layer = tf.nn.max_pool3d(input=layer,
                            ksize=[1, 4, 4, 4, 1],
                            strides=[1, 4, 4, 4, 1],
                            padding='SAME')
    layer = tf.nn.relu(layer)
    return layer

def create_flatten_layer(layer):
    layer_shape = layer.get_shape()
    num_features = layer_shape[1:5].num_elements()  
    layer = tf.reshape(layer, [-1, num_features])
    return layer

def create_fc_layer(input,          
             num_inputs,    
             num_outputs,
             use_relu=True):    
    weights = create_weights(shape=[num_inputs, num_outputs])
    biases = create_biases(num_outputs) 
    layer = tf.matmul(input, weights) + biases
    if use_relu:
        layer = tf.nn.relu(layer)
    return layer


layer_conv1 = create_convolutional_layer(input=x,
               num_input_channels=num_channels,
               conv_filter_size=filter_size_conv1,
               num_filters=num_filters_conv1)

layer_conv2 = create_convolutional_layer(input=layer_conv1,
               num_input_channels=num_filters_conv1,
               conv_filter_size=filter_size_conv2,
               num_filters=num_filters_conv2)

layer_flat = create_flatten_layer(layer_conv2)

layer_fc1 = create_fc_layer(input=layer_flat,
                     num_inputs=layer_flat.get_shape()[1:5].num_elements(),
                     num_outputs=fc_layer_size,
                     use_relu=True)

layer_fc2 = create_fc_layer(input=layer_fc1,
                     num_inputs=fc_layer_size,
                     num_outputs=num_classes,
                     use_relu=False)

任何帮助将不胜感激。非常感谢你!

1 个答案:

答案 0 :(得分:0)

我实际上在这里发现了同样的问题。我正在使用conv3d,它需要永远完成。可能与conv3d

的优化有关