Keras 图像\模糊\排序-我在这里遗漏了什么?

Keras 图像\模糊\排序-我在这里遗漏了什么?,keras,Keras,编辑:无法使用cuda 8.0和titan X(Pascal)复制此问题 在keras中使用tensorflow后端时,我遇到了与图像大小排序相关的问题。 当我在keras配置文件中使用image_dim_ordering='th'时,一切都很好,但当我使用'tf'时,训练的精确度从0.5提高不了多少 其动机是,目前我的实时增强非常昂贵,我很想删除不必要的重塑,从无暗阶约定到tensorflow 我试着用简单的代码重现这个问题,以允许其他人复制,这可能有助于我理解我在这里做错了什么。我很清楚通道

编辑:无法使用cuda 8.0和titan X(Pascal)复制此问题

在keras中使用tensorflow后端时,我遇到了与图像大小排序相关的问题。 当我在keras配置文件中使用image_dim_ordering='th'时,一切都很好,但当我使用'tf'时,训练的精确度从0.5提高不了多少

其动机是,目前我的实时增强非常昂贵,我很想删除不必要的重塑,从无暗阶约定到tensorflow

我试着用简单的代码重现这个问题,以允许其他人复制,这可能有助于我理解我在这里做错了什么。我很清楚通道、高度、宽度的不同约定,至少我认为我能处理好

虽然我没有在紧凑的示例中完全重现我的问题(可能是因为这是一项琐碎的任务),但训练结果会反复不同,对于“tf”的情况来说更糟糕,即使我尝试了不同的种子值。 注意-在这个复制代码中,网络需要做的只是区分-1.0的完整补丁和1.0的完整补丁

这是我的“~/.keras/keras.json”

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_dim_ordering": "th"  
}
我的tensorflow版本是“0.11.0rc0”(它也发生在0,10) 我的keras是今天最新的git pull

使用“th”对图像进行dim排序,我得到了三个不同种子在第4纪元的精度>=0.99。 使用'tf'作为暗阶,我得到的精度>=0.9,正如您在下面的日志中看到的,这是最新的,仅在第24纪元左右

以下是一个独立的代码,可以重现问题:

from keras import backend as K
import keras.optimizers
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense, Input
from keras.models import Model
import numpy as np

def make_model(input_dim_size):
    if K.image_dim_ordering() == 'tf':
        input_shape = (input_dim_size, input_dim_size,1)
    else:
        input_shape = (1, input_dim_size, input_dim_size)
    img_input = Input(shape=input_shape)

    x = Convolution2D(64,5,5,border_mode='same')(img_input)
    x = Activation('relu')(x)
    x = MaxPooling2D((2,2),strides=(2,2))(x)

    x = Convolution2D(64, 5, 5, border_mode='same')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2))(x)

    x = Convolution2D(64, 5, 5, border_mode='same')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2))(x)

    x = Convolution2D(128, 5, 5, border_mode='same')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2))(x)

    x = Convolution2D(128, 5, 5, border_mode='same')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2))(x)

    x = Flatten()(x)
    x = Dense(1024*2)(x)
    x = Activation('relu')(x)
    x = Dropout(0.5)(x)

    x = Dense(1024 * 2)(x)
    x = Activation('relu')(x)
    x = Dropout(0.75)(x)

    x = Dense(200)(x)
    x = Activation('relu')(x)
    x = Dropout(0.75)(x)

    x = Dense(1,activation='sigmoid')(x)

    model = Model(img_input, x)

    learning_rate = 0.01

    sgd = keras.optimizers.sgd(lr=learning_rate, momentum=0.9, nesterov=True)

    model.summary()

    model.compile(loss='binary_crossentropy',
                  optimizer=sgd,
                  metrics=['accuracy']
                  )
    return model

np.random.seed(456)

def dummy_generator(mini_batch_size=64, block_size=100):
    if K.image_dim_ordering() == 'tf':
        tensor_X_shape = (mini_batch_size,block_size, block_size,1)
    else:
        tensor_X_shape = (mini_batch_size, 1, block_size, block_size)

    X = np.zeros(tensor_X_shape, dtype=np.float32)
    y = np.zeros((mini_batch_size, 1))

    while True:
        for b in range(mini_batch_size):
            X[b, :, :, :] = (float(b % 2) * 2.0) - 1.0
            y[b, :] = float(b % 2)
        yield X,y

with K.tf.device('/gpu:2'):
    K.set_session(K.tf.Session(config=K.tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)))
    MINI_BATCH_SIZE = 64
    PATCH_SIZE = 100
    model = make_model(PATCH_SIZE)
    gen = dummy_generator(mini_batch_size=MINI_BATCH_SIZE,block_size=PATCH_SIZE)
    model.fit_generator(gen, MINI_BATCH_SIZE*10,
                        100, verbose=1,
                        callbacks=[],
                        validation_data=None,
                        nb_val_samples=None,
                        max_q_size=1,
                        nb_worker=1, pickle_safe=False)
对于“tf”案例,这是训练日志:(在不同的种子上看起来非常相似):

对于“th”情况,训练日志是(在不同的种子上看起来非常相似):

我发现在tensorflow的情况下(0s)速度如此之快令人怀疑,但在将调试打印添加到生成器之后,它似乎确实被调用了。 我认为这可能与keras不需要重塑任何东西有关,但2-3秒的时间听起来太长了


如果有人能重现我看到的结果并帮助我理解我到底错过了什么,我将不胜感激:)

这条线索有点陈旧,但我仍在回复,以防有人面临同样的问题

错误是由于Keras后端配置不一致导致的

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_dim_ordering": "th"  
}
配置使用
tensorflow
作为后端,但使用
Theano
的图像维度排序,而不是
tensorflow
。将
image\u dim\u ordering
更改为
tf
,这将解决问题

"image_dim_ordering": "tf" 

你知道它是什么吗?还没有,我正忙于太多的事情@pplonski我很快会用最新版本重试,谢谢你提醒我:)无法使用cuda 8.0和titan x(pascal)重现问题。我很清楚tensorflow和theano image dim排序,从我在问题描述中分享的独立复制代码可以看出。这不是一个误解图像尺寸顺序和keras配置文件的问题。查看以“if K.image_dim_ordering()=”tf':”开头的几行代码,看看代码是否支持任何keras配置。
{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_dim_ordering": "th"  
}
"image_dim_ordering": "tf"