警告:tensorflow:为输入张量“ input_5:0”,shape =20,37,42,dtype = float32构建了形状为20,37,42的模型,但是

问题描述

警告:tensorflow:使用输入Tensor(“ input_5:0”,shape =(20,37,42),dtype = float32)的形状(20,37,42)构造模型,但在输入的形状不兼容(无,37)。

你好!这里是深度学习菜鸟...我在使用LSTM层时遇到了麻烦。 输入是一个长度为37的float数组,其中包含2个float,以及一个长度为35的单热点数组,转换为float。输出是长度为19的0和1的数组。就像标题所暗示的那样,我在调整输入数据以适应模型时遇到了麻烦,而且我甚至不确定哪些输入尺寸会被认为是“兼容的”

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers


import random
inputs,outputs = [],[]
for x in range(10000):
    tempi,tempo = [],[]
    tempi.append(random.random() - 0.5)
    tempi.append(random.random() - 0.5)
    for x2 in range(35):
        if random.random() > 0.5:
            tempi.append(1.)
        else:
            tempi.append(0.)
    for x2 in range(19):
        if random.random() > 0.5:
            tempo.append(1.)
        else:
            tempo.append(0.)
    inputs.append(tempi)
    outputs.append(tempo)

batch = 20
timesteps = 42
training_units = 0.85

cutting_point_i = int(len(inputs)*training_units)
cutting_point_o = int(len(outputs)*training_units)
x_train,x_test = np.asarray(inputs[:cutting_point_i]),np.asarray(inputs[cutting_point_i:])
y_train,y_test = np.asarray(outputs[:cutting_point_o]),np.asarray(outputs[cutting_point_o:])

input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150,activation="sigmoid",return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150,return_sequences=True)(x)
output_layer = layers.Dense(10,activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer,outputs=output_layer,name="my_model"

解决方法

这里有几个问题。

  • 您的输入没有时间步长,您需要输入形状(n,time steps,features)
  • input_shape中,时间步长维度排在第一位,而不是最后一位
  • 您的最后一个LSTM层返回了序列,因此您无法将其与0和1s进行比较

我做了什么:

  • 我为您的数据添加了时间步长(7)
  • 我排列了input_shape中的尺寸
  • 我设置了最后一个return_sequences=False

使用生成的数据完全固定的示例:

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

batch = 20
n_samples = 1000
timesteps = 7
features = 10

x_train = np.random.rand(n_samples,timesteps,features)
y_train = keras.utils.to_categorical(np.random.randint(0,10,n_samples))

input_layer = keras.Input(shape=(timesteps,features),batch_size=batch)
dense = layers.LSTM(16,activation="sigmoid",return_sequences=True)(input_layer)
hidden_layer_2 = layers.LSTM(16,return_sequences=False)(dense)
output_layer = layers.Dense(10,activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer,outputs=output_layer,name="my_model")

model.compile(loss='categorical_crossentropy',optimizer='adam')

history = model.fit(x_train,y_train)
Train on 1000 samples
  20/1000 [..............................] - ETA: 2:50 - loss: 2.5145
 200/1000 [=====>........................] - ETA: 14s - loss: 2.3934 
 380/1000 [==========>...................] - ETA: 5s - loss: 2.3647 
 560/1000 [===============>..............] - ETA: 2s - loss: 2.3549
 740/1000 [=====================>........] - ETA: 1s - loss: 2.3395
 900/1000 [==========================>...] - ETA: 0s - loss: 2.3363
1000/1000 [==============================] - 4s 4ms/sample - loss: 2.3353
,

模型的正确输入是(20,37,42)。 注意:这里20是您明确指定的batch_size。

代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

batch = 20
timesteps = 42
training_units = 0.85

x1 = tf.constant(np.random.randint(50,size =(1000,37,42)),dtype = tf.float32)
y1 = tf.constant(np.random.randint(10,)),dtype = tf.int32)
 

input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150,return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150,return_sequences=True)(x)
hidden_layer_3 = layers.Flatten()(hidden_layer_2)
output_layer = layers.Dense(10,activation="softmax")(hidden_layer_3)
model = keras.Model(inputs=input_layer,name="my_model")

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
tf.keras.utils.plot_model(model,'my_first_model.png',show_shapes=True)

模型体系结构:

Model

您可以清楚地看到输入大小。

要运行的代码:

model.fit(x = x1,y = y1,batch_size = batch,epochs = 10)

注意:无论您指定了什么batch_size,都必须在model.fit()命令中指定相同的batch_size。

输出:

Epoch 1/10
50/50 [==============================] - 4s 89ms/step - loss: 2.3288 - accuracy: 0.0920
Epoch 2/10
50/50 [==============================] - 5s 91ms/step - loss: 2.3154 - accuracy: 0.1050
Epoch 3/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3114 - accuracy: 0.0900
Epoch 4/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3036 - accuracy: 0.1060
Epoch 5/10
50/50 [==============================] - 5s 99ms/step - loss: 2.2998 - accuracy: 0.1000
Epoch 6/10
50/50 [==============================] - 4s 89ms/step - loss: 2.2986 - accuracy: 0.1170
Epoch 7/10
50/50 [==============================] - 4s 84ms/step - loss: 2.2981 - accuracy: 0.1300
Epoch 8/10
50/50 [==============================] - 5s 103ms/step - loss: 2.2950 - accuracy: 0.1290
Epoch 9/10
50/50 [==============================] - 5s 106ms/step - loss: 2.2960 - accuracy: 0.1210
Epoch 10/10
50/50 [==============================] - 5s 97ms/step - loss: 2.2874 - accuracy: 0.1210