2017-11-28 10 views
2

케라 레이어 Flatten() 또는 Reshape((-1,))을 내 모델 끝에 사용하여 [0,0,1,0,0, ... ,0,0,1,0]과 같은 1D 벡터를 출력하고 싶습니다."Flatten"또는 "Reshape"를 사용하여 케라에서 알려지지 않은 입력 모양의 1D 출력을 얻습니다.

슬프게도 내 알 수없는 입력 모양 때문에 문제가 있습니다 :
input_shape=(4, None, 1))).

그래서 일반적으로 입력 도형은 출력 BATCH_SIZE의 X 알 치수 (: 상기 [batch_size, 64] [batch_size, 256] secound 위의 주먹 예)이어야하고 [batch_size, 4, 64, 1] [batch_size, 4, 256, 1] 사이 일 것이다.
model = Sequential() 
model.add(Convolution2D(32, (4, 32), padding='same', input_shape=(4, None, 1))) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Convolution2D(1, (1, 2), strides=(4, 1), padding='same')) 
model.add(Activation('sigmoid')) 
# model.add(Reshape((-1,))) produces the error 
# int() argument must be a string, a bytes-like object or a number, not 'NoneType' 
model.compile(loss='binary_crossentropy', optimizer='adadelta') 

그래야 내 현재의 출력 형태는 [BATCHSIZE, 1, 알 수없는 차원 1]입니다 : 같은

내 모델 보인다. class_weights를 사용하지 못하게하는 예는 "ValueError: class_weight not supported for 3+ dimensional targets."입니다.

유연한 입력 모양을 사용하면 케라 (제 2의 텐서 흐름 백엔드)에서 3 차원 출력을 평평하게하기 위해 Flatten() 또는 Reshape((1,))과 같은 것을 사용할 수 있습니까?

고마워요!

답변

4

Lambda 층에 포장 된 K.batch_flatten()을 시도해 볼 수 있습니다. K.batch_flatten()의 출력 모양은 런타임에 동적으로 결정됩니다.

model.add(Lambda(lambda x: K.batch_flatten(x))) 
model.summary() 

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
conv2d_5 (Conv2D)   (None, 4, None, 32)  4128  
_________________________________________________________________ 
batch_normalization_3 (Batch (None, 4, None, 32)  128  
_________________________________________________________________ 
leaky_re_lu_3 (LeakyReLU) (None, 4, None, 32)  0   
_________________________________________________________________ 
conv2d_6 (Conv2D)   (None, 1, None, 1)  65   
_________________________________________________________________ 
activation_3 (Activation) (None, 1, None, 1)  0   
_________________________________________________________________ 
lambda_5 (Lambda)   (None, None)    0   
================================================================= 
Total params: 4,321 
Trainable params: 4,257 
Non-trainable params: 64 
_________________________________________________________________ 


X = np.random.rand(32, 4, 256, 1) 
print(model.predict(X).shape) 
(32, 256) 

X = np.random.rand(32, 4, 64, 1) 
print(model.predict(X).shape) 
(32, 64) 
+0

소리가 정말 좋습니다! 나는 그것을 내일 시도 할 것이다 (결국 나를 위해 일하지 않는다면 당신에게 피드백을 준다). 그러면 당신의 대답을 받아 들일 것이다! 감사합니다 – Fabian

+0

고맙습니다. :) – Fabian