Python Keras模型输入的形状(尺寸)和类型错误

Python Keras模型输入的形状(尺寸)和类型错误,python,tensorflow,keras,nlp,layer,Python,Tensorflow,Keras,Nlp,Layer,我非常想设置这个简单Keras模型的输入形状:( X和Y都是numpy.narray,但我不知道它有什么问题!我尝试了不同的X形状,但存在错误!代码中提供了数据集的信息(尺寸、样本数等)。 X_train的.pkl文件是从预训练模型的隐藏状态获取的 import pandas as pd from sklearn.preprocessing import LabelEncoder from keras.utils import np_utils from keras import Input,

我非常想设置这个简单Keras模型的输入形状:( X和Y都是numpy.narray,但我不知道它有什么问题!我尝试了不同的X形状,但存在错误!代码中提供了数据集的信息(尺寸、样本数等)。 X_train的.pkl文件是从预训练模型的隐藏状态获取的

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils
from keras import Input, Model
from keras.layers import Dense
import numpy as np

############################## X_Train ############################

X_Train_3embed1 = pd.read_pickle("XX_Train_3embeding.pkl")


X_Train_3embed = np.array(X_Train_3embed1)

print("X-Train")
print(X_Train_3embed.shape)   # (230, 1, 128)
print(type(X_Train_3embed))  # <class 'numpy.ndarray'>
print(X_Train_3embed[0].shape) # (1, 128)
print(type(X_Train_3embed[0])) # <class 'numpy.ndarray'>


############################## Y_Train ############################

Y_Train_labels_list = pd.read_pickle("lis_Y_all_Train.pkl")

print(type(Y_Train_labels_list))  #<class 'numpy.ndarray'>
print(type(Y_Train_labels_list[0])) #<class 'str'>

encoder = LabelEncoder()
encoder.fit(Y_Train_labels_list)
encoded_Y = encoder.transform(Y_Train_labels_list)
Y_my_Train = np_utils.to_categorical(encoded_Y)


print("Y-Train")
print(Y_my_Train.shape) #(230, 83)
print(type(Y_my_Train)) # <class 'numpy.ndarray'>
print(Y_my_Train[0].shape) # (83,)
print(type(Y_my_Train[0])) # <class 'numpy.ndarray'>

##################################  Model  ##################################

first_input = Input(shape=(1, 128))

first_dense = Dense(128)(first_input)

output_layer = Dense(83, activation='softmax')(first_dense)

model = Model(inputs=first_input, outputs=output_layer)

model.summary()


model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])


history = model.fit((X_Train_3embed, Y_my_Train), epochs=2, batch_size=32)
将熊猫作为pd导入
从sklearn.preprocessing导入标签编码器
从keras.utils导入np_utils
从keras导入输入,模型
从keras.layers导入稠密
将numpy作为np导入
##############################火车############################
X\u列嵌入1=pd.read\u pickle(“XX\u列嵌入.pkl”)
X_列\u 3embed=np.数组(X_列\u 3embed1)
打印(“X系列”)
打印(X_Train_3embed.shape)#(230,1,128)
打印(类型(X_系列嵌入))#
打印(X_列_3embed[0].形状)#(1128)
打印(类型(X_列嵌入[0]))#
##############################你的火车############################
Y\u Train\u labels\u list=pd.read\u pickle(“lis\u Y\u all\u Train.pkl”)
打印(类型(Y列标签列表))#
打印(类型(Y列标签列表[0]))#
编码器=LabelEncoder()
编码器安装(Y系列标签列表)
encoded_Y=编码器.transform(Y列标签列表)
Y_my_Train=np_utils.to_category(编码的_Y)
打印(“Y列”)
打印(Y_my_Train.shape)#(230,83)
打印(键入(Y_my_Train))#
打印(Y_my_Train[0].形状)#(83,)
打印(键入(Y_my_Train[0]))#
##################################模型##################################
第一个输入=输入(形状=(1128))
第一个密集=密集(128)(第一个密集输入)
输出层=密集(83,激活='softmax')(第一层密集)
模型=模型(输入=第一个输入,输出=输出层)
model.summary()
compile(优化器='adam',loss='classifical_crossentropy',metrics=['acc'])
历史=model.fit((X\u系列3embed,Y\u我的系列),历代=2,批量大小=32)
结果如下:

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 1, 128)            0         
_________________________________________________________________
dense_1 (Dense)              (None, 1, 128)            16512     
_________________________________________________________________
dense_2 (Dense)              (None, 1, 83)             10707     
=================================================================
Total params: 27,219
Trainable params: 27,219
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):
  File "/home/vahideh/PycharmProjects/3KArgen-master/MyTransferClassifier2.py", line 63, in <module>
    history = model.fit((X_Train_3embed, Y_my_Train), epochs=2, batch_size=32)
  File "/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site-packages/keras/engine/training.py", line 1154, in fit
    batch_size=batch_size)
  File "/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site-packages/keras/engine/training.py", line 579, in _standardize_user_data
    exception_prefix='input')
  File "/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site-packages/keras/engine/training_utils.py", line 99, in standardize_input_data
    data = [standardize_single_array(x) for x in data]
  File "/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site-packages/keras/engine/training_utils.py", line 99, in <listcomp>
    data = [standardize_single_array(x) for x in data]
  File "/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site-packages/keras/engine/training_utils.py", line 34, in standardize_single_array
    elif x.ndim == 1:
AttributeError: 'tuple' object has no attribute 'ndim'
模型:“模型1”
_________________________________________________________________
层(类型)输出形状参数
=================================================================
输入_1(输入层)(无,1128)0
_________________________________________________________________
稠密的(稠密的)(无,1128)16512
_________________________________________________________________
密集型_2(密集型)(无,1,83)10707
=================================================================
总参数:27219
可培训参数:27219
不可训练参数:0
_________________________________________________________________
回溯(最近一次呼叫最后一次):
文件“/home/vahideh/PycharmProjects/3KArgen master/MyTransferClassifier2.py”,第63行,在
历史=model.fit((X\u系列3embed,Y\u我的系列),历代=2,批量大小=32)
文件“/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site packages/keras/engine/training.py”,第1154行
批次大小=批次大小)
文件“/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site packages/keras/engine/training.py”,第579行,在用户数据中
异常(前缀为“输入”)
文件“/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site packages/keras/engine/training_utils.py”,第99行,标准化输入数据
数据=[为数据中的x标准化单个数组(x)]
文件“/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site packages/keras/engine/training_utils.py”,第99行,in
数据=[为数据中的x标准化单个数组(x)]
文件“/home/vahideh/PycharmProjects/MyVirtualEnvs/MyKargo/lib/python3.6/site packages/keras/engine/training_utils.py”,第34行,标准化单数组
elif x.ndim==1:
AttributeError:“tuple”对象没有属性“ndim”

如何将这些数据集提供给模型?或者更改模型的输入形状?

您的模型输出是形状
(无,1,83)
,即每个样本输出是
1 x 83
,但每个样本的基本事实是一个标量。处理这个问题有两种方法

  • 展平输出并继续使用数据
  • 删除数据中不必要的维度,即将每个样本从
    1X128
    展平到
    128
    ,并更改模型架构以处理1D数据,这将导致输出为1D
  • 固定代码:

    方法1 输出:

    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_10 (InputLayer)        [(None, 1, 128)]          0         
    _________________________________________________________________
    dense_18 (Dense)             (None, 1, 128)            16512     
    _________________________________________________________________
    dense_19 (Dense)             (None, 1, 83)             10707     
    _________________________________________________________________
    flatten_6 (Flatten)          (None, 83)                0         
    =================================================================
    Total params: 27,219
    Trainable params: 27,219
    Non-trainable params: 0
    _________________________________________________________________
    Epoch 1/2
    8/8 [==============================] - 1s 3ms/step - loss: 6.2275 - acc: 0.0162
    Epoch 2/2
    8/8 [==============================] - 0s 2ms/step - loss: 0.2639 - acc: 0.0150
    
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_13 (InputLayer)        [(None, 128)]             0         
    _________________________________________________________________
    dense_24 (Dense)             (None, 128)               16512     
    _________________________________________________________________
    dense_25 (Dense)             (None, 83)                10707     
    =================================================================
    Total params: 27,219
    Trainable params: 27,219
    Non-trainable params: 0
    _________________________________________________________________
    Epoch 1/2
    8/8 [==============================] - 0s 2ms/step - loss: -1.1705 - acc: 0.0100
    Epoch 2/2
    8/8 [==============================] - 0s 2ms/step - loss: -6.3587 - acc: 0.0015
    
    方法2 输出:

    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_10 (InputLayer)        [(None, 1, 128)]          0         
    _________________________________________________________________
    dense_18 (Dense)             (None, 1, 128)            16512     
    _________________________________________________________________
    dense_19 (Dense)             (None, 1, 83)             10707     
    _________________________________________________________________
    flatten_6 (Flatten)          (None, 83)                0         
    =================================================================
    Total params: 27,219
    Trainable params: 27,219
    Non-trainable params: 0
    _________________________________________________________________
    Epoch 1/2
    8/8 [==============================] - 1s 3ms/step - loss: 6.2275 - acc: 0.0162
    Epoch 2/2
    8/8 [==============================] - 0s 2ms/step - loss: 0.2639 - acc: 0.0150
    
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_13 (InputLayer)        [(None, 128)]             0         
    _________________________________________________________________
    dense_24 (Dense)             (None, 128)               16512     
    _________________________________________________________________
    dense_25 (Dense)             (None, 83)                10707     
    =================================================================
    Total params: 27,219
    Trainable params: 27,219
    Non-trainable params: 0
    _________________________________________________________________
    Epoch 1/2
    8/8 [==============================] - 0s 2ms/step - loss: -1.1705 - acc: 0.0100
    Epoch 2/2
    8/8 [==============================] - 0s 2ms/step - loss: -6.3587 - acc: 0.0015
    

    基本上,MarcoCerliani要求您删除元组

    您的代码:
    model.fit((X\u Train\u 3embed,Y\u my\u Train),epochs=2,batch\u size=32)


    更改代码:
    model.fit(X\u Train\u 3embed,Y\u my\u Train,epochs=2,batch\u size=32)

    删除元组。。。model.fit(X\u Train\u 3embed,Y\u my\u Train,epochs=2,batch\u size=32)另一件事不应该是你的
    X\u Train\u 3embed[0]。shape
    的shape
    (128,)
    在注释中?那么如何训练模型?试试宏如何说它“删除元组”,即不要将数据集包装在元组中,即不要使用元组来帮助,但问题仍然存在,我注意到我在模型摘要中的输入形状与你的不同,我的是:Input_1(InputLayer)(None,1128)0但你在输入中有一个额外的[]:Input_10(InputLayer)[(None,1128)]0,我应该将其转换为list?我将X_Train_3embed转换为list by list(X_Train_3embed),但它不起作用:|.pkl文件是另一个预训练模型层的隐藏状态。。。它们可能不是张量?!我完全糊涂了:(你能告诉我
    X\u Train\u 3embed.shape
    的输出是什么吗?同样在方法1中,我使用的是你的模型架构,希望我在最后添加了一个扁平层。在keras中,你不输入张量,而是输入numpy数组,框架负责将其转换为张量。另一方面,Pytork需要张量。我注意到问题出现了,因为我在fit函数中使用了一个额外的括号!Tnx alot:)