#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, вы можете использовать все, что захотите. Если пример сработал для вас, вы можете принять ответ, чтобы другие могли извлечь из него выгоду.