template <typename Dtype>
class HDF5OutputLayer : public Layer<Dtype> {
public:
- explicit HDF5OutputLayer(const LayerParameter& param);
+ explicit HDF5OutputLayer(const LayerParameter& param)
+ : Layer<Dtype>(param), file_opened_(false) {}
virtual ~HDF5OutputLayer();
virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
- const vector<Blob<Dtype>*>& top) {}
+ const vector<Blob<Dtype>*>& top);
// Data layers have no bottoms, so reshaping is trivial.
virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {}
const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
virtual void SaveBlobs();
+ bool file_opened_;
std::string file_name_;
hid_t file_id_;
Blob<Dtype> data_blob_;
namespace caffe {
template <typename Dtype>
-HDF5OutputLayer<Dtype>::HDF5OutputLayer(const LayerParameter& param)
- : Layer<Dtype>(param),
- file_name_(param.hdf5_output_param().file_name()) {
- /* create a HDF5 file */
+void HDF5OutputLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top) {
+ file_name_ = this->layer_param_.hdf5_output_param().file_name();
file_id_ = H5Fcreate(file_name_.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT,
H5P_DEFAULT);
CHECK_GE(file_id_, 0) << "Failed to open HDF5 file" << file_name_;
+ file_opened_ = true;
}
template <typename Dtype>
HDF5OutputLayer<Dtype>::~HDF5OutputLayer<Dtype>() {
- herr_t status = H5Fclose(file_id_);
- CHECK_GE(status, 0) << "Failed to close HDF5 file " << file_name_;
+ if (file_opened_) {
+ herr_t status = H5Fclose(file_id_);
+ CHECK_GE(status, 0) << "Failed to close HDF5 file " << file_name_;
+ }
}
template <typename Dtype>
// the output hdf5 file is closed.
{
HDF5OutputLayer<Dtype> layer(param);
- EXPECT_EQ(layer.file_name(), this->output_file_name_);
layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
+ EXPECT_EQ(layer.file_name(), this->output_file_name_);
layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_);
}
file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY,