从零开始编写深度学习库(二)FullyconnecteLayer CPU编写

从零开始编写深度学习库(二)FullyconnecteLayer CPU编写

博客http://blog.csdn.net/hjimce

微博黄锦池-hjimce   qq:1393852684

一、C++实现

	//y=x*w+b
	static void CFullyconnecteLayer::forward(const Eigen::MatrixXf &inputs, const Eigen::MatrixXf &weights, const Eigen::VectorXf &bais
		, Eigen::MatrixXf &outputs) {

		outputs = inputs*weights;
		outputs.rowwise() += bais.transpose();//每一行加上b
	}
	//y=x*w+b,反向求导后dw=x.T*dy,dx=dy*w.T,db=dy
	static void CFullyconnecteLayer::backward(const Eigen::MatrixXf &inputs, const Eigen::MatrixXf &weights, const Eigen::VectorXf &bais,
		const Eigen::MatrixXf &d_outputs,Eigen::MatrixXf &d_inputs, Eigen::MatrixXf &d_weights, Eigen::VectorXf &d_bais) {

		d_weights = inputs.transpose()*d_outputs;
		d_inputs = d_outputs*weights.transpose();
		d_bais = d_outputs.colwise().sum();
	}
	static void CFullyconnecteLayer::test() {
		int batch_size = 4;
		int input_size = 3;
		int output_size = 2;
		Eigen::MatrixXf inputs(batch_size, input_size);
		inputs <<1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
		Eigen::MatrixXf weights(input_size, output_size);
		weights <<  0.55, 0.88, 0.75, 1.1, 0.11, 0.002;
		Eigen::VectorXf bais(output_size);
		bais << 3, 2;
		Eigen::VectorXf label(batch_size);
		label << 1, 0, 1, 1;

		

		Eigen::MatrixXf outputs;//全连接层
		forward(inputs, weights, bais, outputs);
		
		Eigen::MatrixXf d_input, d_weights,d_output;
		float loss;
		CSoftmaxLayer::softmax_loss_forward_backward(outputs, label, d_output, loss);
		std::cout << loss << std::endl;

		Eigen::VectorXf d_bais;
		backward(inputs, weights, bais, d_output, d_input, d_weights, d_bais);


		std::cout << "outputs" << outputs << std::endl;
		std::cout << "d_output" << d_output << std::endl;
		std::cout << "d_input" << d_input << std::endl;
		std::cout << "d_weights" << d_weights << std::endl;
		std::cout << "d_bais"<<d_bais << std::endl;
	}
二、tensorflow验证:

import  tensorflow as tf
inputs=tf.constant([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],shape=(4,3),dtype=tf.float32)
weights=tf.constant([0.55, 0.88, 0.75, 1.1, 0.11, 0.002],shape=(3,2),dtype=tf.float32)
bais=tf.constant([3, 2],dtype=tf.float32)
label=tf.constant([1,0,1,1])

output=tf.matmul(inputs,weights)+bais
one_hot=tf.one_hot(label,2)
predicts=tf.nn.softmax(output)
loss =-tf.reduce_mean(one_hot * tf.log(predicts))


d_output,d_inputs,d_weights,d_bais=tf.gradients(loss,[output,inputs,weights,bais])

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	loss_np,output_np,d_output_np, d_inputs_np, d_weights_np, d_bais_np=sess.run([loss,output,d_output,
	                                                                      d_inputs,d_weights,d_bais])
	print (loss_np)
	print ('output',output_np)
	print('d_output', d_output_np)
	print ("d_inputs",d_inputs_np)
	print("d_weights", d_weights_np)
	print("d_bais", d_bais_np)


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值