【问题标题】:Tensorflow throwing ValueError() after making it to first epoch进入第一个纪元后,Tensorflow 抛出 ValueError()
【发布时间】:2020-05-09 00:57:12
【问题描述】:

每当我在 Tensorflow 中训练我的模型时,我都会遇到“ValueError:Shapes (None, None) 和 (None, 8, 8, 7) 不兼容”。到目前为止:

history = model.fit(train_batches,
                    steps_per_epoch=train_steps,
                    class_weight=class_weights,
                    validation_data=validation_batches,
                    validation_steps=val_steps,
                    epochs=30,
                    verbose=1,
                    callbacks=callbacks_list
                    )

给出这个堆栈跟踪:

Traceback (most recent call last):
  File "/home/brian/Desktop/381-deep-learning/main.py", line 410, in <module>
    epochs=30
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 324, in new_func
    return func(*args, **kwargs)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1479, in fit_generator
    initial_epoch=initial_epoch)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 66, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 848, in fit
    tmp_logs = train_function(iterator)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 580, in __call__
    result = self._call(*args, **kwds)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 627, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 506, in _initialize
    *args, **kwds))
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 2446, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 2777, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 2667, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 981, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 441, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "/home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 968, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:571 train_function  *
        outputs = self.distribute_strategy.run(
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:951 run  **
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
        return fn(*args, **kwargs)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:533 train_step  **
        y, y_pred, sample_weight, regularization_losses=self.losses)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/compile_utils.py:205 __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/losses.py:143 __call__
        losses = self.call(y_true, y_pred)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/losses.py:246 call
        return self.fn(y_true, y_pred, **self._fn_kwargs)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/losses.py:1527 categorical_crossentropy
        return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/keras/backend.py:4561 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    /home/brian/Desktop/381-deep-learning/venv/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py:1117 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, None) and (None, 8, 8, 7) are incompatible


Process finished with exit code 1

在进入 Epoch 1/30 之后。

这是我的模型定义,以防有人想知道:

# Create Inception Res Net model as used in paper
resnet = tf.keras.applications.inception_resnet_v2.InceptionResNetV2()

print("Layers of ResNet: "+str(len(resnet.layers))) //782 layers

x = resnet.layers[-28].output

x = tf.keras.layers.Dropout(0.25)(x)

# Make a prediction layer with 7 nodes for the 7 dir in our train_dir.
predictions_layer = tf.keras.layers.Dense(7, activation='softmax')(x)

# print(resnet.input)

# inputs=resnet.input selects the input layer, outputs=predictions refers to the
# dense layer we created above.

model = tf.keras.Model(inputs=resnet.input, outputs=predictions_layer)

我认为可能导致我的问题的原因是我的模型声明,因为当我观察我的 model.summary() 时,我看到的是这个(当然排除了所有层之间的所有内容):

model.summary() 的输出

input_1 (InputLayer)            [(None, 299, 299, 3) 0       
__________________________________________________________________________________________________
dropout (Dropout)               (None, 8, 8, 192)    0           batch_normalization_195[0][0]    
__________________________________________________________________________________________________               
dense (Dense)                   (None, 8, 8, 7)      1351        dropout[0][0]                    
==================================================================================================
Total params: 47,465,959
Trainable params: 47,411,559
Non-trainable params: 54,400

我包含了整个文件的粘贴箱,以防我遗漏任何内容:https://pastebin.com/raw/E0VQ83JQ

我知道它需要类型 (None, None) 并且我的输出层被发送到形状 (None, 8, 8, 7) 的密集层,但是我将如何进行整形?

感谢您提供任何帮助,包括您认为我会在该主题上发现有用的文档。

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    在 ResNet 的输出和 Dense 层之间应该有一个 flatten 层。

    # Create Inception Res Net model as used in paper
    
    resnet = tf.keras.applications.inception_resnet_v2.InceptionResNetV2()
    
    print("Layers of ResNet: "+str(len(resnet.layers))) //782 layers
    
    x = resnet.layers[-28].output
    
    x = tf.keras.layers.Dropout(0.25)(x)
    
    ### Edit here.
    x = tf.keras.layers.Flatten()(x)
    # Make a prediction layer with 7 nodes for the 7 dir in our train_dir.
    predictions_layer = tf.keras.layers.Dense(7, activation='softmax')(x)
    
    # print(resnet.input)
    
    # inputs=resnet.input selects the input layer, outputs=predictions refers to the
    # dense layer we created above.
    
    model = tf.keras.Model(inputs=resnet.input, outputs=predictions_layer)
    

    另外,请确保 train_batches 有效。

    【讨论】:

      【解决方案2】:

      首先将 X 和 Y 转换为 numpy 数组,然后将 x_train,y_train 转换为“标准比例”,将大值转换为小值

      X=X.values
      y=y.values
      
      from sklearn.preprocessing import StandardScaler
      scaler=StandardScaler()
      X_train=scaler.fit_transform(X_train)
      X_test=scaler.fit_transform(X_test)
      

      现在申请model.fit

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-05
        • 2022-10-05
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2018-06-01
        • 2021-01-12
        • 1970-01-01
        相关资源
        最近更新 更多