

python3でニューラルネットワークに入力したx,y座標がsinカーブよりも上の領域に位置するか、下に位置するかを学習させるためのコードを書いているところですがエラーが発生してどうにも変えても前に進めず、壁にぶち当たりました。

valueErrorが型の違いらしい？ということを調べて予想しているのですが、果たしてどうでしょうか？  
もしコードの方にも間違いがありましたら、教えて頂けたら大変嬉しいです。

[code]

    ValueError                                Traceback (most recent call last)
    <ipython-input-15-628624d42e80> in <module>()
        126     plt.plot(
    
    ValueError                                Traceback (most recent call last)
    <ipython-input-15-628624d42e80> in <module>()
        126     plt.plot(X, sin_data, linestyle="dashed")
        127     plt.scatter(x_1, y_1, marker="+")
    --> 128     plt.scatter(x_2, y_2, marker="=")
        129     plt.show()
        130 
    
    ~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, nX, sin_data, linestyle="dashed")
        127     plt.scatter(x_1, y_1, marker="+")
    --> 128     plt.scatter(x_2, y_2, marker="=")
        129     plt.show()
        130 
    
    ~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs)
       3355                          vmin=vmin, vmax=vmax, alpha=alpha,
       3356                          linewidths=linewidths, verts=verts,
    -> 3357                          edgecolors=edgecolors, data=data, **kwargs)
       3358     finally:
       3359         ax._hold = washold
    
    ~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
       1708                     warnings.warn(msg % (label_namer, func.__name__),
       1709                                   RuntimeWarning, stacklevel=2)
    -> 1710             return func(ax, *args, **kwargs)
       1711         pre_doc = inner.__doc__
       1712         if pre_doc is None:
    
    ~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
       4017         y = np.ma.ravel(y)
       4018         if x.size != y.size:
    -> 4019             raise ValueError("x and y must be the same size")
       4020 
       4021         if s is None:
    
    ValueError: x and y must be the same size
    
[/code]

**_`以下ソースコード`_**

[code]

    %matplotlib inline
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    X = np.arange(-1.0, 1.1, 0.1)
    Y = np.arange(-1.0, 1.1, 0.1)
    
    input_data = []
    correct_data = []
    for x in X:
        for y in Y:
            input_data.append([x, y])
            if y < np.sin(np.pi * x):
                correct_data.append([0, 1])
            else:
                correct_data.append([1, 0])
    
    n_data = len(correct_data)
    
    input_data = np.array(input_data)
    correct_data = np.array(correct_data)
    
    n_in = 2
    n_mid = 6
    n_out = 2
    
    wb_width = 0.01
    eta = 0.1
    epoch = 101
    interval = 10
    
    class MiddleLayer:
        def __init__(self, n_upper, n):
            self.w = wb_width * np.random.randn(n_upper, n)
            self.b = wb_width * np.random.randn(n)
    
        def forward(self, x):
            self.x = x
            u = np.dot(x, self.w) + self.b
            self.y = 1/(1+np.exp(-u))
    
        def backward(self, grad_y):
            delta = grad_y * (1-self.y)*self.y
    
            self.grad_w = np.dot(self.x.T, delta)
            self.grad_b = np.sum(delta, axis=0)
    
            self.grad_x = np.dot(delta, self.w.T)
    
        def update(self, eta):
            self.w -= eta * self.grad_w
            self.b -= eta * self.grad_b
    
    
    class OutputLayer:
        def __init__(self, n_upper, n):
            self.w = wb_width * np.random.randn(n_upper, n)
            self.b = wb_width * np.random.randn(n)
    
        def forward(self, x):
            self.x = x
            u = np.dot(x, self.w) + self.b
            self.y = np.exp(u)/np.sum(np.exp(u), axis=1, keepdims=True)
    
        def backward(self, t):
            delta = self.y - t
    
            self.grad_w = np.dot(self.x.T, delta)
            self.grad_b = np.sum(delta, axis=0)
    
            self.grad_x = np.dot(delta, self.w.T)
    
        def update(self, eta):
            self.w -= eta * self.grad_w
            self.b -= eta * self.grad_b
    
    
    middle_layer = MiddleLayer(n_in, n_mid)
    output_layer = OutputLayer(n_mid, n_out)
    
    sin_data = np.sin(np.pi * X)
    for i in range(epoch):
    
        index_random = np.arange(n_data)
        np.random.shuffle(index_random)
    
    
    total_error = 0
    x_1 = []
    y_1 = []
    x_2 = []   
    y_2 = [] 
    
    for idx in index_random:
    
        x = input_data[idx]
        t = correct_data[idx]
    
        middle_layer.forward(x.reshape(1, 2))
        output_layer.forward(middle_layer.y)
    
        output_layer.backward(t.reshape(1, 2))
        middle_layer.backward(output_layer.grad_x)
    
        middle_layer.update(eta)
        output_layer.update(eta)
    
        if i%interval == 0:
    
            y = output_layer.y.reshape(-1)
    
            total_error += np.sum(t * np.log(y + 1e-7))
    
            if y[0] > y[1]:
                x_1.append(x[0])
                y_1.append(x[1])
            else:
                x_2.append(x[0])
                x_2.append(x[1])
    
    
    if i%interval == 0:
    
        plt.plot(X, sin_data, linestyle="dashed")
        plt.scatter(x_1, y_1, marker="+")
        plt.scatter(x_2, y_2, marker="=")
        plt.show()
    
        print("Epoch:" + str(i) + "/" + str(epoch),
              "Error:" + str(total_error/n_data))
    
[/code]


CC BY-SA 4.0
2019-02-08T07:07:39.057
52640
2019-02-08T07:27:32.093
2019-02-08T07:13:47.800
32100
32100
question
python matplotlib numpy anaconda
ニューラルネットワークに入力したx,y座標がsinカーブよりも上の領域に位置するか、下に位置するかを学習させたい


`x_2` と `y_2` のサイズが異なることが原因です（ `print(len(x_2), len(y_2))` と実行すると、それぞれ460,
0と表示されます）。おそらく、以下の部分で誤記しているようです。

[code]

    if y[0] > y[1]:
        x_1.append(x[0])
        y_1.append(x[1])
    else:
        x_2.append(x[0])
        x_2.append(x[1]) # <- y_2.append では？
    
[/code]


CC BY-SA 4.0
2019-02-08T07:27:32.093
52641
2019-02-08T07:27:32.093
29826
52640
answer