到目前为止,我一直试图解决这个问题大约24小时,但遗憾的是无法提出一些问题。
问题很简单:我在2个子目录中有2个类别,子目录中的图像是RGB格式,但我只对绿色通道感兴趣。我使用flow_from_directory函数读取批量图像(图像@ size(3,224,224))然后我尝试使用Lambda图层提取绿色通道,如下所示:
def get_model_bw(input_shape=(3,224,224), classes = 2, lr=1e-4):
model = Sequential([
Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=(1,224,224)),
BatchNormalization(axis=1),
Conv2D(32,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(32,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(32,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
MaxPooling2D(),
Conv2D(64,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
MaxPooling2D(),
Conv2D(128,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(128,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
MaxPooling2D(),
Conv2D(256,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(256,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
MaxPooling2D(),
Conv2D(512,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
Conv2D(512,(3,3), activation='relu',padding='same'),
BatchNormalization(axis=1),
MaxPooling2D(),
Flatten(),
Dense(1000, activation='relu'),
BatchNormalization(),
Dense(1000, activation='relu'),
BatchNormalization(),
Dense(classes, activation='softmax')
])
model.compile(Adam(lr=lr), loss='categorical_crossentropy', metrics=['accuracy'])
return model
model_bw = get_model_bw(input_shape=(3,224,224), classes=2)
但它只是拒绝工作...... 它抛出的错误是:
ValueError Traceback(最近一次调用最后一次) ValueError:输入0与图层batch_normalization_181不兼容:预期ndim = 4,找到ndim = 3
有什么建议吗? 附:我正在使用Theano后端和最新的keras版本。
非常感谢任何帮助。
答案 0 :(得分:0)
首先,您必须检查是否使用了数据格式channels_first
或channels_last
。 (看来你首先使用频道,输入形状)
Keras的默认值为channels_last
。您可以在用户文件夹的keras.json
文件中看到:<user>\.keras\keras.json
。这也可以为每一层单独设置。
lambda图层
使用图层外的形状(例如input_shape=(3,224,224)
)时,不指定批量大小(图像数)。
但在lambda图层内(无论何时直接在张量上工作),批量大小都会显示为第一个维度,因此,您的频道不在第一维,而在第二维:
Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=outputshape)
当然,您的输出形状不能与输入形状相同,它必须是(1,224,224)
以下图层:
不要将input_shape
添加到其他图层,只添加到第一层(即lambda图层)
如果出现任何问题,请显示错误消息。
答案 1 :(得分:0)
我无法相信,但我找到了解决方案:
lambda图层:
from keras import backend as K
Lambda(lambda x: K.expand_dims(x[:,1,:,:],1), input_shape=input_shape, output_shape=(1,224,224)),