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