【问题标题】:Error while doing reshape重塑时出错
【发布时间】:2019-02-01 02:35:52
【问题描述】:
from random import randint
from random import seed
import math
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense,TimeDistributed,RepeatVector

seed(1)
def ele():
    X,y = [],[]
    for i in range(1):
        l1=[]
        for _ in range(2):
            l1.append(randint(1,10))
        X.append(l1)
        y.append(sum(l1))
    for i in range(1):
        X = str(X[0][0])+'+'+str(X[0][1])
        y = str(y[0])
    char_to_int = dict((c, i) for i, c in enumerate(alphabet))
    Xenc,yenc = [],[]
    for pattern in X:
        integer_encoded = [char_to_int[char] for char in pattern]
        Xenc.append(integer_encoded[0])
    for pattern in y:
        integer_encoded = [char_to_int[char] for char in pattern]
        yenc.append(integer_encoded[0])
    k,k1 = [],[]
    for i in range(1):
        for j in Xenc:
            vec = np.zeros(11)
            vec[j] = 1
            k.append(vec)
        for j in yenc:
            vec1 = np.zeros(11)
            vec1[j] = 1
            k1.append(vec1)
        k = np.array(k)
        k1 = np.array(k1)
    return k,k1

alphabet = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+']

model = Sequential()
model.add(LSTM(100, input_shape=(n_in_seq_length,11)))
model.add(RepeatVector(2))
model.add(LSTM(50, return_sequences=True))
model.add(TimeDistributed(Dense(n_chars, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

for i in range(1):
    X,y = ele()
    #X = np.reshape(X, (4,1,11))
    model.fit(X, y, epochs=1, batch_size=10)

我收到了这个错误:

ValueError Traceback(最近调用 最后)在() 第53章 54 #X = np.reshape(X, (4,1,11)) ---> 55 model.fit(X, y, epochs=1, batch_size=10)

~\Anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y,batch_size,epochs,详细,回调,validation_split, 验证数据,洗牌,类权重,样本权重,初始时期, steps_per_epoch, validation_steps, **kwargs) 第948章 第949章 --> 950 批次大小=批次大小) 951 # 准备验证数据。 第952章

~\Anaconda3\lib\site-packages\keras\engine\training.py 在 _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 第747章 748 check_batch_axis=False, #不强制批量大小。 --> 749 异常_前缀='输入') 750 751 如果 y 不是无:

~\Anaconda3\lib\site-packages\keras\engine\training_utils.py 在 标准化输入数据(数据,名称,形状,check_batch_axis, 异常前缀) 125 ': 预期 ' + names[i] + ' 有 ' + 126 str(len(shape)) + ' 维度,但得到了数组 ' --> 127 '带形状' + str(data_shape)) 128 如果不是 check_batch_axis: 129 数据形状=数据形状[1:]

ValueError:检查输入时出错:预期 lstm_42_input 有 3 维,但得到了形状为 (4, 11) 的数组

【问题讨论】:

    标签: python machine-learning keras reshape


    【解决方案1】:

    代码中存在重塑数据的问题。用于重塑 cf Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (339732, 29)https://github.com/keras-team/keras/issues/5214。在python数组中[]的个数表示数组的维数

    TimeDistributed 层在您的代码中至少需要 两个 时间步长,在下面的代码中使用了 timestep=3,因为 33 不能被 2 整除。一般来说,TimeDistributed 层是用于实现一对多多对多配置,参见https://github.com/keras-team/keras/issues/1029

    以下代码正在运行,对1 个样本(batch_size)、3 个时间步、11 个特征进行了整形

    from random import randint
    from random import seed
    import math
    import numpy as np
    from keras.models import Sequential
    from keras.layers import LSTM
    from keras.layers import Dense,TimeDistributed,RepeatVector
    
    seed(1)
    def ele():
        X,y = [],[]
        for i in range(1):
            l1=[]
            for _ in range(2):
                l1.append(randint(1,10))
            X.append(l1)
            y.append(sum(l1))
        for i in range(1):
            X = str(X[0][0])+'+'+str(X[0][1])
            y = str(y[0])
        char_to_int = dict((c, i) for i, c in enumerate(alphabet))
        Xenc,yenc = [],[]
        for pattern in X:
            integer_encoded = [char_to_int[char] for char in pattern]
            Xenc.append(integer_encoded[0])
        for pattern in y:
            integer_encoded = [char_to_int[char] for char in pattern]
            yenc.append(integer_encoded[0])
        k,k1 = [],[]
        for i in range(1):
            for j in Xenc:
                vec = np.zeros(11)
                vec[j] = 1
                k.append(vec)
            for j in yenc:
                vec1 = np.zeros(11)
                vec1[j] = 1
                k1.append(vec1)
            k = np.array(k)
            k1 = np.array(k1)
        return k,k1
    
    
    
    
    alphabet = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+']
    n_chars = 11
    
    for i in range(1):
        X,y = ele()
        print('X not reshaped :', X)
        print('y not reshaped :', y)
    
        # timestep = 3, batch_size =1, input_dim = nb_features = 11
        X = np.reshape(X, (1,X.shape[0],X.shape[1]))
        y = np.reshape(y, (1,y.shape[0],y.shape[1]))
        print('X reshaped :', X)
        print('y reshaped :', y)
        print(' X.shape[0] :', X.shape[0])
        print(' X.shape[1] :', X.shape[1])
        print(' X.shape[2] :', X.shape[2])
    
    model = Sequential()
    model.add(LSTM(100, input_shape=(X.shape[1],X.shape[2])))
    model.add(RepeatVector(2))
    model.add(LSTM(50, return_sequences=True))
    model.add(TimeDistributed(Dense(n_chars, activation='softmax')))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    model.fit(X, y, epochs=1, batch_size=10)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多