ValueError:输入0与层conv_1不兼容:预期ndim = 3,找到的ndim = 4 [英] ValueError: Input 0 is incompatible with layer conv_1: expected ndim=3, found ndim=4

查看:252
本文介绍了ValueError:输入0与层conv_1不兼容:预期ndim = 3,找到的ndim = 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作变体自动编码器以学习编码DNA序列,但遇到了意外错误.

I am trying to make a variational auto encoder to learn to encode DNA sequences, but am getting an unexpected error.

我的数据是一个热阵列.

My data is an array of one-hot arrays.

我遇到的问题是值错误.告诉我,我的输入显然是三维的(100,4008,4),所以我有一个三维输入.

The issue I'm getting is a Value Error. It's telling me that I have a four dimensional input, when my input is clearly three-dimensional (100, 4008, 4).

实际上,当我打印出seq层时,它说它的形状是(?,100,4008,4).

In fact, when I print out the seq layer, it says that it's shape is (?, 100, 4008, 4).

当我取出一个尺寸时,它给我一个二维错误.

When I take out a dimension, it then gives me an error for being two dimensional.

任何帮助将不胜感激!

Any help will be highly appreciated!

代码是:

from keras.layers import Input 
from keras.layers.convolutional import Conv1D
from keras.layers.core import Dense, Activation, Flatten, RepeatVector, Lambda
from keras import backend as K
from keras.layers.wrappers import TimeDistributed
from keras.layers.recurrent import GRU
from keras.models import Model
from keras import objectives

from one_hot import dna_sequence_to_one_hot

from random import shuffle
import numpy as np

# take FASTA file and convert into array of vectors
seqs = [line.rstrip() for line in open("/home/ubuntu/sequences.fa", "r").readlines() if line[0] != ">"]
seqs = [dna_sequence_to_one_hot(s) for s in seqs]
seqs = np.array(seqs)

# first random thousand are training, next thousand are validation
test_data = seqs[:1000]
validation_data = seqs[1000:2000]

latent_rep_size = 292
batch_size = 100
epsilon_std = 0.01
max_length = len(seqs[0])
charset_length = 4
epochs = 100

def sampling(args):
    z_mean_, z_log_var_ = args
    # batch_size = K.shape(z_mean_)[0]
    epsilon = K.random_normal_variable((batch_size, latent_rep_size), 0., epsilon_std)
    return z_mean_ + K.exp(z_log_var_ / 2) * epsilon

# loss function
def vae_loss(x, x_decoded_mean):
    x = K.flatten(x)
    x_decoded_mean = K.flatten(x_decoded_mean)
    xent_loss = max_length * objectives.categorical_crossentropy(x, x_decoded_mean)
    kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis = -1)
    return xent_loss + kl_loss

# Encoder
seq = Input(shape=(100, 4008, 4), name='one_hot_sequence')
e = Conv1D(9, 9, activation = 'relu', name='conv_1')(seq)
e = Conv1D(9, 9, activation = 'relu', name='conv_2')(e)
e = Conv1D(9, 9, activation = 'relu', name='conv_3')(e)
e = Conv1D(10, 11, activation = 'relu', name='conv_4')(e)
e = Flatten(name='flatten_1')(e)
e = Dense(435, activation = 'relu', name='dense_1')(e)
z_mean = Dense(latent_rep_size, name='z_mean', activation = 'linear')(e)
z_log_var = Dense(latent_rep_size, name='z_log_var', activation = 'linear')(e)
z = Lambda(sampling, output_shape=(latent_rep_size,), name='lambda')([z_mean, z_log_var])

encoder = Model(seq, z)

# Decoder
d = Dense(latent_rep_size, name='latent_input', activation = 'relu')(z)
d = RepeatVector(max_length, name='repeat_vector')(d)
d = GRU(501, return_sequences = True, name='gru_1')(d)
d = GRU(501, return_sequences = True, name='gru_2')(d)
d = GRU(501, return_sequences = True, name='gru_3')(d)
d = TimeDistributed(Dense(charset_length, activation='softmax'), name='decoded_mean')(d)



# create the model, compile it, and fit it
vae = Model(seq, d)
vae.compile(optimizer='Adam', loss=vae_loss, metrics=['accuracy'])
vae.fit(x=test_data, y=test_data, epochs=epochs, batch_size=batch_size, validation_data=validation_data)

推荐答案

在文档中提到我们需要以(None,NumberOfFeatureVectors)的特定格式提及输入.在您的情况下,它将为(无,4)

In the documentation it is mentioned that we need to mention the input in a specific format which is (None,NumberOfFeatureVectors). In your case it will be (None,4)

https://keras.io/layers/convolutional/

在将此层用作模型的第一层时,请提供一个 input_shape参数(整数或无的元组,例如(10,128) 128维向量的10个向量的序列,或者(无,128) 128维向量的可变长度序列.

When using this layer as the first layer in a model, provide an input_shape argument (tuple of integers or None, e.g. (10, 128) for sequences of 10 vectors of 128-dimensional vectors, or (None, 128) for variable-length sequences of 128-dimensional vectors.

这篇关于ValueError:输入0与层conv_1不兼容:预期ndim = 3,找到的ndim = 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆