2016-09-27 77 views
3

我正在構建一個帶Keras的卷積神經網絡,並且希望在最後一個完全連接的圖層之前添加一個具有我的數據標準偏差的單個節點。在Keras中合併變量

這裏有一個最小代碼重現錯誤:

from keras.layers import merge, Input, Dense 
from keras.layers import Convolution1D, Flatten 
from keras import backend as K 

input_img = Input(shape=(64, 4)) 

x = Convolution1D(48, 3, activation='relu', init='he_normal')(input_img) 
x = Flatten()(x) 

std = K.std(input_img, axis=1) 
x = merge([x, std], mode='concat', concat_axis=1) 

output = Dense(100, activation='softmax', init='he_normal')(x) 

這導致以下TypeError

----------------------------------------------------------------- 
TypeError      Traceback (most recent call last) 
<ipython-input-117-c1289ebe610e> in <module>() 
     6 x = merge([x, std], mode='concat', concat_axis=1) 
     7 
----> 8 output = Dense(100, activation='softmax', init='he_normal')(x) 

/home/ubuntu/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/topology.pyc in __call__(self, x, mask) 
    486          '`layer.build(batch_input_shape)`') 
    487    if len(input_shapes) == 1: 
--> 488     self.build(input_shapes[0]) 
    489    else: 
    490     self.build(input_shapes) 

/home/ubuntu/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/layers/core.pyc in build(self, input_shape) 
    701 
    702   self.W = self.init((input_dim, self.output_dim), 
--> 703       name='{}_W'.format(self.name)) 
    704   if self.bias: 
    705    self.b = K.zeros((self.output_dim,), 

/home/ubuntu/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/initializations.pyc in he_normal(shape, name, dim_ordering) 
    64  ''' 
    65  fan_in, fan_out = get_fans(shape, dim_ordering=dim_ordering) 
---> 66  s = np.sqrt(2./fan_in) 
    67  return normal(shape, s, name=name) 
    68 

TypeError: unsupported operand type(s) for /: 'float' and 'NoneType' 

任何想法,爲什麼?

+1

什麼版本Keras的是你嗎?當我嘗試運行你的代碼時,我得到錯誤:'你試圖調用圖層「dense_output」。該層沒有關於其期望的輸入形狀的信息,其中'dense_output'是最後一層,這是因爲K.std沒有像keras嵌入到其層中的輸出形狀信息。 – 7VoltCrayon

回答

1

std沒有Keras層,因此它不能滿足圖層輸入/輸出形狀界面。這個問題的解決是使用Lambda層包裹K.std

from keras.layers import merge, Input, Dense, Lambda 
from keras.layers import Convolution1D, Flatten 
from keras import backend as K 

input_img = Input(shape=(64, 4)) 

x = Convolution1D(48, 3, activation='relu', init='he_normal')(input_img) 
x = Flatten()(x) 

std = Lambda(lambda x: K.std(x, axis=1))(input_img) 
x = merge([x, std], mode='concat', concat_axis=1) 

output = Dense(100, activation='softmax', init='he_normal')(x)