Построение специальной нейронной сети для сложной задачи прогнозирования. Из-за ее сложности я хотел бы реализовать задачу классификации как псевдо-регрессию; нормальная классификация толком не работает.
Моя идея - добавить слой для преобразования одного значения из Плотный (1) в категориальный тензор, такой как матрица классов. Ниже представлена моя реализация с Lambda и внутренним классом.
from tensorflow import convert_to_tensor, float32
from keras import backend as K
from tensorflow.keras.utils import to_categorical
def Kaname(p): #0<p<1 (sigmoid output)
critical_p=round(float(K.get_value(K.sum(p))),4)
#categorize to {0,1,2,3,4} depending on the inner value of the tensor.
if round(abs(critical_p-0.5),4)<round(0.1,4):
nnn=2
elif critical_p<round(0.5,4):
if critical_p<=round(0.2,4):
nnn=0
elif critical_p<=round(0.4,4):
nnn=1
elif critical_p>round(0.5,4):
if critical_p>=round(0.8,4):
nnn=4
elif critical_p>=round(0.6,4):
nnn=3
a=to_categorical(nnn,num_division+1)
a=np.array(a).reshape(-1,5)
a=convert_to_tensor(a,dtype=float32)
return a
#should return callable tensor for prediction. The max will lead the predicted category.
def test_model(num_division):
model=Sequential()
model.add(Conv1D(32, 3, padding='valid', input_shape=(12, 1), activation='sigmoid'))
model.add(Flatten())
model.add(Dense(16,activation = "sigmoid"))
model.add(Dense(1,activation = "sigmoid"))
#Original Lambda Layer
#model.add(Lambda(Kaname(num_division+1),output_shape=(1, 5)))
#Revised
model.add(Lambda(Kaname,output_shape=(1, 5)))
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
return model
Без лямбды модель работает нормально. Однако кажется, что лямбда не работает.
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1278, in _do_call
return fn(*args)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1263, in _run_fn
options, feed_dict, fetch_list, target_list, run_metadata)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1350, in _call_tf_sessionrun
run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'conv1d_1_input' with dtype float and shape [?,12,1]
[[Node: conv1d_1_input = Placeholder[dtype=DT_FLOAT, shape=[?,12,1], _device = "/job:localhost/replica:0/task:0/device:CPU:0"]()]]
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "cnn_classify.py", line 264, in <module>
model=model_generation(function_name)
File "cnn_classify.py", line 240, in model_generation
model=eval('%s'%abc)(num_division)
File "cnn_classify.py", line 204, in simplified_test_model
model.add(Lambda(Kaname,output_shape=(1, 5)))
File "/usr/lib64/python3.6/site-packages/keras/engine/sequential.py", line 185, in add
output_tensor = layer(self.outputs[0])
File "/usr/lib64/python3.6/site-packages/keras/engine/base_layer.py", line 457, in __call__
output = self.call(inputs, **kwargs)
File "/usr/lib64/python3.6/site-packages/keras/layers/core.py", line 682, in call
return self.function(inputs, **arguments)
File "cnn_classify.py", line 167, in Kaname
critical_p=round(float(K.get_value(K.sum(p))),4)
File "/usr/lib64/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2377, in get_value
return x.eval(session=get_session())
File "/usr/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 680, in eval
return _eval_using_default_session(self, feed_dict, self.graph, session)
File "/usr/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 4951, in _eval_using_default_session
return session.run(tensors, feed_dict)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 877, in run
run_metadata_ptr)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1100, in _run
feed_dict_tensor, options, run_metadata)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1272, in _do_run
run_metadata)
File "/usr/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1291, in _do_call
raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'conv1d_1_input' with dtype float and shape [?,12,1]
[[Node: conv1d_1_input = Placeholder[dtype=DT_FLOAT, shape=[?,12,1], _device = "/job:localhost/replica:0/task:0/device:CPU:0"]()]]
Разве нельзя создать категориальный тензор из однозначного тензора? Если это невозможно с Керасом, могу ли я контролировать категориальную модель, такую как регрессия? Google мне не помог, поэтому мне нужна ваша помощь. Спасибо.
Спасибо, доктор Вальденегро, за помощь в решении моей проблемы с CNN. Я полностью убежден в первой сделанной мной ошибке, но не с использованием numpy внутри лямбды; поскольку для слоя лямбда нет параметров, я полагаю, это не имеет значения, если данные повторно конвертируются в тензор.






Вы должны передать функцию лямбда, но вы передаете возвращаемое значение функции в лямбда, потому что вы выполняете вызов функции. Кроме того, вы не можете использовать numpy внутри лямбда-функции, вам нужно использовать backend или прямые функции TensorFlow только для правильного распространения градиента.