如何在 CNN 上进行无监督学习

时间:2020-12-22 11:06:27

标签: python tensorflow machine-learning keras conv-neural-network

The model architecture

This is the task that I am performing using this model

这是我的模型

def create_convolution_layers(input_img):
  
  # 1st Convolutional Layer
  model = Conv2D(filters=96,input_shape=image_shape, kernel_size=(11,11),strides=(4,4),padding='valid')(input_img)
  # model = ReLU()(model)
  
  #Max Pooling
  model= MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(model)
  #Add Dropout to prevent overfitting
  model=(Dropout(0.4))(model)

  #2nd Convolutional Layer
  model=Conv2D(filters=384,kernel_size=(5,5), strides=(2,2),padding='same')(model)
  # model = ReLU()(model)
  #Max Pooling 
  model=(MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same'))(model)
  #Add Dropout to prevent overfitting
  model=(Dropout(0.4))(model)

  #3rd Convolutional layer
  model=Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding='same')(model)
  # model = ReLU()(model)
  
  #4th Convolutional layer
  model=Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding='same')(model)
  # model = ReLU()(model)

  #5th Convolutional Layer
  model=Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding='same')(model)
  # model = ReLU()(model)
  #Max Pooling
  model=MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(model)

  #Passing it  to fully connected layer , Here we do flatten
  model=Flatten()(model)

  #6th-Fully connected layer has 4096 neurons 
  model=Dense(4096,input_shape=(96*96*3,))(model)
  # model = ReLU()(model)    
  return model

两个模型的串联

image_shape=(96,96,3)
first_input=Input(shape=image_shape)
first_patch=create_convolution_layers(first_input)
second_input=Input(shape=image_shape)
second_patch=create_convolution_layers(second_input)
final=concatenate([first_patch,second_patch])

#7th-fully connected layer
z=Dense(4096,input_shape=(4096*2,))(final)
#8th-fully connected layer
z=Dense(4096,input_shape=(4096,))(z)
#Output
z=Dense(8,activation='softmax')(z)

model=Model(inputs=[first_input,second_input],outputs=[z])
model.compile(loss='categorical_crossentropy',optimizer=optimizers.Adam(),metrics=['accracy'])
best_weights_file="weights.best.hdf5"
checkpoint = ModelCheckpoint(best_weights_file, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks = [checkpoint]

Model Summary after coding

Input= 一个 3d 数组。 “anchor_4d”和“relative_4d”中的每个数组都是维度(96,96,3=Patch Dimension)

model.fit((anchor_4d,relative_4d),epochs=20,callbacks=callbacks,verbose=1,shuffle=True)

这是我尝试拟合模型时遇到的错误

值错误:在用户代码中:

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:805 train_function  *
    return step_function(self, iterator)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:795 step_function  **
    outputs = model.distribute_strategy.run(run_step, args=(data,))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1259 run
    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica
    return self._call_for_each_replica(fn, args, kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica
    return fn(*args, **kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:788 run_step  **
    outputs = model.train_step(data)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:757 train_step
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:498 minimize
    return self.apply_gradients(grads_and_vars, name=name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:598 apply_gradients
    grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/utils.py:79 filter_empty_gradients
    ([v.name for _, v in grads_and_vars],))

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_5/kernel:0', 'conv2d_5/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'conv2d_6/kernel:0', 'conv2d_6/bias:0', 'conv2d_2/kernel:0', 'conv2d_2/bias:0', 'conv2d_7/kernel:0', 'conv2d_7/bias:0', 'conv2d_3/kernel:0', 'conv2d_3/bias:0', 'conv2d_8/kernel:0', 'conv2d_8/bias:0', 'conv2d_4/kernel:0', 'conv2d_4/bias:0', 'conv2d_9/kernel:0', 'conv2d_9/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0', 'dense_3/kernel:0', 'dense_3/bias:0', 'dense_4/kernel:0', 'dense_4/bias:0'].

这个错误是因为我没有提供标签-->(y),因为我正在尝试使用无监督方法训练模型,在这种情况下可以做些什么来解决这个错误。

0 个答案:

没有答案