【问题标题】:Error with the dimension of 1DConv input when using tf.data and mode.fit使用 tf.data 和 mode.fit 时 1DConv 输入的维度出错
【发布时间】:2020-09-10 22:52:56
【问题描述】:

我正在使用 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 个切片的大型病理幻灯片。 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。这是我试图重现的神经网络图。


我按照 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

最后我尝试将输入重塑为(1,4000,2048),这一次又出现了另一种错误:

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

【问题讨论】:

    标签: python tensorflow keras deep-learning neural-network


    【解决方案1】:

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

    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_tensorsfrom_tensor_slices 代替 from_generator

    请测试以下解决方案:

    你能测试一下吗:

    1.tensorflow 显卡

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

    2.时间步长 根据this,您的 convolution1d 需要 3 维,而 convolution2d 需要 4。

    input_shape = (timesteps, input_dim)
    

    时间步长=1

    然后将 X_train 和 X_test 重塑为:

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

    3.使用

    model.fit_generator()
    

    4.在最后一个dense之前添加flatten。

    model.add(Flatten())
    

    keras convolution_layers

    【讨论】:

    • 感谢您帮助我。我按照你的建议重塑了输入数组:x = tf.convert_to_tensor(np.load(npy).reshape((4000,2048,1)), dtype=tf.float32) 然后它引发了另一个错误:371 def validate_all_tensor_shapes(x, x_values): 372 # Validate that the shape of all the elements in x have the same shape --> 373 x_shape = x_values[0].shape.as_list() 374 for i in range(1, len(x_values)): 375 if x_shape != x_values[i].shape.as_list(): ValueError: as_list() is not defined on an unknown TensorShape.
    • 太好了,让我知道你的输出。
    • @Santango 你确定是 conv1 吗?
    • 是的。以下是文章中给出的描述:首先,通过跨图块索引轴的 J 个一维卷积层计算 P = 2048 ResNet-50 特征的一组一维嵌入
    猜你喜欢
    • 2021-10-04
    • 2020-04-01
    • 1970-01-01
    • 2018-11-03
    • 2019-03-06
    • 1970-01-01
    • 2022-10-24
    • 2020-01-04
    • 2017-09-10
    相关资源
    最近更新 更多