1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import Neuronet
import System.Random(randomRIO)
import Numeric.LinearAlgebra (Matrix,Vector,tr,scale,cmap,(#>),randn,toList,fromList,toLists,fromLists,Container)
import Data.List
main = do
let numtrain=300000
easynet<-neuronet [20,15,10]
samples<-filter ((<10).uncurry (+)) <$> gensamp numtrain
let testsmp=filter ((<10).uncurry (+))[(a,b)|a<-[0..10],b<-[0..10]]
let trained=foldl' training easynet samples
let res = map (\(a,b)->test trained (a,b) == a+b) testsmp
let right=length $ filter (id) res
let all = length res
print $ "trained adding up to 10 with "++ show numtrain ++" random training samples"
print $ "correct answers during testing: " ++ show right ++ "/" ++ show all ++ " (" ++ show (right*100`div`all) ++ "%)"
print "what can I add for you?"
str<-lines<$>getContents
mapM_ (addit trained) str
where zrs= take 9 $ repeat 0.01
val x= take x zrs ++ [0.99] ++ drop x zrs
getVal x=snd . last . sort $ zip x [0..9]
training net (s1,s2) = train 0.25 net (fromList $ val s1++val s2) (fromList $ val $ s1+s2)
test net (s1,s2) = getVal . toList $ asknet net (fromList $ val s1++val s2)
gensamp :: Int -> IO [(Int,Int)]
gensamp 0 = return []
gensamp n = (\a b r->(a,b):r) <$> randomRIO (0,9) <*> randomRIO (0,9) <*> gensamp (n-1)
addit n x= do let w=words x
let a=read $ w!!0 :: Int
let b=read $ w!!1 :: Int
putStrLn $ "I try to add " ++ show a ++ " and " ++ show b
putStrLn $ "I think this is = " ++ show (test n (a,b) )
putStrLn "what two numbers do you want me to add master?"
{-
train_img="train-images-idx3-ubyte"
train_lbl="train-labels-idx1-ubyte"
sel=3333
main1 = do
h <- openFile train_img ReadMode
h2 <- openFile train_lbl ReadMode
BS.hGetContents h>>= showImg . BS.take (28*28) . BS.drop (28*28*sel) . BS.drop 16
BS.hGetContents h2>>= print. BS.unpack . BS.take 1 . BS.drop (sel) . BS.drop 8
showImg a | BS.null a = print "--"
| otherwise = do mapM_ putVal $ BS.unpack $ BS.take 28 a
putStr "\n"
showImg $ BS.drop 28 a
putVal v | v==0 = putStr " "
| v<50 = putStr "."
| v<128 = putStr "o"
| v<160 = putStr "O"
| otherwise = putStr "0"
main2 = do
-- 0 1 2 3 4 5 6 7 8 9
let m=(4><10)[ 0, 100,0, 100,0, 100,0, 100,0, 100
,0, 0, 100,100,0, 0, 100,100,0, 0
,0, 0, 0, 0, 100,100,100,100,0, 0
,0, 0, 0, 0, 0, 0, 0, 0, 100,100]
let b=vector . take 4 . repeat $ (-50)
let z= repeat 0.01
let vv x= vector $ take x z ++ [0.99] ++ take (9-x) z
let v = vv 6
let z= m #> v + b
let a= cmap sigmoid z
print m
print v
print z
print a
-}
|