keras输入形状:输入与图层不兼容

时间:2020-07-08 12:28:22

标签: python machine-learning keras neural-network

我看过一些类似的问题,但我仍然不知道如何解决我的问题。

我正在尝试构建一个CNN,该示波器基于示波器随时间推移检测器中释放的能量的本质,估算撞击到检测器的粒子数量。

我有100,000个事件,其中有1024个时间样本,我将80/20分为火车/测试,就像这样:

from sklearn.model_selection import train_test_split
train_to_test_ratio=0.8 #proportion of the dataset to include in the train split

X_train,X_test,Y_train,Y_test=train_test_split(NormSignals,labels,train_size=train_to_test_ratio)

no_outputs = 14 # maximum number of particles expected

# force the labels to have 14 binary digits, one for each of the possible outputs 
Y_train=tf.one_hot(Y_train,no_outputs)
Y_test=tf.one_hot(Y_test,no_outputs)

当我尝试定义网络的输入形状时,我会这样做(下面是完整的CNN代码):

# Define input to neural network (tensors of 1024 time samples x 1 amplitude per sample)
inputs = keras.Input(shape=(1024,1))

但是它给我一个错误:“层Conv_1的输入0与该层不兼容:预期的ndim = 4,找到的ndim = 3。收到的完整图形:[无,1024,1]”

我认为输入形状就像传递到网络的数据阵列的形状一样简单。有人可以解释一下我数据的正确形状是什么吗?

非常感谢您!

完整的CNN:

from tensorflow import keras

# Following the architecture of the CNN from the image recognition lab (14/5/2020):
# Simple CNN:

class noiseLayer(keras.layers.Layer):

    def __init__(self,mean):
        super(noiseLayer, self).__init__()
        self.mean = mean

    def call(self, input):
        mean = self.mean
        return input + (np.random.poisson(mean))/mean

# Add data augmentation to produce a random flip of the data (the ECal is symmetrical)
# and add poissonian noise to all of the crystals - using large N and dividing by N normalises 
# the noise to be approximately continuous between 0 and 1

data_augmentation = keras.Sequential([
  noiseLayer(mean = 1000)
], name='DataAugm')

# Define input to neural network (tensors of 1024 time samples x 1 amplitude per sample)
inputs = keras.Input(shape=(1024,1))

#x=inputs
x = data_augmentation(inputs)

# primo blocco Convoluzionale

x = keras.layers.Conv2D(16, kernel_size=(3,3), name='Conv_1')(x)
x = keras.layers.LeakyReLU(0.1)(x)      
x = keras.layers.MaxPool2D((2,2), name='MaxPool_1')(x)

# secondo blocco Convoluzionale
x = keras.layers.Conv2D(16, kernel_size=(3,3), name='Conv_2')(x)
x = keras.layers.LeakyReLU(0.1)(x)
x = keras.layers.MaxPool2D((2,2), name='MaxPool_2')(x)

# terzo blocco convoluzionale 
x = keras.layers.Conv2D(32, kernel_size=(3,3), name='Conv_3')(x)
x = keras.layers.LeakyReLU(0.1)(x)
x = keras.layers.MaxPool2D((2,2), name='MaxPool_3')(x)

# Flatten output tensor of the last convolutional layer so it can be used as  
# input to the dense layers

x = keras.layers.Flatten(name='Flatten')(x)

# dense network: 2 dense hidden layer with 256 neurons, with ReLU activation

# Classifier
x = keras.layers.Dense(64, name='Dense_1')(x)
x = keras.layers.ReLU(name='ReLU_dense_1')(x)
#x = keras.layers.Dropout(0.2)(x)
x = keras.layers.Dense(64, name='Dense_2')(x)
x = keras.layers.ReLU(name='ReLU_dense_2')(x)

outputs = keras.layers.Dense(no_outputs, activation='softmax', name='Output')(x)

# Model definition
model = keras.Model(inputs=inputs, outputs=outputs, name='VGGlike_CNN')

# Print model summary
model.summary()

# Show model structure
keras.utils.plot_model(model, show_shapes=True)

1 个答案:

答案 0 :(得分:0)

问题是我正在使用2D层尝试解决1D问题。

将所有2D图层更改为1D现在可以正确编译:


x = keras.layers.Conv1D(16, kernel_size=(3), name='Conv_1')(x)
x = keras.layers.LeakyReLU(0.1)(x)      
x = keras.layers.MaxPool1D((2), name='MaxPool_1')(x)

# secondo blocco Convoluzionale
x = keras.layers.Conv1D(16, kernel_size=(3), name='Conv_2')(x)
x = keras.layers.LeakyReLU(0.1)(x)
x = keras.layers.MaxPool1D((2), name='MaxPool_2')(x)

# terzo blocco convoluzionale 
x = keras.layers.Conv1D(32, kernel_size=(3), name='Conv_3')(x)
x = keras.layers.LeakyReLU(0.1)(x)
x = keras.layers.MaxPool1D((2), name='MaxPool_3')(x)

# Flatten output tensor of the last convolutional layer so it can be used as  
# input to the dense layers

x = keras.layers.Flatten(name='Flatten')(x)

# dense network: 2 dense hidden layer with 256 neurons, with ReLU activation

# Classifier
x = keras.layers.Dense(64, name='Dense_1')(x)
x = keras.layers.ReLU(name='ReLU_dense_1')(x)
#x = keras.layers.Dropout(0.2)(x)
x = keras.layers.Dense(64, name='Dense_2')(x)
x = keras.layers.ReLU(name='ReLU_dense_2')(x)