gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:11:57 25 4
gpt4 key购买 nike

我正在使用 TensorFlow 2.0.0 并尝试使用 tf.data.Dataset.from_generator() 创建自己的数据集

这是我的代码:

def trainDatagen():
for npy in train_list:
x = tf.convert_to_tensor(np.load(npy), dtype=tf.float32)
if npy in gbmlist:
y = to_categorical(0, num_classes=2)
else:
y = to_categorical(1, num_classes=2)
yield x, y

def tfDatasetGen(datagen, output_types, is_training, batch_size):
dataset = tf.data.Dataset.from_generator(generator=datagen, output_types=output_types)
if is_training:
dataset.shuffle(buffer_size=100)
dataset.repeat()
dataset.batch(batch_size=batch_size)
dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
return dataset

train_set = tfDatasetGen(
datagen = trainDatagen,
output_types = (tf.float32, tf.float32),
is_training = True,
batch_size = 16)

所有这些 npy 文件都是形状为 [4000,2048] 的 np.array,来自具有 4000 个切片的大型病理幻灯片。每个图 block 的特征由 ResNet50 计算。

这是我的模型:

def top_k(inputs, k):
return tf.nn.top_k(inputs, k=k, sorted=True).values

def least_k(inputs, k):
return -tf.nn.top_k(-inputs, k=k, sorted=True).values

def minmax_k(inputs, k):
return tf.concat([top_k(inputs, k), least_k(inputs, k)], axis = -1)

inputs = keras.Input(shape=(4000,2048))
y = layers.Conv1D(1, 2048, use_bias=False, padding='same', data_format='channels_last')(inputs)
y = layers.Flatten()(y)
y = layers.Lambda(minmax_k, arguments={'k': 5})(y)
y = layers.Dense(units=200, activation=tf.nn.relu)(y)
y = layers.Dropout(rate=0.5)(y)
y = layers.Dense(units=100, activation=tf.nn.relu)(y)
y = layers.Dense(units=2, activation=tf.nn.softmax)(y)
model = keras.Model(inputs=inputs, outputs=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 .这是我试图重现的神经网络图。

description of CHOWDER architecture

我按照 Mahsa Hassankashi 的建议将输入重新调整为 (4000,2048,1)

x = tf.convert_to_tensor(np.load(npy).reshape(4000,2048,1), dtype=tf.float32)

并根据GitHub问题修改了这部分以修复错误:

train_set = tfDatasetGen(
datagen = trainDatagen,
output_types = (tf.float32, tf.float32),
**output_shapes = (tf.TensorShape((None,None,None)), tf.TensorShape((2,))),**
is_training = True,
batch_size = 16)

但我得到了这个:
InvalidArgumentError:  input and filter must have the same depth: 1 vs 2048

最后我尝试将输入 reshape 为 (1,4000,2048) ,这一次我遇到了另一种错误:
InvalidArgumentError:  Expected size[0] in [0, 1], but got 2

最佳答案

请查看列车列表,如果卷积神经网络需要二维,请使用:

convolution2d

difference between 1D, 2D, and 3D convolutions in convolutional neural networks (in deep learning)

CNN Dimensional

否则对于最后一个错误:

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

当生成的元素是张量时,from_generator 函数会将其展平为 output_types。而这种转换将不起作用。

解决方案是,使用 来自张量 from_tensor_slices 而不是 from_generator 当生成器生成张量时。

请测试以下解决方案:

你能测试一下吗:

1.tensorflow gpu
conda create --name tensorflow
activate tensorflow
pip install tensorflow
pip install tensorflow-gpu

2.时间步长
根据 this你的 convolution1d 需要 3 个维度,而 convolution2d 需要 4 个。
enter image description here
input_shape = (timesteps, input_dim)

时间步长=1

然后将 X_train 和 X_test reshape 为:
X1_Train = X1_Train.reshape((4000,2048,1))
#call model.fit()

3.使用
model.fit_generator()

4.在最后一个稠密之前加入扁平化。
model.add(Flatten())

keras convolution_layers

关于python - 使用 tf.data 和 mode.fit 时 1DConv 输入的维度出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61983131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com