我正在测试我的新Nvidia Titan V,它支持float16操作。我注意到在训练过程中,float16比float32慢得多(约800 ms/步)(约500 ms/步)。
要执行float16操作,我将keras.json文件更改为:
{
"backend": "tensorflow",
"floatx": "float16",
"image_data_format": "channels_last",
"epsilon": 1e-07
}
为什么float16操作要慢得多?我需要修改我的代码而不仅仅是keras.json文件吗?
我在Windows10上使用了CUDA9.0、CUDN7.0、TensorFlow 1.7.0和Keras2.1.5。
我的python 3.5代码如下:
img_width, img_height = 336, 224
train_data_dir = 'C:\\my_dir\\train'
test_data_dir = 'C:\\my_dir\\test'
batch_size=128
datagen = ImageDataGenerator(rescale=1./255,
horizontal_flip=True, # randomly flip the images
vertical_flip=True)
train_generator = datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
test_generator = datagen.flow_from_directory(
test_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
# Architecture of NN
model = Sequential()
model.add(Conv2D(32,(3, 3), input_shape=(img_height, img_width, 3),padding='same',kernel_initializer='lecun_normal'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32,(3, 3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64,(3, 3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64,(3, 3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(1))
model.add(Activation('sigmoid'))
my_rmsprop = keras.optimizers.RMSprop(lr=0.0001, rho=0.9, epsilon=1e-04, decay=0.0)
model.compile(loss='binary_crossentropy',
optimizer=my_rmsprop,
metrics=['accuracy'])
# Training
nb_epoch = 32
nb_train_samples = 512
nb_test_samples = 512
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples/batch_size,
epochs=nb_epoch,
verbose=1,
validation_data=test_generator,
validation_steps=nb_test_samples/batch_size)
# Evaluating on the testing set
model.evaluate_generator(test_generator, nb_test_samples)
最佳答案
从documentation of cuDNN(第2.7节,子节类型转换)可以看到:
注意:累加器是32位整数,在溢出时换行。
这适用于以下标准的int8数据类型:数据输入、过滤器输入和输出。
在这些假设下,@jiandercy是正确的,有一个float16到float32的转换,然后在返回结果之前进行反向转换,float16
会变慢。