【问题标题】:Error when checking target: expected lambda_1 to have 1 dimensions, but got array with shape (60000, 10)检查目标时出错:预期 lambda_1 有 1 个维度,但得到了形状为 (60000, 10) 的数组
【发布时间】:2019-01-03 18:29:50
【问题描述】:

我正在尝试创建一个可逆网络,当它后退时,权重矩阵是前向过程中权重矩阵的转置。所以我定义了一个自定义层

  class Backwardlayer(Dense):
        def __init__(self,output_dim,b_layer,activation=None,use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,**kwargs):
            self.output_dim = output_dim
            self.b_layer = b_layer

            super(Backwardlayer, self).__init__(output_dim,**kwargs)

        def build(self, input_shape):
            assert len(input_shape) >= 2
            input_dim = input_shape[-1]

            self.kernel = K.transpose(self.b_layer.kernel)

            if self.use_bias:
                self.bias = self.add_weight(shape=(self.output_dim,),initializer=self.bias_initializer, name='bias', regularizer=self.bias_regularizer, constraint=self.bias_constraint)
            else:
                self.bias = None
            self.built = True

def direction_cosine(x):
    return K.sqrt(K.sum(x, axis=-1, keepdims=None))
def abs(x):
    return K.abs(x)




        input_img = Input(shape=(784,))
        layer_1 = Dense(512, activation=abs)
        layer_2 = Dense(512, activation=abs)
        layer_3 = Dense(256, activation=abs)
        layer_4 = Dense(128, activation=abs)
        layer_5 = Dense(10, activation=abs)

        encoder_layer_1 = layer_1(input_img)
        encoder_layer_2 = layer_2(encoder_layer_1)
        encoder_layer_3 = layer_3(encoder_layer_2)
        encoder_layer_4 = layer_4(encoder_layer_3)
        encoder_layer_5 = layer_5(encoder_layer_4)

    decoder_layer_1 = Backwardlayer(128,b_layer=encoder_layer_5,activation=abs,name='dl1')(encoder_layer_5)
decoder_layer_2 = Backwardlayer(256,b_layer=layer_4,activation=abs,name='dl2')(decoder_layer_1)
    decoder_layer_3 = Backwardlayer(512,b_layer=layer_3,activation=abs,name='dl3')(decoder_layer_2)
    decoder_layer_4 = Backwardlayer(512,b_layer=layer_2,activation=abs,name='dl4')(decoder_layer_3)
    reconstructed_img = Backwardlayer(784,b_layer=layer_1,activation=abs,name='dl5')
rms = RMSprop()
(x_train,y_train), (x_test,y_test) = mnist.load_data()

x_train = x_train.reshape(-1,784)
x_test = x_test.reshape(-1,784)  

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

AANN = Model(input=input_img, output=[reconstructed_img,normalised_output])

AANN.summary()

AANN.compile(optimizer=rms,loss=['mse','categorical_crossentropy'],loss_weights=[1,1])

history = AANN.fit(x_train,[x_train,y_train],epochs=3,batch_size=128,verbose=2,validation_data=(x_test,y_test))

这是错误:检查目标时出错:预期 lambda_1 有 1 个维度,但得到的数组形状为 (60000, 10)

Traceback(最近一次调用最后一次):

 File "AANN.py", line 95, in <module>
    history = AANN.fit(x_train,[x_train,y_train],epochs=3,batch_size=128,verbose=2,validation_data=(x_test,y_test))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 955, in fit
    batch_size=batch_size)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 792, in _standardize_user_data
    exception_prefix='target')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training_utils.py", line 126, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking target: expected lambda_1 to have 1 dimensions, but got array with shape (60000, 10)

【问题讨论】:

    标签: python tensorflow keras tensor


    【解决方案1】:

    错误是自我解释的:“张量没有内核”。

    层有内核。

    这不是真的:

    encoder_layer_1 = layer_1(input_img)
    encoder_layer_2 = layer_2(encoder_layer_1)
    encoder_layer_3 = layer_3(encoder_layer_2)
    encoder_layer_4 = layer_4(encoder_layer_3)
    encoder_layer_5 = layer_5(encoder_layer_4)
    

    这是真的:

    layer_1_output_tensor = layer_1(input_img)
    layer_2_output_tensor = layer_2(layer_1_output_tensor)
    layer_3_output_tensor = layer_3(layer_2_output_tensor)
    layer_4_output_tensor = layer_4(layer_3_output_tensor)
    layer_5_output_tensor = layer_5(layer_4_output_tensor) 
    

    那么你需要:

    decoder_layer_output_1 = Backwardlayer(128,b_layer=layer_5,activation=abs,name='dl1')(layer_5_output_TENSOR)
    

    说实话,我认为你的方法行不通。您需要“矩阵除法”,而不是矩阵乘法。

    也许如果你努力寻找 kernel^(-1) 而不是转置,并在应用它之前减去偏差....

    【讨论】:

    • 你能回答我的另一个错误吗?我有更新问题。谢谢!!!!!!!!!!!!!!!!!!!!!
    • 你的数据的形状不等于模型的输出形状。但是您省略了相关部分。 (y_train 和归一化输出) -- 比较model.summary() 中的输出形状与x_train.shapey_train.shape
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2019-08-22
    • 2019-01-16
    • 2018-03-28
    • 2019-09-11
    • 2019-03-25
    • 2019-03-02
    相关资源
    最近更新 更多