[英]Round an activation function in Keras
我正在嘗試創建一個激活函數,以便在我的keras模型中使用。
基本上,我想要的是一個只有兩位小數的sigmoid函數。 所以我試圖創建我自己的激活函數,如下所示:
def mySigmoid(x):
return np.around(K.sigmoid(x), decimals=2)
然后:
get_custom_objects().update({'mySigmoid': Activation(mySigmoid)})
但出於某種原因,我得到了錯誤。
有人可以幫幫我嗎?
非常感謝
堆棧跟蹤:
AttributeError Traceback (most recent call last)
<ipython-input-52-891a9f63ca56> in <module>()
3 model.add(Dense(30, activation='softmax'))
4
----> 5 model.add(Dense(10, activation='mySigmoid'))
6 model.summary()
7 sgd = optimizers.SGD(lr=0.1, decay=1e-5, momentum=0.3, nesterov=True)
/usr/local/lib/python2.7/dist-packages/keras/models.pyc in add(self, layer)
473 output_shapes=[self.outputs[0]._keras_shape])
474 else:
--> 475 output_tensor = layer(self.outputs[0])
476 if isinstance(output_tensor, list):
477 raise TypeError('All layers in a Sequential model '
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in __call__(self, inputs, **kwargs)
600
601 # Actually call the layer, collecting output(s), mask(s), and shape(s).
--> 602 output = self.call(inputs, **kwargs)
603 output_mask = self.compute_mask(inputs, previous_mask)
604
/usr/local/lib/python2.7/dist-packages/keras/layers/core.pyc in call(self, inputs)
843 output = K.bias_add(output, self.bias)
844 if self.activation is not None:
--> 845 output = self.activation(output)
846 return output
847
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in __call__(self, inputs, **kwargs)
600
601 # Actually call the layer, collecting output(s), mask(s), and shape(s).
--> 602 output = self.call(inputs, **kwargs)
603 output_mask = self.compute_mask(inputs, previous_mask)
604
/usr/local/lib/python2.7/dist-packages/keras/layers/core.pyc in call(self, inputs)
284
285 def call(self, inputs):
--> 286 return self.activation(inputs)
287
288 def get_config(self):
<ipython-input-50-cc621aa5ea1b> in mySigmoid(x)
1 def mySigmoid(x):
----> 2 return np.around(K.sigmoid(x), decimals=2)
3 #return (K.sigmoid(x) * 5) - 1
/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.pyc in around(a, decimals, out)
2787
2788 """
-> 2789 return _wrapfunc(a, 'round', decimals=decimals, out=out)
2790
2791
/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.pyc in _wrapfunc(obj, method, *args, **kwds)
65 # a downstream library like 'pandas'.
66 except (AttributeError, TypeError):
---> 67 return _wrapit(obj, method, *args, **kwds)
68
69
/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.pyc in _wrapit(obj, method, *args, **kwds)
45 except AttributeError:
46 wrap = None
---> 47 result = getattr(asarray(obj), method)(*args, **kwds)
48 if wrap:
49 if not isinstance(result, mu.ndarray):
AttributeError: 'Tensor' object has no attribute 'rint'
我的任務:我正在嘗試創建一個神經網絡來預測住宅門窗的開放狀態。
這些狀態是從0到1的浮點數,最多有兩個小數位。
輸入數據集組織為:
headerInput = ['hour', 'Temperature', 'Wind_Speed', 'Wind_Direction', 'Humidity', 'Air_Density', 'Rain_Status', 'Jardim_PMV','Jardim_Temp','livingRoom_PMV','livingRoom_Temp','mezzanine_PMV','mezzanine_Temp']
例:
14.0,15.1,3.1,230.0,40.0,1.21136396241,0.0,-2.0925950832,15.2547144369,-1.59841620663,17.4451394848,-4.48642007828,17.7701378164,-1.87781304943,16.4544875583,-0.334880991824,20.9530677507,-3.98155421448,18.0000031279,-2.06816062239,16.9694428505,-1.27592184517,17.7946534879
輸出數據集:
headerOutput = ['window_1','window_2','window_3','window_4','window_5','window_6','window_7','window_8','window_9','window_10']
例:
0.0,0.94,0.82,0.0,0.4,0.67,0.0,1.0,1.0,0.95,0.0,0.64,0.0,0.75,0.78,0.77,0.23,0.78,0.21,0.29,0.7,0.48,0.0
現在我的網絡拓撲結構如下,但必要時可以更改:
model = Sequential()
model.add(Dense(40, input_shape=(13, ), kernel_initializer='random_normal', activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Dense(40, activation='relu'))
model.add(Dense(10, activation='sigmoid'))
model.summary()
sgd = optimizers.SGD(lr=0.1, decay=1e-5, momentum=0.3, nesterov=True)
model.compile(optimizer=sgd, loss='mean_squared_error', metrics=['mae', 'acc'])
model.fit(Input_np, Output_Norm, validation_split=0.3, epochs=35, batch_size=100)
這里有兩個問題:
np.round
想要一個兼容的非符號對象,而K.sigmoid
返回一個符號張量。 ( 更新這是您的錯誤來自的地方)。 np.round
返回一個非符號值。 ( 更新這將是下一個錯誤)。 最重要的是你必須在所有功能中堅持使用keras.backend
中的函數。 如果您不喜歡兼容性(即您只打算在特定后端運行模型,無論是Theano還是Tensorflow),您也可以直接使用后端定義的操作,因為keras.backend
相對有限。
在任何支持的后端中也沒有直接的方法來舍入浮點值。 更重要的是,我認為舍入激活函數沒有多大意義,因為它可能嚴重損害漸變。
更新
如果你這樣做是為了得到一個圓形輸出,就沒有必要擺弄激活函數本身。 您可以簡單地舍入輸出: np.round(yournetwork.predict(...), 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.