     cudaStatus = cudaGetLastError();
     checkCudaErrors(cudaStatus);
     conv2.Backward({conv2_top}, {conv2_top_diff}, {relu1_top}, {relu1_top_diff});
-    show_tensor<<<1,1>>>(conv2.W_diff_);
-    cudaStatus = cudaGetLastError();
-    checkCudaErrors(cudaStatus);
+    cudaStatus = cudaGetLastError();
+    checkCudaErrors(cudaStatus);
+
+    conv2.UpdateWb(lr);
+    cudaStatus = cudaGetLastError();
+    checkCudaErrors(cudaStatus);
+
     relu1.Backward({relu1_top}, {relu1_top_diff}, {pool1_top}, {pool1_top_diff});
     cudaStatus = cudaGetLastError();
     checkCudaErrors(cudaStatus);


  Session* session = Session::GetNewSession();
  session->gpu = true;
  session->batch_size = 1;
  size_t batch_size = session->batch_size;


  Data<float> data_layer(batch_size, "datasets/cifar10/train1.txt");
  // vector<size_t*> data_tops_dims;
  size_t data_tops_dims0[4];
  size_t data_tops_dims1[4];

  Tensor<float> * relu2_top = Tensor<float>::CreateTensorGPU(relu2_top_dims);
  Tensor<float> * relu2_top_diff = Tensor<float>::CreateTensorGPU(relu2_top_dims);

  Conv2D<float> conv3(5,5,32,64,1, new GaussianKernelInitializer<float>(0.01), SAME);
  size_t conv3_top_dims[4];
  conv3.GetTopsDims({relu2_top_dims}, {conv3_top_dims});
  Tensor<float> * conv3_top = Tensor<float>::CreateTensorGPU(conv3_top_dims);
