Skip to content

Commit 35f44f2

Browse files
authored
drhuffman12/add_team_utils_part_8_redo (#65)
* drhuffman12/add_team_utils_part_8_redo pull some changes from 'drhuffman12/add_team_utils_part_8' branch and adjust/pend tests to get them to pass * drhuffman12/add_team_utils_part_8_redo fix typo
1 parent 9f41353 commit 35f44f2

35 files changed

+1198
-352
lines changed

README.md

+7-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,13 @@ e.g.: `time crystal spec --release`
5656

5757
Use the `-Dpreview_mt` (for `crystal build` or `-D preview_mt` for `crystal spec`) flag for multithreading.
5858

59-
e.g.: `time CRYSTAL_WORKERS=14 crystal spec spec_bench/ai4cr/neural_network/rnn/rnn_simple_manager_spec.cr --release -D preview_mt`
60-
e.g.: `time CRYSTAL_WORKERS=24 crystal spec spec_bench/ai4cr/neural_network/rnn/rnn_simple_manager_spec.cr --release -D preview_mt > tmp/log.txt 2>&1`
59+
e.g.:
60+
```
61+
# build:
62+
time CRYSTAL_WORKERS=14 crystal build examples/rnn_simple_manager_example_relu.cr --release -D preview_mt
63+
# run (and log to tmp folder):
64+
time CRYSTAL_WORKERS=24 ./rnn_simple_manager_example_relu > tmp/log_relu.txt 2>&1
65+
```
6166

6267
(Personally, as for how many `CRYSTAL_WORKERS`, I'd recommend keep it to less than the number of cores in your CPU, so that you leave at least one or two cores for the OS and apps.)
6368

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
require "json"
2+
# struct Float64
3+
# include ::JSON::Serializable
4+
# end
5+
6+
# Test what max values can be to/from-jsonified
7+
(0..309).each do |exp|
8+
puts "*"*20
9+
p! exp
10+
f = 0.0
11+
p!(f = 10.0**(-exp))
12+
p! f
13+
j = f.to_json
14+
p! j
15+
f2 = Float64.from_json(j)
16+
p! f2
17+
end
18+
19+
# This outputs:
20+
# ...
21+
# ********************
22+
# exp # => 307
23+
# f = 10.0 ** (-exp) # => 9.999999999999995e-308
24+
# f # => 9.999999999999995e-308
25+
# j # => "9.999999999999995e-308"
26+
# f2 # => 9.999999999999991e-308
27+
# ********************
28+
# exp # => 308
29+
# f = 10.0 ** (-exp) # => 9.999999999999994e-309
30+
# f # => 9.999999999999994e-309
31+
# j # => "9.999999999999994e-309"
32+
# f2 # => 0.0
33+
# ********************
34+
# exp # => 309
35+
# f = 10.0 ** (-exp) # => 0.0
36+
# f # => 0.0
37+
# j # => "0.0"
38+
# f2 # => 0.0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
require "json"
2+
# struct Float64
3+
# include ::JSON::Serializable
4+
# end
5+
6+
# Test what max values can be to/from-jsonified
7+
(0..309).each do |exp|
8+
puts "*"*20
9+
p! exp
10+
f = 0.0
11+
p!(f = 10.0**(exp))
12+
p! f
13+
j = f.to_json
14+
p! j
15+
f2 = Float64.from_json(j)
16+
p! f2
17+
end
18+
19+
# This outputs:
20+
# ...
21+
# ********************
22+
# exp # => 308
23+
# f = 10.0 ** (exp) # => 1.0000000000000006e+308
24+
# f # => 1.0000000000000006e+308
25+
# j # => "1.0000000000000006e+308"
26+
# f2 # => 1.0000000000000012e+308
27+
# ********************
28+
# exp # => 309
29+
# f = 10.0 ** (exp) # => Infinity
30+
# f # => Infinity
31+
# Unhandled exception: Infinity not allowed in JSON (JSON::Error)
32+
# from /usr/share/crystal/src/json/builder.cr:92:9 in 'number'
33+
# from /usr/share/crystal/src/json/to_json.cr:55:5 in 'to_json'
34+
# from /usr/share/crystal/src/json/to_json.cr:10:7 in 'to_json'
35+
# from /usr/share/crystal/src/json/to_json.cr:4:7 in 'to_json'
36+
# from examples/json_float_huge.cr:13:7 in '__crystal_main'
37+
# from /usr/share/crystal/src/crystal/main.cr:110:5 in 'main_user_code'
38+
# from /usr/share/crystal/src/crystal/main.cr:96:7 in 'main'
39+
# from /usr/share/crystal/src/crystal/main.cr:119:3 in 'main'
40+
# from __libc_start_main
41+
# from _start
42+
# from ???
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require "json"
2+
3+
puts "*"*20
4+
f = 0.0
5+
p!(f = Float64::NAN)
6+
p! f
7+
j = f.to_json
8+
p! j
9+
f2 = Float64.from_json(j)
10+
p! f2
11+
12+
# This outputs:
13+
# ...
14+
# ********************
15+
# f = Float64::NAN # => NaN
16+
# f # => NaN
17+
# Unhandled exception: NaN not allowed in JSON (JSON::Error)
18+
# from /usr/share/crystal/src/json/builder.cr:90:9 in 'number'
19+
# from /usr/share/crystal/src/json/to_json.cr:55:5 in 'to_json'
20+
# from /usr/share/crystal/src/json/to_json.cr:10:7 in 'to_json'
21+
# from /usr/share/crystal/src/json/to_json.cr:4:7 in 'to_json'
22+
# from examples/json_float_nan.cr:7:7 in '__crystal_main'
23+
# from /usr/share/crystal/src/crystal/main.cr:110:5 in 'main_user_code'
24+
# from /usr/share/crystal/src/crystal/main.cr:96:7 in 'main'
25+
# from /usr/share/crystal/src/crystal/main.cr:119:3 in 'main'
26+
# from __libc_start_main
27+
# from _start
28+
# from ???

examples/rnn_simple_manager_example.cr renamed to examples/rnn_simple_manager_example_relu.cr

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class Runner
3939
input_size: inputs_sequence.first.first.size,
4040
output_size: outputs_sequence.first.first.size,
4141
hidden_layer_qty: hidden_layer_qty,
42-
hidden_size_given: hidden_size_given
42+
hidden_size_given: hidden_size_given,
43+
learning_styles: [Ai4cr::NeuralNetwork::LS_RELU]
4344
).config
4445

4546
puts "inputs_sequence.size: #{inputs_sequence.size}"
@@ -113,21 +114,20 @@ io_set_text_file = Ai4cr::Utils::IoData::TextFileIodBits.new(
113114
)
114115

115116
# re 'compare_successive_training_rounds'
116-
time_col_qty = 6 # 25
117+
time_col_qty = 16 # 12 # 10 # 6 # 25
118+
hidden_layer_qty = 3 # 4 # 6 # 3
119+
hidden_size_given = 8 # 16 # 100 # 200
120+
max_members = 10 # 5 # 10
121+
train_qty = 3 # 1 # 2
122+
117123
io_offset = time_col_qty
118124
ios = io_set_text_file.iod_to_io_set_with_offset_time_cols(time_col_qty, io_offset)
119125

120126
inputs_sequence = ios[:input_set]
121127
outputs_sequence = ios[:output_set]
122128

123-
hidden_layer_qty = 3
124-
hidden_size_given = 100 # 100 # 200
125-
126-
max_members = 10
127129
qty_new_members = max_members
128130

129-
train_qty = 2
130-
131131
puts
132132
puts "*"*40
133133
puts "my_breed_manager: #{my_breed_manager}"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
# Run via: `time CRYSTAL_WORKERS=24 crystal run examples/rnn_simple_manager_example.cr -Dpreview_mt --release > tmp/log.txt`
2+
# (Adjust the 'CRYSTAL_WORKERS=24' as desired.)
3+
# Follow `tmp/log.txt' in your IDE or in console (i.e.: `tail -f tmp/log.txt`)
4+
# Be on the look out for high `percent_correct: x of x` in the 'tmp/log.txt file'
5+
# Monitor your Ram and CPU usage!
6+
# (This seems to stablize at around about 4 Gb and 1/3 of my system's AMD Ryzen 7 1700X CPU.)
7+
# NOTE: Training results look promising, but tend to be more successful towards the 'more future' side of the outputs.
8+
# So, implement bi-directional RNN in the next phase, in hopes of balancing out the successfulness of the
9+
# 'less future' vs 'more future' guesses.
10+
11+
require "./../src/ai4cr"
12+
13+
class Runner
14+
getter file_path : String
15+
16+
def initialize(@file_path)
17+
end
18+
19+
def compare_successive_training_rounds(
20+
io_offset, time_col_qty,
21+
inputs_sequence, outputs_sequence,
22+
hidden_layer_qty, hidden_size_given,
23+
qty_new_members,
24+
my_breed_manager, max_members,
25+
train_qty,
26+
io_set_text_file
27+
)
28+
puts
29+
puts "v"*40
30+
puts "successive generations (should) score better (?) .. max_members: #{max_members} .. start"
31+
when_before = Time.local
32+
puts "when_before: #{when_before}"
33+
puts "file_path: #{file_path}"
34+
puts
35+
36+
params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new(
37+
io_offset: io_offset,
38+
time_col_qty: time_col_qty,
39+
input_size: inputs_sequence.first.first.size,
40+
output_size: outputs_sequence.first.first.size,
41+
hidden_layer_qty: hidden_layer_qty,
42+
hidden_size_given: hidden_size_given,
43+
learning_styles: [Ai4cr::NeuralNetwork::LS_RELU, Ai4cr::NeuralNetwork::LS_SIGMOID]
44+
).config
45+
46+
puts "inputs_sequence.size: #{inputs_sequence.size}"
47+
puts "inputs_sequence.first.size: #{inputs_sequence.first.size}"
48+
puts "inputs_sequence.first.first.size: #{inputs_sequence.first.first.size}"
49+
puts "inputs_sequence.class: #{inputs_sequence.class}"
50+
puts "outputs_sequence.class: #{outputs_sequence.class}"
51+
puts "params: #{params}"
52+
53+
puts "* build/train teams"
54+
puts "\n * first_gen_members (building)..."
55+
first_gen_members = my_breed_manager.build_team(qty_new_members, **params)
56+
puts "\n * second_gen_members (breeding and training; after training first_gen_members)..."
57+
second_gen_members = my_breed_manager.train_team_using_sequence(inputs_sequence, outputs_sequence, first_gen_members, io_set_text_file, max_members, train_qty) # , block_logger: train_team_using_sequence_logger)
58+
puts "\n * third_gen_members (breeding and training; after training second_gen_members) ..."
59+
third_gen_members = my_breed_manager.train_team_using_sequence(inputs_sequence, outputs_sequence, second_gen_members, io_set_text_file, max_members, train_qty) # , block_logger: train_team_using_sequence_logger)
60+
61+
puts "* score and stats ..."
62+
p "."
63+
first_gen_members_scored = first_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
64+
first_gen_members_stats = first_gen_members.map { |member| member.error_hist_stats }
65+
66+
p "."
67+
second_gen_members_scored = second_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
68+
second_gen_members_stats = second_gen_members.map { |member| member.error_hist_stats }
69+
70+
p "."
71+
third_gen_members_scored = third_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
72+
third_gen_members_stats = third_gen_members.map { |member| member.error_hist_stats }
73+
74+
puts
75+
puts "#train_team_using_sequence (text from Bible):"
76+
puts
77+
puts "first_gen_members_scored: #{first_gen_members_scored}"
78+
first_gen_members_stats.each { |m| puts m }
79+
80+
puts
81+
puts "second_gen_members_scored: #{second_gen_members_scored}"
82+
second_gen_members_stats.each { |m| puts m }
83+
84+
puts
85+
puts "third_gen_members_scored: #{third_gen_members_scored}"
86+
third_gen_members_stats.each { |m| puts m }
87+
88+
when_after = Time.local
89+
puts "when_after: #{when_after}"
90+
when_delta = when_after - when_before
91+
puts "when_delta: #{(when_delta.total_seconds / 60.0).round(1)} minutes
92+
"
93+
puts
94+
puts "successive generations score better (?) .. max_members: #{max_members} .. end"
95+
puts "-"*40
96+
puts
97+
end
98+
end
99+
100+
####
101+
102+
my_breed_manager = Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager.new
103+
104+
file_path = "./spec_bench/support/neural_network/data/bible_utf/eng-web_002_GEN_01_read.txt"
105+
file_type_raw = Ai4cr::Utils::IoData::FileType::Raw
106+
prefix_raw_qty = 0
107+
prefix_raw_char = " "
108+
default_to_bit_size = 8
109+
110+
io_set_text_file = Ai4cr::Utils::IoData::TextFileIodBits.new(
111+
file_path, file_type_raw,
112+
prefix_raw_qty, prefix_raw_char,
113+
default_to_bit_size
114+
)
115+
116+
# re 'compare_successive_training_rounds'
117+
time_col_qty = 16 # 12 # 10 # 6 # 25
118+
hidden_layer_qty = 3 # 4 # 6 # 3
119+
hidden_size_given = 32 # 16 # 100 # 200
120+
max_members = 10 # 5 # 10
121+
train_qty = 3 # 1 # 2
122+
123+
io_offset = time_col_qty
124+
ios = io_set_text_file.iod_to_io_set_with_offset_time_cols(time_col_qty, io_offset)
125+
126+
inputs_sequence = ios[:input_set]
127+
outputs_sequence = ios[:output_set]
128+
qty_new_members = max_members
129+
130+
puts
131+
puts "*"*40
132+
puts "my_breed_manager: #{my_breed_manager}"
133+
puts "io_set_text_file: #{io_set_text_file}"
134+
puts "v"*40
135+
puts "io_set_text_file.raw: #{io_set_text_file.raw}"
136+
puts "^"*40
137+
puts
138+
puts "io_set_text_file.raw.size: #{io_set_text_file.raw.size}"
139+
puts "io_set_text_file.raw.size: #{io_set_text_file.raw.class}"
140+
puts
141+
puts "io_set_text_file.iod.size: #{io_set_text_file.iod.size}"
142+
puts "io_set_text_file.iod.class: #{io_set_text_file.iod.class}"
143+
puts "io_set_text_file.iod.first.size: #{io_set_text_file.iod.first.size}"
144+
puts "io_set_text_file.iod.first.class: #{io_set_text_file.iod.first.class}"
145+
puts "io_set_text_file.iod.first.first.class: #{io_set_text_file.iod.first.first.class}"
146+
147+
puts "-"*40
148+
puts
149+
150+
r = Runner.new(file_path)
151+
152+
r.compare_successive_training_rounds(
153+
io_offset, time_col_qty,
154+
inputs_sequence, outputs_sequence,
155+
hidden_layer_qty, hidden_size_given,
156+
qty_new_members,
157+
my_breed_manager, max_members,
158+
train_qty,
159+
io_set_text_file
160+
)
161+
162+
r.compare_successive_training_rounds(
163+
io_offset, time_col_qty,
164+
inputs_sequence, outputs_sequence,
165+
hidden_layer_qty, hidden_size_given,
166+
qty_new_members,
167+
my_breed_manager, max_members,
168+
train_qty,
169+
io_set_text_file
170+
)

0 commit comments

Comments
 (0)