需要从预制地块制作gif

时间:2019-03-18 13:10:36

标签: matplotlib machine-learning

我制作了一些图以显示S型感知器的拟合(一次输入一个),并绘制了相应的contouf图,但是很难将图转换为gif。 SimoidNueron是模型的结构。plot_sn函数创建相应的轮廓线图。最低的代码部分训练模型

class SigmoidNeuron:


  def __init__(self):
    self.w = None
    self.b = None
    self.wb=[]

  def perceptron(self, x):
    return np.dot(x, self.w.T) + self.b

  def perceptronIN(self, x,i):
    return np.dot(x, (self.wb[i][0]).T) + self.wb[i][1]

  def sigmoid(self, x):
    return 1.0 / (1.0 + np.exp(-x))

  def predict(self, X):
    yp = []
    for x in X:
      ypt=(self.sigmoid(self.perceptron(x)))
      yp.append(ypt)
    return yp

  def grad_w(self, x, y):
    y_pred = self.sigmoid(self.perceptron(x))
    return (y_pred - y) * y_pred * (1 - y_pred) * x

  def grad_b(self, x, y):
    y_pred = self.sigmoid(self.perceptron(x))
    return (y_pred - y) * y_pred * (1 - y_pred)

  def fit(self,X,Y,
        epochs=1,
        learning_rate=1,
        initialise=True,
        do_plot=False,
        ):
    if do_plot:
      loss={}


    if initialise:
      self.w = np.random.randn(1, len(X))
      self.b = 0
      self.wb.append([self.w,self.b])

    for i in range(epochs):
      dw = 0
      db = 0
      dw += self.grad_w(x, y)
      db += self.grad_b(x, y)

    self.w -= learning_rate * dw
    self.b -= learning_rate * db
    self.wb.append([self.w,self.b])
    if do_plot:
      loss[i]=mean_squared_error(self.sigmoid(self.perceptron(X)),Y)
    if do_plot:
      plt.plot(loss.values())
      plt.xlabel('Epochs')
      plt.ylabel('Error')
      plt.show()

def plot_sn(X,Y,sn,ax):
  X1=np.linspace(-10,10,100)
  X2=np.linspace(-10,10,100)
  XX1,XX2=np.meshgrid(X1,X2)
  YY=np.zeros(XX1.shape)
  for i in range(X2.size):
    for j in range(X1.size):
      YY[i,j]=sn.sigmoid(sn.perceptron(np.asarray([X1[j],X2[i]])))
  ax.contourf(XX1,XX2,YY,cmap=my_cmap,alpha=0.6)
  ax.scatter(X[:,0],X[:,1],c=Y,cmap=my_cmap)
  ax.plot()

plt.figure(figsize=(10,20*6*5))
sn.fit([2.5,2.5],1,1,5,True,False)
ci=0
for i in range(20):
  #ci=0
  for (x,y) in zip(X,Y):
    ci+=1
    ax=plt.subplot(20*6,1,ci)
    sn.fit(x,y,1,0.5,False,False)
    plot_sn(X,Y,sn,ax)

0 个答案:

没有答案