Skip to main content
 首页 » 编程设计

python之Tensorflow 2.0 无法识别张量形状

2024年09月03日29lautakyan007

我无法让我的 RNN 分类器处理我的输入数据。我正在使用带有滑动窗口的 TF 2.0 预发布版。

我正在尝试构建一个 RNN,我在其中提供 5 个时间步长,每个时间步长有 6 个特征,并让它产生第 6 个时间步长作为目标。当我运行我的代码时,它给我一个错误,说输入是 (None,6),而当我打印出我的训练数据时,它清楚地表明形状是 (5,6)。我很困惑如何解决这个问题。

错误:

File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 734, in fit 
    use_multiprocessing=use_multiprocessing) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit 
    distribution_strategy=strategy) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 547, in _process_training_inputs 
    use_multiprocessing=use_multiprocessing) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 593, in _process_inputs 
    steps=steps) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2384, in _standardize_user_data 
    all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2587, in _build_model_with_inputs 
    self._set_inputs(cast_inputs) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2674, in _set_inputs 
    outputs = self(inputs, **kwargs) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 772, in __call__ 
    self.name) 
  File "C:\Users\employee\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow_core\python\keras\engine\input_spec.py", line 177, in assert_input_compatibility 
    str(x.shape.as_list())) 
ValueError: Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 6] 

打印读数:

********************tf.Tensor( 
[[0.07812838 0.08639083 0.07809999 0.08601701 0.6974719  0.6974719 ] 
 [0.06794664 0.06995372 0.06220453 0.06934043 0.70064694 0.70064694] 
 [0.08323035 0.08651368 0.07691107 0.08147305 0.69750804 0.69750804] 
 [0.09781507 0.10009027 0.08847085 0.08919457 0.6944895  0.6944895 ] 
 [0.12235662 0.12269666 0.11316498 0.11738694 0.6868     0.6868    ]], shape=(5, 6), dtype=float32)********************tf.Tensor([[0.08238748 0.09074993 0.07986343 0.09017278 0.6965872  0.6965872 ]], shape=(1, 6), dtype=float32)******************** 
/data comes in as an array of shape [737,6] 
 
train=tf.data.Dataset.from_tensor_slices(features).window(6,1,1,drop_remainder=True).flat_map(lambda x: x.batch(6)).map(lambda window: (window[:-1],window[-1:])) 
 
valid=train.take(200).shuffle(1000).repeat() 
train=train.shuffle(3000).repeat() 
 
for x,y in valid: 
    print('*'*20+str(x)+"*"*20+str(y)+"*"*20) 
 
print(train) 
 
 
model = tf.keras.Sequential() 
 
model.add(layers.SimpleRNN(128,batch_size=10)) 
model.add(layers.Dense(124,kernel_initializer='he_uniform',activation='softmax')) 
 
model.compile(optimizer='adagrad', batch_size=10,step_size=.01, loss=tf.keras.losses.MeanAbsoluteError(), metrics=['accuracy']) 
 
 
 
history = model.fit(train,epochs=100, validation_data=valid,steps_per_epoch=3000,validation_steps=1000) 

请您参考如下方法:

模型需要等级 3 的输入,但传递给等级 2 的输入。

第一层是一个 SimpleRNN,它期望数据的形式为 (batch_size, timesteps, features),即等级 3。用户传递的数据的形状为 (5, 6),即等级 2。

传递 rank-3 数据(包括批处理维度)将解决此问题。