Формы Tensorflow ValueError несовместимы

#python #python-3.x #tensorflow #keras #neural-network

#питон #python-3.x #тензорный поток #keras #нейронная сеть

Вопрос:

Что бы я ни делал, я не могу исправить появление этой ошибки ValueError: ValueError: формы (35, 1) и (700, 35) несовместимы Я новичок в tensorflow и пытаюсь построить «простую», возможно, все еще несколько большую, нейронную сеть. Я пытался изменить input_shape, функцию потерь и количество нейронов, но безуспешно.

Я включил то, что считаю важной частью кода, остальное просто извлекает данные и форматирует их.

 
model = tf.keras.Sequential([
    #tf.keras.layers.Flatten(input_shape=700,),
    tf.keras.layers.Dense(800, activation='sigmoid', input_shape=(700,)),
    tf.keras.layers.Dense(1000, activation='sigmoid'),
    tf.keras.layers.Dense(500, activation='sigmoid'),
    tf.keras.layers.Dense(150, activation='sigmoid'),
    tf.keras.layers.Dense(35)
])


model.compile(optimizer='adam',
              loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['accuracy'])

train_dataset = tf.data.Dataset.from_tensor_slices((arrayInput, arrayTarget))

for feat, targ in train_dataset.take(5):
  print('Features: {}, Target: {}'.format(feat, targ))

model.fit(train_dataset, epochs=EPOCHS)


model.save('savedmodel')
 

Выходной сигнал:

 Features: [8.32999992e 00 8.18400002e 00 8.10999966e 00 8.05000019e 00
 ...SHORTENED BUT 700 LONG...
 1.13643000e 05 7.27480000e 04 1.00100000e 05 3.49750000e 04], Target: [8.72999954 8.75       8.64099979 8.60000038 8.64000034 8.66499996
 8.52999973 8.51000023 8.52000046 8.56000042 8.51000023 8.95499992
 8.85999966 8.75010014 8.74499989 8.75       8.76000023 8.77000046
 8.64500046 8.65200043 8.60429955 8.69999981 8.89000034 8.97999954
 8.92000008 9.21000004 9.38000011 9.47599983 9.57999992 9.46500015
 9.44999981 9.57999992 9.625      9.76000023 9.67000008]
Features: [8.18400002e 00 8.10999966e 00 8.05000019e 00 8.10999966e 00
 ...SHORTENED BUT 700 LONG...
 7.27480000e 04 1.00100000e 05 3.49750000e 04 3.91450000e 04], Target: [8.75       8.64099979 8.60000038 8.64000034 8.66499996 8.52999973
 8.51000023 8.52000046 8.56000042 8.51000023 8.95499992 8.85999966
 8.75010014 8.74499989 8.75       8.76000023 8.77000046 8.64500046
 8.65200043 8.60429955 8.69999981 8.89000034 8.97999954 8.92000008
 9.21000004 9.38000011 9.47599983 9.57999992 9.46500015 9.44999981
 9.57999992 9.625      9.76000023 9.67000008 9.64000034]
Features: [8.10999966e 00 8.05000019e 00 8.10999966e 00 8.13199997e 00
 ...SHORTENED BUT 700 LONG...
 1.00100000e 05 3.49750000e 04 3.91450000e 04 6.92160000e 04], Target: [8.64099979 8.60000038 8.64000034 8.66499996 8.52999973 8.51000023
 8.52000046 8.56000042 8.51000023 8.95499992 8.85999966 8.75010014
 8.74499989 8.75       8.76000023 8.77000046 8.64500046 8.65200043
 8.60429955 8.69999981 8.89000034 8.97999954 8.92000008 9.21000004
 9.38000011 9.47599983 9.57999992 9.46500015 9.44999981 9.57999992
 9.625      9.76000023 9.67000008 9.64000034 9.56499958]
Features: [8.05000019e 00 8.10999966e 00 8.13199997e 00 8.11999989e 00
 ...SHORTENED BUT 700 LONG...
 9.76000023 9.67000008 9.64000034 9.56499958 9.60999966], Target: [8.60000038 8.64000034 8.66499996 
 8.52999973 8.51000023 8.52000046
 8.56000042 8.51000023 8.95499992 8.85999966 8.75010014 8.74499989
 8.75       8.76000023 8.77000046 8.64500046 8.65200043 8.60429955
 8.69999981 8.89000034 8.97999954 8.92000008 9.21000004 9.38000011
 9.47599983 9.57999992 9.46500015 9.44999981 9.57999992 9.625
 9.76000023 9.67000008 9.64000034 9.56499958 9.60999966]
Features: [8.10999966e 00 8.13199997e 00 8.11999989e 00 8.06999969e 00
 ...SHORTENED BUT 700 LONG...
 3.91450000e 04 6.92160000e 04 9.24410000e 04 1.06220000e 05], Target: [8.64000034 8.66499996 8.52999973 8.51000023 8.52000046 8.56000042
 8.51000023 8.95499992 8.85999966 8.75010014 8.74499989 8.75
 8.76000023 8.77000046 8.64500046 8.65200043 8.60429955 8.69999981
 8.89000034 8.97999954 8.92000008 9.21000004 9.38000011 9.47599983
 9.57999992 9.46500015 9.44999981 9.57999992 9.625      9.76000023
 9.67000008 9.64000034 9.56499958 9.60999966 9.63000011]
Epoch 1/5
Traceback (most recent call last):
  File "C:/Users/Technik/PycharmProjects/StockNNv1/Train.py", line 88, in <module>
    model.fit(train_dataset, epochs=EPOCHS)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginetraining.py", line 1100, in fit
    tmp_logs = self.train_function(iterator)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerdef_function.py", line 828, in __call__
    result = self._call(*args, **kwds)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerdef_function.py", line 871, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerdef_function.py", line 725, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerfunction.py", line 2969, in _get_concrete_function_internal_garbage_collected
    graph_function, _ = self._maybe_define_function(args, kwargs)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerfunction.py", line 3361, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerfunction.py", line 3196, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonframeworkfunc_graph.py", line 990, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythoneagerdef_function.py", line 634, in wrapped_fn
    out = weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonframeworkfunc_graph.py", line 977, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginetraining.py:805 train_function  *
        return step_function(self, iterator)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginetraining.py:795 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythondistributedistribute_lib.py:1259 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythondistributedistribute_lib.py:2730 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythondistributedistribute_lib.py:3417 _call_for_each_replica
        return fn(*args, **kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginetraining.py:788 run_step  **
        outputs = model.train_step(data)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginetraining.py:755 train_step
        loss = self.compiled_loss(
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasenginecompile_utils.py:203 __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkeraslosses.py:152 __call__
        losses = call_fn(y_true, y_pred)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkeraslosses.py:256 call  **
        return ag_fn(y_true, y_pred, **self._fn_kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonutildispatch.py:201 wrapper
        return target(*args, **kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkeraslosses.py:1537 categorical_crossentropy
        return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonutildispatch.py:201 wrapper
        return target(*args, **kwargs)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonkerasbackend.py:4833 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    C:UsersTechnikPycharmProjectsStockNNv1venvlibsite-packagestensorflowpythonframeworktensor_shape.py:1134 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (35, 1) and (700, 35) are incompatible


Process finished with exit code 1
 

Извините за длинный вывод, но, как это показывает, набор данных train_dataset содержит 700 чисел для функции, в то время как целевой объект имеет 35, вот как я этого хочу. (Предполагается, что нейронная сеть способна предсказать 35 значений vlau из 700 заданных.)

Комментарии:

1. Не могли бы вы сообщить нам, какова форма этих двух тензоров? arrayInput, arrayTarget

2. @PrateekBhatt конечно, arrayInput: (1200, 700); arrayTarget: (1200, 35)

3. Можно ли поделиться своим кодом через Google colab, чтобы я мог отлаживать? Из трассировки стека ясно видно, что существует проблема с arrayTarget.

4. @PrateekBhatt Хорошо, и теперь в Google Colab он показывает мне другой (differnet?) Ошибка значения: colab.research.google.com/drive /…

Ответ №1:

Я сделаю следующее:

 import pandas as pd

model = tf.keras.Sequential([
    tf.keras.layers.Dense(700, activation='sigmoid', input_shape=(700,)),
    tf.keras.layers.Dense(1000, activation='sigmoid'),
    tf.keras.layers.Dense(500, activation='sigmoid'),
    tf.keras.layers.Dense(150, activation='sigmoid'),
    tf.keras.layers.Dense(35, activation='softmax')
])

model.summary()
model.compile(optimizer='adam',
              loss=tf.keras.losses.categorical_crossentropy,
              metrics=['accuracy'])
BATCH_SIZE = 8

train_x = pd.DataFrame(data=arrayInput)
train_y = pd.DataFrame(data=arrayTarget)

model.fit(x=train_x, y=train_y, epochs=EPOCHS, batch_size=BATCH_SIZE)

model.save('savedmodel')
 

Я изменил функцию потерь с sparse_categorical_crossentropy на categorical_crossentropy , поскольку sparse_categorical_crossentropy ожидается, что цели будут int иметь, но ваши цели имеют тип float .

Если вы ожидаете float , что значение будет вашей целью, то это не проблема классификации, а regression проблема, поэтому вам следует использовать функцию потерь, такую как MSE или MAE , и соответствующим образом изменить функцию активации последнего слоя.

Комментарии:

1. Вау, большое вам спасибо, что нашли время исправить это! Это действительно должна быть регрессия, что я должен использовать в качестве последней функции активации для этого? И почему размер пакета 8?

2. Если вы хотите, чтобы ваш y был между 0 и 1, вы можете использовать функцию активации сигмоида. Вы также можете оставить его пустым и попытаться запустить и посмотреть результаты. Кроме того, я просто выбираю batch_size 8, вы можете использовать все, что захотите. Если пример сработал для вас, вы можете принять ответ, чтобы другие могли извлечь из него выгоду.