0

I'm having trouble figuring out how to feed my data to a CNN. Data has been extracted from fits files as numpy array of 200x200 representing grayscale images

def create_vgg16():
    img_height = 200
    img_width = 200

    model = Sequential()
    inputs = Input(shape=(200,  200, 1))
    y = Conv2D(64, (3, 3), activation='relu')(inputs)
    y = Conv2D(64, (3, 3), activation='relu')(y)
    y = MaxPooling2D(2, 2)(y)
    y = Conv2D(128, (3, 3), activation='relu')(y)
    y = Conv2D(128, (3, 3), activation='relu')(y)
    y = MaxPooling2D(2, 2)(y)
    y = Conv2D(256, (3, 3), activation='relu')(y)
    y = Conv2D(256, (3, 3), activation='relu')(y)
    y = Conv2D(256, (3, 3), activation='relu')(y)
    y = MaxPooling2D(2, 2)(y)
    y = Flatten()(y)
    y = Dense(100, activation='relu')(y)
    y = Dense(50, activation='relu')(y)
    predictions = Dense(2, activation='softmax')(y)
    test_model = Model(inputs=inputs, outputs=predictions)
    test_model.compile(Adam(lr=.0001), loss='categorical_crossentropy',
                       metrics=['accuracy'])
    test_model.summary()

    model.compile(loss=tf.losses.MeanSquaredError(),
                  optimizer=tf.optimizers.Adagrad(),
                  metrics=tf.keras.metrics.binary_accuracy)

    return model   

    This is what model summary puts out:  
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         [(None, 200, 200, 1)]     0         
    _________________________________________________________________
    conv2d (Conv2D)              (None, 198, 198, 64)      640       
    _________________________________________________________________
    conv2d_1 (Conv2D)            (None, 196, 196, 64)      36928     
    _________________________________________________________________
    max_pooling2d (MaxPooling2D) (None, 98, 98, 64)        0         
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 96, 96, 128)       73856     
    _________________________________________________________________
    conv2d_3 (Conv2D)            (None, 94, 94, 128)       147584    
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2 (None, 47, 47, 128)       0         
    _________________________________________________________________
    conv2d_4 (Conv2D)            (None, 45, 45, 256)       295168    
    _________________________________________________________________
    conv2d_5 (Conv2D)            (None, 43, 43, 256)       590080    
    _________________________________________________________________
    conv2d_6 (Conv2D)            (None, 41, 41, 256)       590080    
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2 (None, 20, 20, 256)       0         
    _________________________________________________________________
    flatten (Flatten)            (None, 102400)            0         
    _________________________________________________________________
    dense (Dense)                (None, 100)               10240100  
    _________________________________________________________________
    dense_1 (Dense)              (None, 50)                5050      
    _________________________________________________________________
    dense_2 (Dense)              (None, 2)                 102       
    =================================================================
    Total params: 11,979,588
    Trainable params: 11,979,588
    
    Non-trainable params: 0 

this is the train data:

print(data_train)

[[ 773  794 1009 ... 1057 1059 1011],  
    
[1847 1890 1897 ... 1968 2116 2365],  
    
[ 670  643  642 ...  633  647  650],  
...,  
[   0    0    0 ...  457  435  429],  
[ 879  848  853 ...  830  858  821],  
[2030 2002 2097 ...    0    0    0]]

and the train data shape:

print(data_train.shape)

(2384, 40000)

The number of channels is 1

Batch size should be retrieved automatically when fitting the model

model.fit(data_train, labels_train, epochs=10, validation_data=(data_test, labels_test), batch_size=32 )

The error put out is

 ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.

Both input shape has been defined and fit() called. So I assume the shape is wrong. When I try to reshape data before feeding

 data_train.reshape((200, 200, 1))

this error is displayed:

ValueError: cannot reshape array of size 95360000 into shape (200,200,1)

I tried

data_train.reshape((-1,200, 200, 1))

and while there are no reshape errors, printing before and after changes absolutely nothing to the shape. How should I go about feeding my data?

2 Answers 2

1

You can use the following command to reshape to a 200x200x1 array.

data = data.reshape(-1,200,200,1)

You can also transform your (n_samples,200,200,1) shaped data into a dataset and batch it. It should fix your dimension problem.

You can do that by using the following command: tf.data.Dataset.from_tensor_slices((inputs,outputs)).batch(BATCHSIZE)

Sign up to request clarification or add additional context in comments.

Comments

0

You create a Model using the test_model Variable instead of model. It is just typo error.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.