Browse Source

skip layer wihtout trainable weights when save_weights.

tags/yolov3
Oceania2018 4 years ago
parent
commit
9ff09c4f3d
4 changed files with 47 additions and 51 deletions
  1. +12
    -12
      src/TensorFlowNET.Core/Operations/NnOps/gen_nn_ops.cs
  2. +3
    -6
      src/TensorFlowNET.Core/Operations/nn_impl.py.cs
  3. +7
    -4
      src/TensorFlowNET.Core/Variables/BaseResourceVariable.cs
  4. +25
    -29
      src/TensorFlowNET.Keras/Saving/hdf5_format.cs

+ 12
- 12
src/TensorFlowNET.Core/Operations/NnOps/gen_nn_ops.cs View File

@@ -318,16 +318,16 @@ namespace Tensorflow.Operations
return _op.outputs; return _op.outputs;
} }


public static Tensor[] fused_batch_norm_v3(Tensor x,
Tensor scale,
Tensor offset,
IVariableV1 mean,
IVariableV1 variance,
float epsilon = 0.0001f,
float exponential_avg_factor = 1.0f,
string data_format = "NHWC",
bool is_training = true,
string name = null)
public static Tensors fused_batch_norm_v3(Tensor x,
IVariableV1 scale,
IVariableV1 offset,
IVariableV1 mean,
IVariableV1 variance,
float epsilon = 0.0001f,
float exponential_avg_factor = 1.0f,
string data_format = "NHWC",
bool is_training = true,
string name = null)
{ {
if (tf.executing_eagerly()) if (tf.executing_eagerly())
{ {
@@ -337,8 +337,8 @@ namespace Tensorflow.Operations
x, x,
scale, scale,
offset, offset,
mean.AsTensor(),
variance.AsTensor(),
mean,
variance,
"epsilon", epsilon, "epsilon", epsilon,
"exponential_avg_factor", exponential_avg_factor, "exponential_avg_factor", exponential_avg_factor,
"data_format", data_format, "data_format", data_format,


+ 3
- 6
src/TensorFlowNET.Core/Operations/nn_impl.py.cs View File

@@ -107,9 +107,6 @@ namespace Tensorflow
string name = null, string name = null,
float exponential_avg_factor = 1.0f) float exponential_avg_factor = 1.0f)
{ {
x = ops.convert_to_tensor(x, name: "input");
var scale_tensor = ops.convert_to_tensor(scale, name: "scale");
var offset_tensor = ops.convert_to_tensor(offset, name: "offset");
/*if (mean == null) /*if (mean == null)
mean = constant_op.constant(new float[0]); mean = constant_op.constant(new float[0]);
if (variance == null) if (variance == null)
@@ -118,11 +115,11 @@ namespace Tensorflow
epsilon = epsilon > min_epsilon ? epsilon : min_epsilon; epsilon = epsilon > min_epsilon ? epsilon : min_epsilon;


var results = gen_nn_ops.fused_batch_norm_v3(x, var results = gen_nn_ops.fused_batch_norm_v3(x,
scale_tensor,
offset_tensor,
scale,
offset,
mean, mean,
variance, variance,
epsilon,
epsilon: epsilon,
exponential_avg_factor: exponential_avg_factor, exponential_avg_factor: exponential_avg_factor,
data_format: data_format, data_format: data_format,
is_training: is_training, is_training: is_training,


+ 7
- 4
src/TensorFlowNET.Core/Variables/BaseResourceVariable.cs View File

@@ -163,11 +163,14 @@ namespace Tensorflow
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected Tensor read_value() protected Tensor read_value()
=> tf_with(ops.name_scope("Read"), delegate
{
var value = _read_variable_op();
return array_ops.identity(value);
{
var value = tf_with(ops.name_scope("Read"), delegate
{
return _read_variable_op();
}); });
return array_ops.identity(value);
}


public Tensor assign_add<T>(T delta, bool use_locking = false, string name = null, bool read_value = true) public Tensor assign_add<T>(T delta, bool use_locking = false, string name = null, bool read_value = true)
{ {


+ 25
- 29
src/TensorFlowNET.Keras/Saving/hdf5_format.cs View File

@@ -101,26 +101,28 @@ namespace Tensorflow.Keras.Saving
if (success) if (success)
original_backend = attr.First(); original_backend = attr.First();
} }
List<ILayer> filtered_layers = new List<ILayer>();
List<IVariableV1> weights;
var filtered_layers = new List<ILayer>();
foreach (var layer in layers) foreach (var layer in layers)
{ {
weights = _legacy_weights(layer);
var weights = _legacy_weights(layer);
if (weights.Count > 0) if (weights.Count > 0)
{
filtered_layers.append(layer); filtered_layers.append(layer);
}
} }

string[] layer_names = load_attributes_from_hdf5_group(f, "layer_names"); string[] layer_names = load_attributes_from_hdf5_group(f, "layer_names");
var filtered_layer_names = new List<string>(); var filtered_layer_names = new List<string>();
foreach(var name in layer_names) foreach(var name in layer_names)
{ {
if (!filtered_layers.Select(x => x.Name).Contains(name))
continue;
long g = H5G.open(f, name); long g = H5G.open(f, name);
var weight_names = load_attributes_from_hdf5_group(g, "weight_names"); var weight_names = load_attributes_from_hdf5_group(g, "weight_names");
if (weight_names.Count() > 0) if (weight_names.Count() > 0)
filtered_layer_names.Add(name); filtered_layer_names.Add(name);
H5G.close(g); H5G.close(g);
} }

layer_names = filtered_layer_names.ToArray(); layer_names = filtered_layer_names.ToArray();
if (layer_names.Length != filtered_layers.Count()) if (layer_names.Length != filtered_layers.Count())
throw new ValueError("You are trying to load a weight file " + throw new ValueError("You are trying to load a weight file " +
@@ -133,7 +135,6 @@ namespace Tensorflow.Keras.Saving
var weight_values = new List<NDArray>(); var weight_values = new List<NDArray>();
long g = H5G.open(f, name); long g = H5G.open(f, name);
var weight_names = load_attributes_from_hdf5_group(g, "weight_names"); var weight_names = load_attributes_from_hdf5_group(g, "weight_names");
var get_Name = "";
foreach (var i_ in weight_names) foreach (var i_ in weight_names)
{ {
(bool success, Array result) = Hdf5.ReadDataset<float>(g, i_); (bool success, Array result) = Hdf5.ReadDataset<float>(g, i_);
@@ -153,6 +154,7 @@ namespace Tensorflow.Keras.Saving
$"{weight_values.Count()} elements."); $"{weight_values.Count()} elements.");
weight_value_tuples.AddRange(zip(symbolic_weights, weight_values)); weight_value_tuples.AddRange(zip(symbolic_weights, weight_values));
} }

keras.backend.batch_set_value(weight_value_tuples); keras.backend.batch_set_value(weight_value_tuples);
} }
public static void toarrayf4(long filepath = -1, Dictionary<string, object> custom_objects = null, bool compile = false) public static void toarrayf4(long filepath = -1, Dictionary<string, object> custom_objects = null, bool compile = false)
@@ -175,43 +177,37 @@ namespace Tensorflow.Keras.Saving
Hdf5.WriteAttribute(f, "keras_version", "2.5.0"); Hdf5.WriteAttribute(f, "keras_version", "2.5.0");


long g = 0, crDataGroup=0; long g = 0, crDataGroup=0;
List<IVariableV1> weights = new List<IVariableV1>();
//List<IVariableV1> weight_values = new List<IVariableV1>();
List<string> weight_names = new List<string>();
foreach (var layer in layers) {
weight_names = new List<string>();
g = Hdf5.CreateOrOpenGroup(f, Hdf5Utils.NormalizedName(layer.Name));
weights = _legacy_weights(layer);
//weight_values= keras.backend.batch_get_value(weights);
foreach (var layer in layers)
{
var weights = _legacy_weights(layer);
if (weights.Count == 0)
continue;
var weight_names = new List<string>();
// weight_values= keras.backend.batch_get_value(weights);
foreach (var weight in weights) foreach (var weight in weights)
{
weight_names.Add(weight.Name); weight_names.Add(weight.Name);
}
g = Hdf5.CreateOrOpenGroup(f, Hdf5Utils.NormalizedName(layer.Name));
save_attributes_to_hdf5_group(g, "weight_names", weight_names.ToArray()); save_attributes_to_hdf5_group(g, "weight_names", weight_names.ToArray());
Tensor tensor = null;
foreach (var (name, val) in zip(weight_names, weights)) {
tensor = val.AsTensor();
foreach (var (name, val) in zip(weight_names, weights))
{
var tensor = val.AsTensor();
if (name.IndexOf("/") > 1) if (name.IndexOf("/") > 1)
{ {
crDataGroup = Hdf5.CreateOrOpenGroup(g, Hdf5Utils.NormalizedName(name.Split('/')[0])); crDataGroup = Hdf5.CreateOrOpenGroup(g, Hdf5Utils.NormalizedName(name.Split('/')[0]));
WriteDataset(crDataGroup, name.Split('/')[1], tensor); WriteDataset(crDataGroup, name.Split('/')[1], tensor);
Hdf5.CloseGroup(crDataGroup); Hdf5.CloseGroup(crDataGroup);
} }
else {
else
{
WriteDataset(crDataGroup, name, tensor); WriteDataset(crDataGroup, name, tensor);
} }
tensor = null;
}
}
Hdf5.CloseGroup(g); Hdf5.CloseGroup(g);
weight_names = null;
} }
weights = null;
// weight_values = null;

} }

private static void save_attributes_to_hdf5_group(long f,string name ,Array data) private static void save_attributes_to_hdf5_group(long f,string name ,Array data)
{ {
int num_chunks = 1; int num_chunks = 1;


Loading…
Cancel
Save