Python 使用tf.data和mode.fit时1DConv输入的维度出错

Python 使用tf.data和mode.fit时1DConv输入的维度出错,python,tensorflow,keras,deep-learning,neural-network,Python,Tensorflow,Keras,Deep Learning,Neural Network,我正在使用TensorFlow 2.0.0,并试图使用来自_generator()的tf.data.Dataset.创建我自己的数据集 这是我的密码: def trainDatagen(): 对于生产线列表中的npy: x=tf.convert_to_tensor(np.load(npy),dtype=tf.float32) 如果npy在gbmlist中: y=to_分类(0,num_类=2) 其他: y=to_分类(1,num_类=2) 产量x,y def tfDatasetGen(数据源、输

我正在使用TensorFlow 2.0.0,并试图使用来自_generator()的tf.data.Dataset.创建我自己的数据集

这是我的密码:

def trainDatagen():
对于生产线列表中的npy:
x=tf.convert_to_tensor(np.load(npy),dtype=tf.float32)
如果npy在gbmlist中:
y=to_分类(0,num_类=2)
其他:
y=to_分类(1,num_类=2)
产量x,y
def tfDatasetGen(数据源、输出类型、is训练、批量大小):
dataset=tf.data.dataset.from_生成器(生成器=datagen,输出类型=输出类型)
如果是大学培训:
dataset.shuffle(缓冲区大小=100)
dataset.repeat()
dataset.batch(批次大小=批次大小)
dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
返回数据集
列车组=tfDatasetGen(
数据生成=列车数据生成,
输出类型=(tf.float32,tf.float32),
_training=True,
批次(单位尺寸=16)
所有这些npy文件都是np.array,形状为[40002048],是从带有4000块瓷砖的大型病理切片中获得的。每个瓷砖的特征由ResNet50计算

这是我的模型:

def top_k(输入,k):
返回tf.nn.top_k(输入,k=k,排序=True)。值
def最小值(输入,k):
返回-tf.nn.top_k(-inputs,k=k,sorted=True)。值
def最小最大值k(输入,k):
返回tf.concat([top_k(输入,k),least_k(输入,k)],轴=-1)
输入=keras.Input(形状=(40002048))
y=layers.Conv1D(12048,使用_bias=False,padding='same',data_format='channels'u last')(输入)
y=层。展平()(y)
y=layers.Lambda(minmax_k,参数={'k':5})(y)
y=层密度(单位=200,激活=tf.nn.relu)(y)
y=层。辍学率(0.5)(y)
y=层密度(单位=100,激活=tf.nn.relu)(y)
y=层密度(单位=2,激活=tf.nn.softmax)(y)
模型=keras.模型(输入=输入,输出=y)
在使用model.fit()训练模型时,我收到以下消息:

ValueError: Error when checking input: expected input_4 to have 3 dimensions, but got array with shape (4000, 2048)
所有这些想法都来自论文arXiv:1802.02212。这是我试图复制的神经网络图


我听从了Mahsa Hassankashi的建议,将输入改为(40002048,1)

x=tf.convert_to_tensor(np.load(npy).重塑(40002048,1),dtype=tf.float32)
并根据GitHub问题修改了此部分以修复错误:

train\u set=tfDatasetGen(
数据生成=列车数据生成,
输出类型=(tf.float32,tf.float32),
**输出形状=(tf.TensorShape((无,无,无)),tf.TensorShape((2,)**
_training=True,
批次(单位尺寸=16)
但我明白了:

InvalidArgumentError:  input and filter must have the same depth: 1 vs 2048
最后,我尝试将输入重塑为(140002048),这一次我遇到了另一种错误:

InvalidArgumentError:  Expected size[0] in [0, 1], but got 2

请查看列车列表,如果需要二维卷积NN,请使用:

否则,对于最后一个错误:

InvalidArgumentError:  Expected size[0] in [0, 1], but got 2
当生成的元素是张量时,from_生成器函数会将其展平以输出_类型。这种转换是行不通的

解决方案是,当生成器生成张量时,使用来自\u张量的或来自\u张量的而不是来自\u生成器的

请测试以下解决方案:

请您测试一下:

1.tensorflow gpu

conda create --name tensorflow
activate tensorflow
pip install tensorflow
pip install tensorflow-gpu
2.时间步长 根据你的卷积,1D需要3维,而卷积2D需要4维。

时间步长=1

然后将X_系列和X_测试重塑为:

X1_Train = X1_Train.reshape((4000,2048,1))
#call model.fit()
3.使用

model.fit_generator()
4.在最后一次压实之前添加展平

model.add(Flatten())

谢谢你的帮助。我按照您的建议重塑输入数组:
x=tf.convert_to_tensor(np.load(npy)。重塑((40002048,1)),dtype=tf.float32)
然后它引发了另一个错误:
371 def validate_all_tensor_形状(x,x_值):372#验证x中所有元素的形状是否具有相同的形状-->373 x_形状=x_值[0].shape.as_list()374表示范围内的i(1,len(x_值)):375如果x_shape!=x_值[i]。形状。as_列表():值错误:as_列表()未在未知的张量形状上定义太好了,请告诉我您的输出。@Satantango您确定它是conv1吗?是的。以下是eassay中给出的描述:首先,P=2048 ResNet-50特征的一组一维嵌入通过跨越瓷砖索引轴的J一维卷积层进行计算。
model.add(Flatten())